{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.ttSPEhFB/b1/dune-common_2.9.0-8_amd64.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.ttSPEhFB/b2/dune-common_2.9.0-8_amd64.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,4 +1,4 @@\n \n a4d7bba2e5206c664ed0a06d6ae6952c 517828 debug optional libdune-common-dev-dbgsym_2.9.0-8_amd64.deb\n 6b0a315733d0715aaa3065cd801973cd 381176 libdevel optional libdune-common-dev_2.9.0-8_amd64.deb\n- 74844fa433bd28111e05485f792002c1 3063160 doc optional libdune-common-doc_2.9.0-8_all.deb\n+ 0a8ac6bd06bd286f91b502a2681453ea 3068232 doc optional libdune-common-doc_2.9.0-8_all.deb\n"}, {"source1": "libdune-common-doc_2.9.0-8_all.deb", "source2": "libdune-common-doc_2.9.0-8_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-07 15:59:08.000000 debian-binary\n--rw-r--r-- 0 0 0 26896 2024-11-07 15:59:08.000000 control.tar.xz\n--rw-r--r-- 0 0 0 3036072 2024-11-07 15:59:08.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 26868 2024-11-07 15:59:08.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 3041172 2024-11-07 15:59:08.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": "./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": "@@ -26,40 +26,39 @@\n usr/share/doc/libdune-common-doc/doxygen/a00011_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00014.html\n usr/share/doc/libdune-common-doc/doxygen/a00014_source.html\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/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@@ -78,16 +77,17 @@\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/a00098_source.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/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@@ -116,39 +116,40 @@\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 usr/share/doc/libdune-common-doc/doxygen/a00161_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00164.html\n usr/share/doc/libdune-common-doc/doxygen/a00164_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00167.html\n+usr/share/doc/libdune-common-doc/doxygen/a00167_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00170.html\n usr/share/doc/libdune-common-doc/doxygen/a00170_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00173.html\n usr/share/doc/libdune-common-doc/doxygen/a00173_source.html\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 usr/share/doc/libdune-common-doc/doxygen/a00197_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00200.html\n usr/share/doc/libdune-common-doc/doxygen/a00200_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00203.html\n usr/share/doc/libdune-common-doc/doxygen/a00203_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00206.html\n+usr/share/doc/libdune-common-doc/doxygen/a00206_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00209.html\n usr/share/doc/libdune-common-doc/doxygen/a00209_source.html\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@@ -164,34 +165,33 @@\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@@ -201,24 +201,25 @@\n usr/share/doc/libdune-common-doc/doxygen/a00290.html\n usr/share/doc/libdune-common-doc/doxygen/a00290_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00293.html\n usr/share/doc/libdune-common-doc/doxygen/a00293_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00296.html\n usr/share/doc/libdune-common-doc/doxygen/a00296_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00299.html\n-usr/share/doc/libdune-common-doc/doxygen/a00299_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00302.html\n+usr/share/doc/libdune-common-doc/doxygen/a00302_source.html\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/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@@ -234,15 +235,14 @@\n usr/share/doc/libdune-common-doc/doxygen/a00344.html\n usr/share/doc/libdune-common-doc/doxygen/a00344_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00347.html\n usr/share/doc/libdune-common-doc/doxygen/a00347_source.html\n usr/share/doc/libdune-common-doc/doxygen/a00350.html\n usr/share/doc/libdune-common-doc/doxygen/a00350_source.html\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"}]}]}]}, {"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,259 +26,259 @@\n -rw-r--r-- 0 root (0) root (0) 2825 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/search.html\n -rw-r--r-- 0 root (0) root (0) 10550 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/searchindex.js\n -rw-r--r-- 0 root (0) root (0) 2092 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/changelog.Debian.gz\n -rw-r--r-- 0 root (0) root (0) 7231 2022-10-20 18:41: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-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/\n -rw-r--r-- 0 root (0) root (0) 3045 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00002.html\n--rw-r--r-- 0 root (0) root (0) 5654 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html\n--rw-r--r-- 0 root (0) root (0) 7234 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html\n--rw-r--r-- 0 root (0) root (0) 5275 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html\n--rw-r--r-- 0 root (0) root (0) 11331 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html\n--rw-r--r-- 0 root (0) root (0) 8690 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html\n--rw-r--r-- 0 root (0) root (0) 15576 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html\n--rw-r--r-- 0 root (0) root (0) 21252 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html\n--rw-r--r-- 0 root (0) root (0) 132735 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html\n--rw-r--r-- 0 root (0) root (0) 3899 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html\n--rw-r--r-- 0 root (0) root (0) 4128 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html\n--rw-r--r-- 0 root (0) root (0) 11654 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html\n--rw-r--r-- 0 root (0) root (0) 55191 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html\n--rw-r--r-- 0 root (0) root (0) 14770 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html\n--rw-r--r-- 0 root (0) root (0) 23217 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html\n--rw-r--r-- 0 root (0) root (0) 6176 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html\n--rw-r--r-- 0 root (0) root (0) 8812 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html\n--rw-r--r-- 0 root (0) root (0) 8196 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html\n--rw-r--r-- 0 root (0) root (0) 148986 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html\n--rw-r--r-- 0 root (0) root (0) 4125 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html\n--rw-r--r-- 0 root (0) root (0) 5356 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html\n--rw-r--r-- 0 root (0) root (0) 41539 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html\n--rw-r--r-- 0 root (0) root (0) 5125 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html\n--rw-r--r-- 0 root (0) root (0) 29707 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html\n--rw-r--r-- 0 root (0) root (0) 8704 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html\n--rw-r--r-- 0 root (0) root (0) 26496 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html\n--rw-r--r-- 0 root (0) root (0) 6585 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html\n--rw-r--r-- 0 root (0) root (0) 46321 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html\n--rw-r--r-- 0 root (0) root (0) 6612 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html\n--rw-r--r-- 0 root (0) root (0) 19861 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html\n--rw-r--r-- 0 root (0) root (0) 7592 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html\n--rw-r--r-- 0 root (0) root (0) 136353 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html\n--rw-r--r-- 0 root (0) root (0) 5638 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html\n--rw-r--r-- 0 root (0) root (0) 33611 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html\n--rw-r--r-- 0 root (0) root (0) 3658 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html\n--rw-r--r-- 0 root (0) root (0) 4980 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html\n--rw-r--r-- 0 root (0) root (0) 23075 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html\n--rw-r--r-- 0 root (0) root (0) 5984 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html\n--rw-r--r-- 0 root (0) root (0) 51317 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html\n--rw-r--r-- 0 root (0) root (0) 13149 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html\n--rw-r--r-- 0 root (0) root (0) 178064 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html\n--rw-r--r-- 0 root (0) root (0) 11420 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html\n--rw-r--r-- 0 root (0) root (0) 290483 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html\n--rw-r--r-- 0 root (0) root (0) 7409 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html\n--rw-r--r-- 0 root (0) root (0) 33439 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html\n--rw-r--r-- 0 root (0) root (0) 9141 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html\n--rw-r--r-- 0 root (0) root (0) 172723 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html\n--rw-r--r-- 0 root (0) root (0) 6398 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html\n--rw-r--r-- 0 root (0) root (0) 33437 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html\n--rw-r--r-- 0 root (0) root (0) 9019 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html\n--rw-r--r-- 0 root (0) root (0) 52516 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html\n--rw-r--r-- 0 root (0) root (0) 6505 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html\n--rw-r--r-- 0 root (0) root (0) 39913 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html\n--rw-r--r-- 0 root (0) root (0) 6616 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html\n--rw-r--r-- 0 root (0) root (0) 58092 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html\n--rw-r--r-- 0 root (0) root (0) 8766 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html\n--rw-r--r-- 0 root (0) root (0) 71932 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html\n--rw-r--r-- 0 root (0) root (0) 8399 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html\n--rw-r--r-- 0 root (0) root (0) 46563 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html\n--rw-r--r-- 0 root (0) root (0) 3649 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html\n--rw-r--r-- 0 root (0) root (0) 4983 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html\n--rw-r--r-- 0 root (0) root (0) 11616 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html\n--rw-r--r-- 0 root (0) root (0) 101374 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html\n--rw-r--r-- 0 root (0) root (0) 19865 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html\n--rw-r--r-- 0 root (0) root (0) 179606 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html\n--rw-r--r-- 0 root (0) root (0) 5278 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html\n--rw-r--r-- 0 root (0) root (0) 22235 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html\n--rw-r--r-- 0 root (0) root (0) 45125 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html\n--rw-r--r-- 0 root (0) root (0) 15704 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html\n--rw-r--r-- 0 root (0) root (0) 5214 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html\n--rw-r--r-- 0 root (0) root (0) 15233 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html\n--rw-r--r-- 0 root (0) root (0) 7783 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html\n--rw-r--r-- 0 root (0) root (0) 12397 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html\n--rw-r--r-- 0 root (0) root (0) 17902 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html\n--rw-r--r-- 0 root (0) root (0) 167223 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html\n--rw-r--r-- 0 root (0) root (0) 6384 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html\n--rw-r--r-- 0 root (0) root (0) 16097 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html\n--rw-r--r-- 0 root (0) root (0) 26419 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html\n--rw-r--r-- 0 root (0) root (0) 61788 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html\n--rw-r--r-- 0 root (0) root (0) 20821 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html\n--rw-r--r-- 0 root (0) root (0) 29928 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html\n--rw-r--r-- 0 root (0) root (0) 6713 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html\n--rw-r--r-- 0 root (0) root (0) 11004 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html\n--rw-r--r-- 0 root (0) root (0) 13871 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html\n--rw-r--r-- 0 root (0) root (0) 20199 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html\n--rw-r--r-- 0 root (0) root (0) 81300 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html\n--rw-r--r-- 0 root (0) root (0) 145342 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html\n--rw-r--r-- 0 root (0) root (0) 14005 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html\n--rw-r--r-- 0 root (0) root (0) 86153 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html\n--rw-r--r-- 0 root (0) root (0) 33483 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html\n--rw-r--r-- 0 root (0) root (0) 357109 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html\n--rw-r--r-- 0 root (0) root (0) 24039 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html\n--rw-r--r-- 0 root (0) root (0) 42064 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html\n--rw-r--r-- 0 root (0) root (0) 3649 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html\n--rw-r--r-- 0 root (0) root (0) 9861 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html\n--rw-r--r-- 0 root (0) root (0) 20797 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html\n--rw-r--r-- 0 root (0) root (0) 3818 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html\n--rw-r--r-- 0 root (0) root (0) 6526 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html\n--rw-r--r-- 0 root (0) root (0) 3372 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html\n--rw-r--r-- 0 root (0) root (0) 88030 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html\n--rw-r--r-- 0 root (0) root (0) 6970 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html\n--rw-r--r-- 0 root (0) root (0) 7265 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html\n--rw-r--r-- 0 root (0) root (0) 14139 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html\n--rw-r--r-- 0 root (0) root (0) 6187 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html\n--rw-r--r-- 0 root (0) root (0) 17742 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html\n--rw-r--r-- 0 root (0) root (0) 4310 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html\n--rw-r--r-- 0 root (0) root (0) 17898 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html\n--rw-r--r-- 0 root (0) root (0) 7356 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html\n--rw-r--r-- 0 root (0) root (0) 9909 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html\n--rw-r--r-- 0 root (0) root (0) 3384 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html\n--rw-r--r-- 0 root (0) root (0) 51921 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html\n--rw-r--r-- 0 root (0) root (0) 60433 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html\n--rw-r--r-- 0 root (0) root (0) 127266 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html\n--rw-r--r-- 0 root (0) root (0) 5347 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html\n--rw-r--r-- 0 root (0) root (0) 33493 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html\n--rw-r--r-- 0 root (0) root (0) 6586 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html\n--rw-r--r-- 0 root (0) root (0) 44038 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html\n--rw-r--r-- 0 root (0) root (0) 9721 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html\n--rw-r--r-- 0 root (0) root (0) 240955 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html\n--rw-r--r-- 0 root (0) root (0) 5247 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html\n--rw-r--r-- 0 root (0) root (0) 9926 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html\n--rw-r--r-- 0 root (0) root (0) 5980 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html\n--rw-r--r-- 0 root (0) root (0) 21115 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html\n--rw-r--r-- 0 root (0) root (0) 7124 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html\n--rw-r--r-- 0 root (0) root (0) 23206 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html\n--rw-r--r-- 0 root (0) root (0) 3949 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html\n--rw-r--r-- 0 root (0) root (0) 7195 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html\n--rw-r--r-- 0 root (0) root (0) 151469 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html\n--rw-r--r-- 0 root (0) root (0) 4655 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html\n--rw-r--r-- 0 root (0) root (0) 7486 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html\n--rw-r--r-- 0 root (0) root (0) 5777 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html\n--rw-r--r-- 0 root (0) root (0) 10089 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html\n--rw-r--r-- 0 root (0) root (0) 4678 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html\n--rw-r--r-- 0 root (0) root (0) 7626 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html\n--rw-r--r-- 0 root (0) root (0) 4678 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html\n--rw-r--r-- 0 root (0) root (0) 7628 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html\n--rw-r--r-- 0 root (0) root (0) 17652 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html\n--rw-r--r-- 0 root (0) root (0) 42086 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html\n--rw-r--r-- 0 root (0) root (0) 5384 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html\n--rw-r--r-- 0 root (0) root (0) 8943 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html\n--rw-r--r-- 0 root (0) root (0) 4672 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html\n--rw-r--r-- 0 root (0) root (0) 6796 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html\n--rw-r--r-- 0 root (0) root (0) 5043 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html\n--rw-r--r-- 0 root (0) root (0) 6951 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html\n--rw-r--r-- 0 root (0) root (0) 6380 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html\n--rw-r--r-- 0 root (0) root (0) 19421 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html\n--rw-r--r-- 0 root (0) root (0) 6856 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html\n--rw-r--r-- 0 root (0) root (0) 112071 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html\n--rw-r--r-- 0 root (0) root (0) 6781 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html\n--rw-r--r-- 0 root (0) root (0) 8264 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html\n--rw-r--r-- 0 root (0) root (0) 17516 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html\n--rw-r--r-- 0 root (0) root (0) 45459 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html\n--rw-r--r-- 0 root (0) root (0) 14288 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html\n--rw-r--r-- 0 root (0) root (0) 63256 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html\n--rw-r--r-- 0 root (0) root (0) 13605 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html\n--rw-r--r-- 0 root (0) root (0) 28676 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html\n--rw-r--r-- 0 root (0) root (0) 12096 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html\n--rw-r--r-- 0 root (0) root (0) 108064 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html\n--rw-r--r-- 0 root (0) root (0) 8836 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html\n--rw-r--r-- 0 root (0) root (0) 10533 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html\n--rw-r--r-- 0 root (0) root (0) 4394 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html\n--rw-r--r-- 0 root (0) root (0) 6435 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html\n--rw-r--r-- 0 root (0) root (0) 4993 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html\n--rw-r--r-- 0 root (0) root (0) 31445 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html\n--rw-r--r-- 0 root (0) root (0) 6556 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html\n--rw-r--r-- 0 root (0) root (0) 18103 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html\n--rw-r--r-- 0 root (0) root (0) 7721 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html\n--rw-r--r-- 0 root (0) root (0) 10469 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html\n--rw-r--r-- 0 root (0) root (0) 8394 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html\n--rw-r--r-- 0 root (0) root (0) 6819 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html\n--rw-r--r-- 0 root (0) root (0) 100137 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html\n--rw-r--r-- 0 root (0) root (0) 10687 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html\n--rw-r--r-- 0 root (0) root (0) 108967 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html\n--rw-r--r-- 0 root (0) root (0) 7919 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html\n--rw-r--r-- 0 root (0) root (0) 126603 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html\n--rw-r--r-- 0 root (0) root (0) 6240 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html\n--rw-r--r-- 0 root (0) root (0) 6782 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html\n--rw-r--r-- 0 root (0) root (0) 5082 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html\n--rw-r--r-- 0 root (0) root (0) 8080 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html\n--rw-r--r-- 0 root (0) root (0) 8731 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html\n--rw-r--r-- 0 root (0) root (0) 61450 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html\n--rw-r--r-- 0 root (0) root (0) 6807 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html\n--rw-r--r-- 0 root (0) root (0) 12871 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html\n--rw-r--r-- 0 root (0) root (0) 20708 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html\n--rw-r--r-- 0 root (0) root (0) 66287 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html\n--rw-r--r-- 0 root (0) root (0) 4959 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html\n--rw-r--r-- 0 root (0) root (0) 6605 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299_source.html\n--rw-r--r-- 0 root (0) root (0) 9165 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html\n--rw-r--r-- 0 root (0) root (0) 5603 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html\n--rw-r--r-- 0 root (0) root (0) 9347 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html\n--rw-r--r-- 0 root (0) root (0) 4979 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html\n--rw-r--r-- 0 root (0) root (0) 4768 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html\n--rw-r--r-- 0 root (0) root (0) 14349 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html\n--rw-r--r-- 0 root (0) root (0) 5325 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html\n--rw-r--r-- 0 root (0) root (0) 10220 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html\n--rw-r--r-- 0 root (0) root (0) 4748 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html\n--rw-r--r-- 0 root (0) root (0) 5767 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html\n--rw-r--r-- 0 root (0) root (0) 16722 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html\n--rw-r--r-- 0 root (0) root (0) 8170 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html\n--rw-r--r-- 0 root (0) root (0) 63385 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html\n--rw-r--r-- 0 root (0) root (0) 5049 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html\n--rw-r--r-- 0 root (0) root (0) 23176 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html\n--rw-r--r-- 0 root (0) root (0) 14995 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html\n--rw-r--r-- 0 root (0) root (0) 142940 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html\n--rw-r--r-- 0 root (0) root (0) 6229 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html\n--rw-r--r-- 0 root (0) root (0) 21246 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html\n--rw-r--r-- 0 root (0) root (0) 4366 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html\n--rw-r--r-- 0 root (0) root (0) 5137 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html\n--rw-r--r-- 0 root (0) root (0) 16771 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html\n--rw-r--r-- 0 root (0) root (0) 48543 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338_source.html\n--rw-r--r-- 0 root (0) root (0) 6662 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html\n--rw-r--r-- 0 root (0) root (0) 52852 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html\n--rw-r--r-- 0 root (0) root (0) 10469 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html\n--rw-r--r-- 0 root (0) root (0) 33175 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html\n--rw-r--r-- 0 root (0) root (0) 10991 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html\n--rw-r--r-- 0 root (0) root (0) 22884 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html\n--rw-r--r-- 0 root (0) root (0) 8828 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html\n--rw-r--r-- 0 root (0) root (0) 15690 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html\n--rw-r--r-- 0 root (0) root (0) 5668 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html\n--rw-r--r-- 0 root (0) root (0) 10965 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html\n--rw-r--r-- 0 root (0) root (0) 6158 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html\n--rw-r--r-- 0 root (0) root (0) 19960 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html\n--rw-r--r-- 0 root (0) root (0) 19607 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html\n--rw-r--r-- 0 root (0) root (0) 104969 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html\n--rw-r--r-- 0 root (0) root (0) 5458 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html\n--rw-r--r-- 0 root (0) root (0) 8314 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html\n--rw-r--r-- 0 root (0) root (0) 17882 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html\n--rw-r--r-- 0 root (0) root (0) 79073 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html\n--rw-r--r-- 0 root (0) root (0) 9499 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html\n--rw-r--r-- 0 root (0) root (0) 250589 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html\n--rw-r--r-- 0 root (0) root (0) 5115 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html\n--rw-r--r-- 0 root (0) root (0) 9512 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html\n--rw-r--r-- 0 root (0) root (0) 8194 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html\n--rw-r--r-- 0 root (0) root (0) 41231 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html\n--rw-r--r-- 0 root (0) root (0) 8323 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html\n--rw-r--r-- 0 root (0) root (0) 40740 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html\n--rw-r--r-- 0 root (0) root (0) 7494 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html\n--rw-r--r-- 0 root (0) root (0) 31467 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380_source.html\n--rw-r--r-- 0 root (0) root (0) 7345 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html\n--rw-r--r-- 0 root (0) root (0) 18651 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html\n--rw-r--r-- 0 root (0) root (0) 14506 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html\n--rw-r--r-- 0 root (0) root (0) 54081 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html\n--rw-r--r-- 0 root (0) root (0) 24718 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html\n--rw-r--r-- 0 root (0) root (0) 121580 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html\n--rw-r--r-- 0 root (0) root (0) 13585 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html\n--rw-r--r-- 0 root (0) root (0) 94215 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html\n+-rw-r--r-- 0 root (0) root (0) 14288 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html\n+-rw-r--r-- 0 root (0) root (0) 63256 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html\n+-rw-r--r-- 0 root (0) root (0) 3818 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html\n+-rw-r--r-- 0 root (0) root (0) 6526 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html\n+-rw-r--r-- 0 root (0) root (0) 19607 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html\n+-rw-r--r-- 0 root (0) root (0) 104969 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html\n+-rw-r--r-- 0 root (0) root (0) 4959 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html\n+-rw-r--r-- 0 root (0) root (0) 6605 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html\n+-rw-r--r-- 0 root (0) root (0) 6970 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html\n+-rw-r--r-- 0 root (0) root (0) 5356 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html\n+-rw-r--r-- 0 root (0) root (0) 41539 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html\n+-rw-r--r-- 0 root (0) root (0) 4979 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html\n+-rw-r--r-- 0 root (0) root (0) 6781 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html\n+-rw-r--r-- 0 root (0) root (0) 8264 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html\n+-rw-r--r-- 0 root (0) root (0) 8731 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html\n+-rw-r--r-- 0 root (0) root (0) 61450 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html\n+-rw-r--r-- 0 root (0) root (0) 4310 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html\n+-rw-r--r-- 0 root (0) root (0) 17898 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html\n+-rw-r--r-- 0 root (0) root (0) 5458 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html\n+-rw-r--r-- 0 root (0) root (0) 8314 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html\n+-rw-r--r-- 0 root (0) root (0) 8836 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html\n+-rw-r--r-- 0 root (0) root (0) 10533 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html\n+-rw-r--r-- 0 root (0) root (0) 5325 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html\n+-rw-r--r-- 0 root (0) root (0) 10220 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html\n+-rw-r--r-- 0 root (0) root (0) 14506 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html\n+-rw-r--r-- 0 root (0) root (0) 54081 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html\n+-rw-r--r-- 0 root (0) root (0) 24039 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html\n+-rw-r--r-- 0 root (0) root (0) 42064 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html\n+-rw-r--r-- 0 root (0) root (0) 13871 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html\n+-rw-r--r-- 0 root (0) root (0) 20199 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html\n+-rw-r--r-- 0 root (0) root (0) 3649 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html\n+-rw-r--r-- 0 root (0) root (0) 6713 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html\n+-rw-r--r-- 0 root (0) root (0) 11004 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html\n+-rw-r--r-- 0 root (0) root (0) 81300 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html\n+-rw-r--r-- 0 root (0) root (0) 145342 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html\n+-rw-r--r-- 0 root (0) root (0) 14005 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html\n+-rw-r--r-- 0 root (0) root (0) 86153 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html\n+-rw-r--r-- 0 root (0) root (0) 9861 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html\n+-rw-r--r-- 0 root (0) root (0) 20797 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html\n+-rw-r--r-- 0 root (0) root (0) 33483 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html\n+-rw-r--r-- 0 root (0) root (0) 357109 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html\n+-rw-r--r-- 0 root (0) root (0) 14995 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html\n+-rw-r--r-- 0 root (0) root (0) 142940 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html\n+-rw-r--r-- 0 root (0) root (0) 17652 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html\n+-rw-r--r-- 0 root (0) root (0) 42086 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html\n+-rw-r--r-- 0 root (0) root (0) 4678 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html\n+-rw-r--r-- 0 root (0) root (0) 7628 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html\n+-rw-r--r-- 0 root (0) root (0) 4678 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html\n+-rw-r--r-- 0 root (0) root (0) 7626 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html\n+-rw-r--r-- 0 root (0) root (0) 5384 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html\n+-rw-r--r-- 0 root (0) root (0) 8943 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html\n+-rw-r--r-- 0 root (0) root (0) 4672 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html\n+-rw-r--r-- 0 root (0) root (0) 6796 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html\n+-rw-r--r-- 0 root (0) root (0) 5777 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html\n+-rw-r--r-- 0 root (0) root (0) 10089 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html\n+-rw-r--r-- 0 root (0) root (0) 8690 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html\n+-rw-r--r-- 0 root (0) root (0) 15576 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html\n+-rw-r--r-- 0 root (0) root (0) 3372 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html\n+-rw-r--r-- 0 root (0) root (0) 88030 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html\n+-rw-r--r-- 0 root (0) root (0) 7124 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html\n+-rw-r--r-- 0 root (0) root (0) 23206 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html\n+-rw-r--r-- 0 root (0) root (0) 5247 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html\n+-rw-r--r-- 0 root (0) root (0) 9926 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html\n+-rw-r--r-- 0 root (0) root (0) 3949 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html\n+-rw-r--r-- 0 root (0) root (0) 5082 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html\n+-rw-r--r-- 0 root (0) root (0) 8080 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html\n+-rw-r--r-- 0 root (0) root (0) 5278 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html\n+-rw-r--r-- 0 root (0) root (0) 22235 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html\n+-rw-r--r-- 0 root (0) root (0) 20708 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html\n+-rw-r--r-- 0 root (0) root (0) 66287 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html\n+-rw-r--r-- 0 root (0) root (0) 45125 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html\n+-rw-r--r-- 0 root (0) root (0) 15704 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html\n+-rw-r--r-- 0 root (0) root (0) 16771 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html\n+-rw-r--r-- 0 root (0) root (0) 48543 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html\n+-rw-r--r-- 0 root (0) root (0) 6229 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html\n+-rw-r--r-- 0 root (0) root (0) 21246 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html\n+-rw-r--r-- 0 root (0) root (0) 17516 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html\n+-rw-r--r-- 0 root (0) root (0) 45459 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html\n+-rw-r--r-- 0 root (0) root (0) 26419 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html\n+-rw-r--r-- 0 root (0) root (0) 61788 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html\n+-rw-r--r-- 0 root (0) root (0) 6158 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html\n+-rw-r--r-- 0 root (0) root (0) 19960 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html\n+-rw-r--r-- 0 root (0) root (0) 6380 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html\n+-rw-r--r-- 0 root (0) root (0) 19421 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html\n+-rw-r--r-- 0 root (0) root (0) 6586 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html\n+-rw-r--r-- 0 root (0) root (0) 44038 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html\n+-rw-r--r-- 0 root (0) root (0) 7783 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html\n+-rw-r--r-- 0 root (0) root (0) 12397 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html\n+-rw-r--r-- 0 root (0) root (0) 11654 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html\n+-rw-r--r-- 0 root (0) root (0) 55191 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html\n+-rw-r--r-- 0 root (0) root (0) 8704 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html\n+-rw-r--r-- 0 root (0) root (0) 26496 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html\n+-rw-r--r-- 0 root (0) root (0) 8394 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html\n+-rw-r--r-- 0 root (0) root (0) 9499 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html\n+-rw-r--r-- 0 root (0) root (0) 250589 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html\n+-rw-r--r-- 0 root (0) root (0) 4394 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html\n+-rw-r--r-- 0 root (0) root (0) 6435 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html\n+-rw-r--r-- 0 root (0) root (0) 5767 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html\n+-rw-r--r-- 0 root (0) root (0) 16722 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html\n+-rw-r--r-- 0 root (0) root (0) 4768 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html\n+-rw-r--r-- 0 root (0) root (0) 14349 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html\n+-rw-r--r-- 0 root (0) root (0) 24718 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html\n+-rw-r--r-- 0 root (0) root (0) 121580 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html\n+-rw-r--r-- 0 root (0) root (0) 6819 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html\n+-rw-r--r-- 0 root (0) root (0) 100137 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html\n+-rw-r--r-- 0 root (0) root (0) 6176 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html\n+-rw-r--r-- 0 root (0) root (0) 8812 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html\n+-rw-r--r-- 0 root (0) root (0) 12096 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html\n+-rw-r--r-- 0 root (0) root (0) 108064 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html\n+-rw-r--r-- 0 root (0) root (0) 20821 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html\n+-rw-r--r-- 0 root (0) root (0) 29928 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html\n+-rw-r--r-- 0 root (0) root (0) 21252 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html\n+-rw-r--r-- 0 root (0) root (0) 132735 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html\n+-rw-r--r-- 0 root (0) root (0) 4748 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html\n+-rw-r--r-- 0 root (0) root (0) 6856 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html\n+-rw-r--r-- 0 root (0) root (0) 112071 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html\n+-rw-r--r-- 0 root (0) root (0) 5214 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html\n+-rw-r--r-- 0 root (0) root (0) 15233 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html\n+-rw-r--r-- 0 root (0) root (0) 13585 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html\n+-rw-r--r-- 0 root (0) root (0) 94215 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html\n+-rw-r--r-- 0 root (0) root (0) 11616 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html\n+-rw-r--r-- 0 root (0) root (0) 101374 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html\n+-rw-r--r-- 0 root (0) root (0) 5638 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html\n+-rw-r--r-- 0 root (0) root (0) 33611 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html\n+-rw-r--r-- 0 root (0) root (0) 6398 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html\n+-rw-r--r-- 0 root (0) root (0) 33437 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html\n+-rw-r--r-- 0 root (0) root (0) 6585 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html\n+-rw-r--r-- 0 root (0) root (0) 46321 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html\n+-rw-r--r-- 0 root (0) root (0) 3649 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html\n+-rw-r--r-- 0 root (0) root (0) 4983 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html\n+-rw-r--r-- 0 root (0) root (0) 13149 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html\n+-rw-r--r-- 0 root (0) root (0) 178064 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html\n+-rw-r--r-- 0 root (0) root (0) 7592 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html\n+-rw-r--r-- 0 root (0) root (0) 136353 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html\n+-rw-r--r-- 0 root (0) root (0) 8766 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html\n+-rw-r--r-- 0 root (0) root (0) 71932 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html\n+-rw-r--r-- 0 root (0) root (0) 9019 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html\n+-rw-r--r-- 0 root (0) root (0) 52516 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html\n+-rw-r--r-- 0 root (0) root (0) 5984 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html\n+-rw-r--r-- 0 root (0) root (0) 51317 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html\n+-rw-r--r-- 0 root (0) root (0) 7409 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html\n+-rw-r--r-- 0 root (0) root (0) 33439 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html\n+-rw-r--r-- 0 root (0) root (0) 6505 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html\n+-rw-r--r-- 0 root (0) root (0) 39913 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html\n+-rw-r--r-- 0 root (0) root (0) 9141 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html\n+-rw-r--r-- 0 root (0) root (0) 172723 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html\n+-rw-r--r-- 0 root (0) root (0) 8399 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html\n+-rw-r--r-- 0 root (0) root (0) 46563 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html\n+-rw-r--r-- 0 root (0) root (0) 23075 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html\n+-rw-r--r-- 0 root (0) root (0) 19865 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html\n+-rw-r--r-- 0 root (0) root (0) 179606 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html\n+-rw-r--r-- 0 root (0) root (0) 6612 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html\n+-rw-r--r-- 0 root (0) root (0) 19861 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html\n+-rw-r--r-- 0 root (0) root (0) 6616 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html\n+-rw-r--r-- 0 root (0) root (0) 58092 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html\n+-rw-r--r-- 0 root (0) root (0) 11420 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html\n+-rw-r--r-- 0 root (0) root (0) 290483 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html\n+-rw-r--r-- 0 root (0) root (0) 3658 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html\n+-rw-r--r-- 0 root (0) root (0) 4980 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html\n+-rw-r--r-- 0 root (0) root (0) 5654 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html\n+-rw-r--r-- 0 root (0) root (0) 7234 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html\n+-rw-r--r-- 0 root (0) root (0) 3899 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html\n+-rw-r--r-- 0 root (0) root (0) 7494 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html\n+-rw-r--r-- 0 root (0) root (0) 31467 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html\n+-rw-r--r-- 0 root (0) root (0) 6187 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html\n+-rw-r--r-- 0 root (0) root (0) 17742 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html\n+-rw-r--r-- 0 root (0) root (0) 5049 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html\n+-rw-r--r-- 0 root (0) root (0) 23176 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html\n+-rw-r--r-- 0 root (0) root (0) 10687 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html\n+-rw-r--r-- 0 root (0) root (0) 108967 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html\n+-rw-r--r-- 0 root (0) root (0) 4993 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html\n+-rw-r--r-- 0 root (0) root (0) 31445 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html\n+-rw-r--r-- 0 root (0) root (0) 8196 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html\n+-rw-r--r-- 0 root (0) root (0) 148986 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html\n+-rw-r--r-- 0 root (0) root (0) 17902 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html\n+-rw-r--r-- 0 root (0) root (0) 167223 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html\n+-rw-r--r-- 0 root (0) root (0) 5347 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html\n+-rw-r--r-- 0 root (0) root (0) 33493 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html\n+-rw-r--r-- 0 root (0) root (0) 4655 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html\n+-rw-r--r-- 0 root (0) root (0) 7486 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html\n+-rw-r--r-- 0 root (0) root (0) 5275 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html\n+-rw-r--r-- 0 root (0) root (0) 11331 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html\n+-rw-r--r-- 0 root (0) root (0) 6240 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html\n+-rw-r--r-- 0 root (0) root (0) 6782 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html\n+-rw-r--r-- 0 root (0) root (0) 4128 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html\n+-rw-r--r-- 0 root (0) root (0) 6384 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html\n+-rw-r--r-- 0 root (0) root (0) 16097 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html\n+-rw-r--r-- 0 root (0) root (0) 7345 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html\n+-rw-r--r-- 0 root (0) root (0) 18651 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html\n+-rw-r--r-- 0 root (0) root (0) 9165 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html\n+-rw-r--r-- 0 root (0) root (0) 7265 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html\n+-rw-r--r-- 0 root (0) root (0) 14139 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html\n+-rw-r--r-- 0 root (0) root (0) 6556 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html\n+-rw-r--r-- 0 root (0) root (0) 18103 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html\n+-rw-r--r-- 0 root (0) root (0) 7919 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html\n+-rw-r--r-- 0 root (0) root (0) 126603 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html\n+-rw-r--r-- 0 root (0) root (0) 5668 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html\n+-rw-r--r-- 0 root (0) root (0) 10965 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html\n+-rw-r--r-- 0 root (0) root (0) 8194 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html\n+-rw-r--r-- 0 root (0) root (0) 41231 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html\n+-rw-r--r-- 0 root (0) root (0) 3384 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html\n+-rw-r--r-- 0 root (0) root (0) 51921 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html\n+-rw-r--r-- 0 root (0) root (0) 7356 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html\n+-rw-r--r-- 0 root (0) root (0) 9909 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html\n+-rw-r--r-- 0 root (0) root (0) 17882 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html\n+-rw-r--r-- 0 root (0) root (0) 79073 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html\n+-rw-r--r-- 0 root (0) root (0) 8323 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html\n+-rw-r--r-- 0 root (0) root (0) 40740 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html\n+-rw-r--r-- 0 root (0) root (0) 7195 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html\n+-rw-r--r-- 0 root (0) root (0) 151469 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338_source.html\n+-rw-r--r-- 0 root (0) root (0) 7721 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html\n+-rw-r--r-- 0 root (0) root (0) 10469 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html\n+-rw-r--r-- 0 root (0) root (0) 8170 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html\n+-rw-r--r-- 0 root (0) root (0) 63385 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html\n+-rw-r--r-- 0 root (0) root (0) 14770 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html\n+-rw-r--r-- 0 root (0) root (0) 23217 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html\n+-rw-r--r-- 0 root (0) root (0) 9721 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html\n+-rw-r--r-- 0 root (0) root (0) 240955 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html\n+-rw-r--r-- 0 root (0) root (0) 4125 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html\n+-rw-r--r-- 0 root (0) root (0) 4366 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html\n+-rw-r--r-- 0 root (0) root (0) 5137 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html\n+-rw-r--r-- 0 root (0) root (0) 6662 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html\n+-rw-r--r-- 0 root (0) root (0) 52852 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html\n+-rw-r--r-- 0 root (0) root (0) 10469 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html\n+-rw-r--r-- 0 root (0) root (0) 33175 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html\n+-rw-r--r-- 0 root (0) root (0) 5043 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html\n+-rw-r--r-- 0 root (0) root (0) 6951 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html\n+-rw-r--r-- 0 root (0) root (0) 6807 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html\n+-rw-r--r-- 0 root (0) root (0) 12871 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html\n+-rw-r--r-- 0 root (0) root (0) 10991 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html\n+-rw-r--r-- 0 root (0) root (0) 22884 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html\n+-rw-r--r-- 0 root (0) root (0) 8828 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html\n+-rw-r--r-- 0 root (0) root (0) 15690 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html\n+-rw-r--r-- 0 root (0) root (0) 13605 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html\n+-rw-r--r-- 0 root (0) root (0) 28676 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html\n+-rw-r--r-- 0 root (0) root (0) 5115 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html\n+-rw-r--r-- 0 root (0) root (0) 9512 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380_source.html\n+-rw-r--r-- 0 root (0) root (0) 5980 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html\n+-rw-r--r-- 0 root (0) root (0) 21115 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html\n+-rw-r--r-- 0 root (0) root (0) 5125 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html\n+-rw-r--r-- 0 root (0) root (0) 29707 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html\n+-rw-r--r-- 0 root (0) root (0) 5603 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html\n+-rw-r--r-- 0 root (0) root (0) 9347 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html\n+-rw-r--r-- 0 root (0) root (0) 60433 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html\n+-rw-r--r-- 0 root (0) root (0) 127266 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html\n -rw-r--r-- 0 root (0) root (0) 7897 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395.html\n -rw-r--r-- 0 root (0) root (0) 5736 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00396.html\n -rw-r--r-- 0 root (0) root (0) 261282 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00397.html\n -rw-r--r-- 0 root (0) root (0) 27946 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00397.png\n -rw-r--r-- 0 root (0) root (0) 39665 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.html\n -rw-r--r-- 0 root (0) root (0) 2473 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.png\n -rw-r--r-- 0 root (0) root (0) 9343 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00399.html\n@@ -1127,15 +1127,15 @@\n -rw-r--r-- 0 root (0) root (0) 5016 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_ade7f944fd3a163752f5cc1af55c988a_dep.png\n -rw-r--r-- 0 root (0) root (0) 4572 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b.html\n -rw-r--r-- 0 root (0) root (0) 2402 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b_dep.png\n -rw-r--r-- 0 root (0) root (0) 48471 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437.html\n -rw-r--r-- 0 root (0) root (0) 8980 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437_dep.png\n -rw-r--r-- 0 root (0) root (0) 3669 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html\n -rw-r--r-- 0 root (0) root (0) 45631 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/doxygen.css\n--rw-r--r-- 0 root (0) root (0) 149381 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz\n+-rw-r--r-- 0 root (0) root (0) 149319 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz\n -rw-r--r-- 0 root (0) root (0) 7704 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/dynsections.js\n -rw-r--r-- 0 root (0) root (0) 51296 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/files.html\n -rw-r--r-- 0 root (0) root (0) 1145 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0.png\n -rw-r--r-- 0 root (0) root (0) 1167 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0_dark.png\n -rw-r--r-- 0 root (0) root (0) 1153 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_1.png\n -rw-r--r-- 0 root (0) root (0) 403 2024-11-07 15:59:08.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10.png\n -rw-r--r-- 0 root (0) root (0) 422 2024-11-07 15:59:08.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: documentation.hh File Reference\n+dune-common: hybridutilities.hh File Reference\n \n \n \n \n \n \n \n@@ -70,46 +70,85 @@\n
\n \n
\n \n
\n
\n-Classes |\n Namespaces |\n-Enumerations
\n-
documentation.hh File Reference
\n+Functions
\n+
hybridutilities.hh File Reference
\n \n
\n-\n-

Documentation related stuff. \n-More...

\n-\n+
#include <tuple>
\n+#include <utility>
\n+#include <dune/common/typetraits.hh>
\n+#include <dune/common/typeutilities.hh>
\n+#include <dune/common/fvector.hh>
\n+#include <dune/common/indices.hh>
\n+#include <dune/common/assertandreturn.hh>
\n+#include <dune/common/rangeutilities.hh>
\n+
\n

Go to the source code of this file.

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

\n-Classes

struct  Dune::ImplementationDefined
 Dummy struct used for documentation purposes. More...
 
\n \n \n \n \n+\n+\n

\n Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Hybrid
 
\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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<class T >
constexpr auto Dune::Hybrid::size (const T &t)
 Size query.
 
template<class Container , class Index >
constexpr decltype(auto) Dune::Hybrid::elementAt (Container &&c, Index &&i)
 Get element at given position from container.
 
template<class Begin , class End >
constexpr auto Dune::Hybrid::integralRange (const Begin &begin, const End &end)
 Create an integral range.
 
template<class End >
constexpr auto Dune::Hybrid::integralRange (const End &end)
 Create an integral range starting from 0.
 
template<class Range , class F >
constexpr void Dune::Hybrid::forEach (Range &&range, F &&f)
 Range based for loop.
 
template<class Range , class T , class F >
constexpr T Dune::Hybrid::accumulate (Range &&range, T value, F &&f)
 Accumulate values.
 
template<class Condition , class IfFunc , class ElseFunc >
decltype(auto) Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
 A conditional expression.
 
template<class Condition , class IfFunc >
void Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc)
 A conditional expression.
 
template<class T1 , class T2 >
constexpr auto Dune::Hybrid::equals (T1 &&t1, T2 &&t2)
 Equality comparison.
 
template<class Cases , class Value , class Branches , class ElseBranch >
constexpr decltype(auto) Dune::Hybrid::switchCases (const Cases &cases, const Value &value, Branches &&branches, ElseBranch &&elseBranch)
 Switch statement.
 
template<class Cases , class Value , class Branches >
constexpr void Dune::Hybrid::switchCases (const Cases &cases, const Value &value, Branches &&branches)
 Switch statement.
 
\n-

Detailed Description

\n-

Documentation related stuff.

\n-
\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.9.0\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+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+hybridutilities.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+#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/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\bs_\bs_\be_\br_\bt_\ba_\bn_\bd_\br_\be_\bt_\bu_\br_\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 _\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-\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 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd\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:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bi_\bz_\be (const T &t)\n+\u00a0 Size query.\n+\u00a0\n+template\n+constexpr decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt (Container &&c, Index &&i)\n+\u00a0 Get element at given position from container.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be (const Begin &begin,\n+ const End &end)\n+\u00a0 Create an integral range.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be (const End &end)\n+\u00a0 Create an integral range starting from 0.\n+\u00a0\n+template\n+ constexpr void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh (Range &&_\br_\ba_\bn_\bg_\be, F &&f)\n+\u00a0 Range based for loop.\n+\u00a0\n+template\n+ constexpr T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be (Range &&_\br_\ba_\bn_\bg_\be, T value, F\n+ &&f)\n+\u00a0 Accumulate values.\n+\u00a0\n+template\n+ decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bf_\bE_\bl_\bs_\be (const Condition &condition,\n+ IfFunc &&ifFunc, ElseFunc &&elseFunc)\n+\u00a0 A conditional expression.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bf_\bE_\bl_\bs_\be (const Condition &condition,\n+ IfFunc &&ifFunc)\n+\u00a0 A conditional expression.\n+\u00a0\n+template\n+ constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs (T1 &&t1, T2 &&t2)\n+\u00a0 Equality comparison.\n+\u00a0\n+template\n+constexpr decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs (const Cases &cases, const\n+ Value &value, Branches &&branches, ElseBranch\n+ &&elseBranch)\n+\u00a0 Switch statement.\n+\u00a0\n+template\n+ constexpr void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs (const Cases &cases, const\n+ Value &value, Branches &&branches)\n+\u00a0 Switch statement.\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/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: documentation.hh Source File\n+dune-common: hybridutilities.hh Source File\n \n \n \n \n \n \n \n@@ -74,38 +74,375 @@\n \n
\n \n
\n \n
\n-
documentation.hh
\n+
hybridutilities.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 (C) 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+
5#ifndef DUNE_COMMON_HYBRIDUTILITIES_HH
\n+
6#define DUNE_COMMON_HYBRIDUTILITIES_HH
\n+
7
\n+
8#include <tuple>
\n+
9#include <utility>
\n+
10
\n+\n+\n+\n+\n+\n+\n+
17
\n+
18
\n+
19
\n+
20namespace Dune {
\n+
\n+
21namespace Hybrid {
\n+
22
\n+
23namespace Impl {
\n+
24
\n+
25 // Try if tuple_size is implemented for class
\n+
26 template<class T, int i>
\n+
27 constexpr auto size(const Dune::FieldVector<T, i>&, const PriorityTag<5>&)
\n+
28 -> decltype(std::integral_constant<std::size_t,i>())
\n+
29 {
\n+
30 return {};
\n+
31 }
\n+
32
\n+
33 // Try if tuple_size is implemented for class
\n+
34 template<class T>
\n+
35 constexpr auto size(const T&, const PriorityTag<3>&)
\n+
36 -> decltype(std::integral_constant<std::size_t,std::tuple_size<T>::value>())
\n+
37 {
\n+
38 return {};
\n+
39 }
\n+
40
\n+
41 // Try if there's a static constexpr size()
\n+
42 template<class T>
\n+
43 constexpr auto size(const T&, const PriorityTag<1>&)
\n+
44 -> decltype(std::integral_constant<std::size_t,T::size()>())
\n+
45 {
\n+
46 return {};
\n+
47 }
\n+
48
\n+
49 // As a last resort try if there's a static constexpr size()
\n+
50 template<class T>
\n+
51 constexpr auto size(const T& t, const PriorityTag<0>&)
\n+
52 {
\n+
53 return t.size();
\n+
54 }
\n+
55
\n+
56} // namespace Impl
\n+
57
\n
58
\n
59
\n-
60#endif // DUNE_COMMON_DOCUMENTATION_HH
\n+
81template<class T>
\n+
\n+
82constexpr auto size(const T& t)
\n+
83{
\n+
84 return Impl::size(t, PriorityTag<42>());
\n+
85}
\n+
\n+
86
\n+
87
\n+
88
\n+
89namespace Impl {
\n+
90
\n+
91 template<class Container, class Index,
\n+
92 std::enable_if_t<IsTuple<std::decay_t<Container>>::value, int> = 0>
\n+
93 constexpr decltype(auto) elementAt(Container&& c, Index&&, PriorityTag<2>)
\n+
94 {
\n+
95 return std::get<std::decay_t<Index>::value>(c);
\n+
96 }
\n+
97
\n+
98 template<class T, T... t, class Index>
\n+
99 constexpr decltype(auto) elementAt(std::integer_sequence<T, t...> c, Index, PriorityTag<1>)
\n+
100 {
\n+
101 return Dune::integerSequenceEntry(c, std::integral_constant<std::size_t, Index::value>());
\n+
102 }
\n+
103
\n+
104 template<class Container, class Index>
\n+
105 constexpr decltype(auto) elementAt(Container&& c, Index&& i, PriorityTag<0>)
\n+
106 {
\n+
107 return c[i];
\n+
108 }
\n+
109
\n+
110} // namespace Impl
\n+
111
\n+
112
\n+
113
\n+
134template<class Container, class Index>
\n+
\n+
135constexpr decltype(auto) elementAt(Container&& c, Index&& i)
\n+
136{
\n+
137 return Impl::elementAt(std::forward<Container>(c), std::forward<Index>(i), PriorityTag<42>());
\n+
138}
\n+
\n+
139
\n+
140
\n+
141
\n+
142namespace Impl {
\n+
143
\n+
144 template<class Begin, class End,
\n+
145 std::enable_if_t<IsIntegralConstant<Begin>::value and IsIntegralConstant<End>::value, int> = 0>
\n+
146 constexpr auto integralRange(const Begin& /*begin*/, const End& /*end*/, const PriorityTag<1>&)
\n+
147 {
\n+
148 static_assert(Begin::value <= End::value, "You cannot create an integralRange where end<begin");
\n+\n+
150 }
\n+
151
\n+
152 // This should be constexpr but gcc-4.9 does not support
\n+
153 // the relaxed constexpr requirements. Hence for being
\n+
154 // constexpr the function body can only contain a return
\n+
155 // statement and no assertion before this.
\n+
156 template<class Begin, class End>
\n+
157 constexpr auto integralRange(const Begin& begin, const End& end, const PriorityTag<0>&)
\n+
158 {
\n+
159 return DUNE_ASSERT_AND_RETURN(begin<=end, Dune::IntegralRange<End>(begin, end));
\n+
160 }
\n+
161
\n+
162} // namespace Impl
\n+
163
\n+
164
\n+
165
\n+
183template<class Begin, class End>
\n+
\n+
184constexpr auto integralRange(const Begin& begin, const End& end)
\n+
185{
\n+
186 return Impl::integralRange(begin, end, PriorityTag<42>());
\n+
187}
\n+
\n+
188
\n+
202template<class End>
\n+
\n+
203constexpr auto integralRange(const End& end)
\n+
204{
\n+
205 return Impl::integralRange(Dune::Indices::_0, end, PriorityTag<42>());
\n+
206}
\n+
\n+
207
\n+
208
\n+
209
\n+
210namespace Impl {
\n+
211
\n+
212 template<class T>
\n+
213 constexpr void evaluateFoldExpression(std::initializer_list<T>&&)
\n+
214 {}
\n+
215
\n+
216 template<class Range, class F, class Index, Index... i>
\n+
217 constexpr void forEachIndex(Range&& range, F&& f, std::integer_sequence<Index, i...>)
\n+
218 {
\n+
219 evaluateFoldExpression<int>({(f(Hybrid::elementAt(range, std::integral_constant<Index,i>())), 0)...});
\n+
220 }
\n+
221
\n+
222 template<class F, class Index, Index... i>
\n+
223 constexpr void forEach(std::integer_sequence<Index, i...> /*range*/, F&& f, PriorityTag<2>)
\n+
224 {
\n+
225 evaluateFoldExpression<int>({(f(std::integral_constant<Index,i>()), 0)...});
\n+
226 }
\n+
227
\n+
228
\n+
229 template<class Range, class F,
\n+
230 std::enable_if_t<IsIntegralConstant<decltype(Hybrid::size(std::declval<Range>()))>::value, int> = 0>
\n+
231 constexpr void forEach(Range&& range, F&& f, PriorityTag<1>)
\n+
232 {
\n+
233 auto size = Hybrid::size(range);
\n+
234 auto indices = std::make_index_sequence<size>();
\n+
235 (forEachIndex)(std::forward<Range>(range), std::forward<F>(f), indices);
\n+
236 }
\n+
237
\n+
238 template<class Range, class F>
\n+
239 constexpr void forEach(Range&& range, F&& f, PriorityTag<0>)
\n+
240 {
\n+
241 for(auto&& e : range)
\n+
242 f(e);
\n+
243 }
\n+
244
\n+
245} // namespace Impl
\n+
246
\n+
247
\n+
248
\n+
267template<class Range, class F>
\n+
\n+
268constexpr void forEach(Range&& range, F&& f)
\n+
269{
\n+
270 Impl::forEach(std::forward<Range>(range), std::forward<F>(f), PriorityTag<42>());
\n+
271}
\n+
\n+
272
\n+
273
\n+
274
\n+
290template<class Range, class T, class F>
\n+
\n+
291constexpr T accumulate(Range&& range, T value, F&& f)
\n+
292{
\n+
293 forEach(std::forward<Range>(range), [&](auto&& entry) {
\n+
294 value = f(value, entry);
\n+
295 });
\n+
296 return value;
\n+
297}
\n+
\n+
298
\n+
299
\n+
300
\n+
301namespace Impl {
\n+
302
\n+
303 struct Id {
\n+
304 template<class T>
\n+
305 constexpr T operator()(T&& x) const {
\n+
306 return std::forward<T>(x);
\n+
307 }
\n+
308 };
\n+
309
\n+
310 template<class IfFunc, class ElseFunc>
\n+
311 constexpr decltype(auto) ifElse(std::true_type, IfFunc&& ifFunc, ElseFunc&& /*elseFunc*/)
\n+
312 {
\n+
313 return ifFunc(Id{});
\n+
314 }
\n+
315
\n+
316 template<class IfFunc, class ElseFunc>
\n+
317 constexpr decltype(auto) ifElse(std::false_type, IfFunc&& /*ifFunc*/, ElseFunc&& elseFunc)
\n+
318 {
\n+
319 return elseFunc(Id{});
\n+
320 }
\n+
321
\n+
322 template<class IfFunc, class ElseFunc>
\n+
323 decltype(auto) ifElse(const bool& condition, IfFunc&& ifFunc, ElseFunc&& elseFunc)
\n+
324 {
\n+
325 if (condition)
\n+
326 return ifFunc(Id{});
\n+
327 else
\n+
328 return elseFunc(Id{});
\n+
329 }
\n+
330
\n+
331} // namespace Impl
\n+
332
\n+
333
\n+
334
\n+
355template<class Condition, class IfFunc, class ElseFunc>
\n+
\n+
356decltype(auto) ifElse(const Condition& condition, IfFunc&& ifFunc, ElseFunc&& elseFunc)
\n+
357{
\n+
358 return Impl::ifElse(condition, std::forward<IfFunc>(ifFunc), std::forward<ElseFunc>(elseFunc));
\n+
359}
\n+
\n+
360
\n+
368template<class Condition, class IfFunc>
\n+
\n+
369void ifElse(const Condition& condition, IfFunc&& ifFunc)
\n+
370{
\n+
371 ifElse(condition, std::forward<IfFunc>(ifFunc), [](auto&&) {});
\n+
372}
\n+
\n+
373
\n+
374
\n+
375
\n+
376namespace Impl {
\n+
377
\n+
378 template<class T1, class T2>
\n+
379 constexpr auto equals(const T1& /*t1*/, const T2& /*t2*/, PriorityTag<1>) -> decltype(T1::value, T2::value, std::integral_constant<bool,T1::value == T2::value>())
\n+
380 { return {}; }
\n+
381
\n+
382 template<class T1, class T2>
\n+
383 constexpr auto equals(const T1& t1, const T2& t2, PriorityTag<0>)
\n+
384 {
\n+
385 return t1==t2;
\n+
386 }
\n+
387
\n+
388} // namespace Impl
\n+
389
\n+
390
\n+
391
\n+
401template<class T1, class T2>
\n+
\n+
402constexpr auto equals(T1&& t1, T2&& t2)
\n+
403{
\n+
404 return Impl::equals(std::forward<T1>(t1), std::forward<T2>(t2), PriorityTag<1>());
\n+
405}
\n+
\n+
406
\n+
407
\n+
408
\n+
409namespace Impl {
\n+
410
\n+
411 template<class Result, class T, class Value, class Branches, class ElseBranch>
\n+
412 constexpr Result switchCases(std::integer_sequence<T>, const Value& /*value*/, Branches&& /*branches*/, ElseBranch&& elseBranch)
\n+
413 {
\n+
414 return elseBranch();
\n+
415 }
\n+
416
\n+
417 template<class Result, class T, T t0, T... tt, class Value, class Branches, class ElseBranch>
\n+
418 constexpr Result switchCases(std::integer_sequence<T, t0, tt...>, const Value& value, Branches&& branches, ElseBranch&& elseBranch)
\n+
419 {
\n+
420 return ifElse(
\n+
421 Hybrid::equals(std::integral_constant<T, t0>(), value),
\n+
422 [&](auto id) -> decltype(auto) {
\n+
423 return id(branches)(std::integral_constant<T, t0>());
\n+
424 }, [&](auto id) -> decltype(auto) {
\n+
425 return Impl::switchCases<Result>(id(std::integer_sequence<T, tt...>()), value, branches, elseBranch);
\n+
426 });
\n+
427 }
\n+
428
\n+
429} // namespace Impl
\n+
430
\n+
431
\n+
432
\n+
460template<class Cases, class Value, class Branches, class ElseBranch>
\n+
\n+
461constexpr decltype(auto) switchCases(const Cases& cases, const Value& value, Branches&& branches, ElseBranch&& elseBranch)
\n+
462{
\n+
463 return Impl::switchCases<decltype(elseBranch())>(cases, value, std::forward<Branches>(branches), std::forward<ElseBranch>(elseBranch));
\n+
464}
\n+
\n+
465
\n+
486template<class Cases, class Value, class Branches>
\n+
\n+
487constexpr void switchCases(const Cases& cases, const Value& value, Branches&& branches)
\n+
488{
\n+
489 Impl::switchCases<void>(cases, value, std::forward<Branches>(branches), []() {});
\n+
490}
\n+
\n+
491
\n+
492
\n+
493} // namespace Hybrid
\n+
\n+
494} // namespace Dune
\n+
495
\n+
496
\n+
497#endif // #ifndef DUNE_COMMON_HYBRIDUTILITIES_HH
\n+
Traits for type conversions and type information.
\n+\n+
Implements a vector constructed from a given type representing a field and a compile-time given size.
\n+\n+
Utilities for reduction like operations on ranges.
\n+
Utilities for type computations, constraining overloads, ...
\n+
constexpr index_constant< 0 > _0
Compile time index with value 0.
Definition indices.hh:53
\n+
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition rangeutilities.hh:300
\n+
constexpr auto size(const T &t)
Size query.
Definition hybridutilities.hh:82
\n+
constexpr auto equals(T1 &&t1, T2 &&t2)
Equality comparison.
Definition hybridutilities.hh:402
\n+
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition hybridutilities.hh:268
\n+
constexpr decltype(auto) switchCases(const Cases &cases, const Value &value, Branches &&branches, ElseBranch &&elseBranch)
Switch statement.
Definition hybridutilities.hh:461
\n+
decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
A conditional expression.
Definition hybridutilities.hh:356
\n+
constexpr auto integralRange(const Begin &begin, const End &end)
Create an integral range.
Definition hybridutilities.hh:184
\n+
constexpr decltype(auto) elementAt(Container &&c, Index &&i)
Get element at given position from container.
Definition hybridutilities.hh:135
\n+
constexpr T accumulate(Range &&range, T value, F &&f)
Accumulate values.
Definition hybridutilities.hh:291
\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:462
\n+
#define DUNE_ASSERT_AND_RETURN(C, X)
Asserts a condition and return on success in constexpr context.
Definition assertandreturn.hh:22
\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+
vector space out of a tensor product of fields.
Definition fvector.hh:95
\n+
dynamic integer range for use in range-based for loops
Definition rangeutilities.hh:175
\n+
static integer range for use in range-based for loops
Definition rangeutilities.hh:225
\n+
Check if T is an std::integral_constant<I, i>
Definition typetraits.hh:384
\n+
Helper class for tagging priorities.
Definition typeutilities.hh:73
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,38 +1,433 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-documentation.hh\n+hybridutilities.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 (C) 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+5#ifndef DUNE_COMMON_HYBRIDUTILITIES_HH\n+6#define DUNE_COMMON_HYBRIDUTILITIES_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+12#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+13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\bs_\bs_\be_\br_\bt_\ba_\bn_\bd_\br_\be_\bt_\bu_\br_\bn_\b._\bh_\bh>\n+16#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+17\n+18\n+19\n+20namespace _\bD_\bu_\bn_\be {\n+_\b2_\b1namespace Hybrid {\n+22\n+23namespace Impl {\n+24\n+25 // Try if tuple_size is implemented for class\n+26 template\n+27 constexpr auto size(const _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bi_\b>&, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b5_\b>&)\n+28 -> decltype(std::integral_constant())\n+29 {\n+30 return {};\n+31 }\n+32\n+33 // Try if tuple_size is implemented for class\n+34 template\n+35 constexpr auto size(const T&, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b3_\b>&)\n+36 -> decltype(std::integral_constant::value>())\n+37 {\n+38 return {};\n+39 }\n+40\n+41 // Try if there's a static constexpr size()\n+42 template\n+43 constexpr auto size(const T&, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>&)\n+44 -> decltype(std::integral_constant())\n+45 {\n+46 return {};\n+47 }\n+48\n+49 // As a last resort try if there's a static constexpr size()\n+50 template\n+51 constexpr auto size(const T& t, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b0_\b>&)\n+52 {\n+53 return t.size();\n+54 }\n+55\n+56} // namespace Impl\n+57\n 58\n 59\n-60#endif // DUNE_COMMON_DOCUMENTATION_HH\n+81template\n+_\b8_\b2constexpr auto _\bs_\bi_\bz_\be(const T& t)\n+83{\n+84 return Impl::size(t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n+85}\n+86\n+87\n+88\n+89namespace Impl {\n+90\n+91 template>::value, int> = 0>\n+93 constexpr decltype(auto) elementAt(Container&& c, Index&&, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>)\n+94 {\n+95 return std::get::value>(c);\n+96 }\n+97\n+98 template\n+99 constexpr decltype(auto) elementAt(std::integer_sequence c, Index,\n+PriorityTag<1>)\n+100 {\n+101 return _\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(c, std::integral_constant());\n+102 }\n+103\n+104 template\n+105 constexpr decltype(auto) elementAt(Container&& c, Index&& i,\n+PriorityTag<0>)\n+106 {\n+107 return c[i];\n+108 }\n+109\n+110} // namespace Impl\n+111\n+112\n+113\n+134template\n+_\b1_\b3_\b5constexpr decltype(auto) _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(Container&& c, Index&& i)\n+136{\n+137 return Impl::elementAt(std::forward(c), std::forward(i),\n+_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n+138}\n+139\n+140\n+141\n+142namespace Impl {\n+143\n+144 template::value and\n+_\bI_\bs_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bE_\bn_\bd_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int> = 0>\n+146 constexpr auto integralRange(const Begin& /*begin*/, const End& /*end*/,\n+const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>&)\n+147 {\n+148 static_assert(Begin::value <= End::value, \"You cannot create an\n+integralRange where end();\n+150 }\n+151\n+152 // This should be constexpr but gcc-4.9 does not support\n+153 // the relaxed constexpr requirements. Hence for being\n+154 // constexpr the function body can only contain a return\n+155 // statement and no assertion before this.\n+156 template\n+157 constexpr auto integralRange(const Begin& begin, const End& end, const\n+PriorityTag<0>&)\n+158 {\n+159 return _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bA_\bN_\bD_\b__\bR_\bE_\bT_\bU_\bR_\bN(begin<=end, _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bE_\bn_\bd_\b>(begin,\n+end));\n+160 }\n+161\n+162} // namespace Impl\n+163\n+164\n+165\n+183template\n+_\b1_\b8_\b4constexpr auto _\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be(const Begin& begin, const End& end)\n+185{\n+186 return Impl::integralRange(begin, end, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n+187}\n+188\n+202template\n+_\b2_\b0_\b3constexpr auto _\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be(const End& end)\n+204{\n+205 return Impl::integralRange(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b0, end, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n+206}\n+207\n+208\n+209\n+210namespace Impl {\n+211\n+212 template\n+213 constexpr void evaluateFoldExpression(std::initializer_list&&)\n+214 {}\n+215\n+216 template\n+217 constexpr void forEachIndex(Range&& _\br_\ba_\bn_\bg_\be, F&& f, std::\n+integer_sequence)\n+218 {\n+219 evaluateFoldExpression({(f(_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\br_\ba_\bn_\bg_\be, std::\n+integral_constant())), 0)...});\n+220 }\n+221\n+222 template\n+223 constexpr void forEach(std::integer_sequence /*range*/, F&& f,\n+PriorityTag<2>)\n+224 {\n+225 evaluateFoldExpression({(f(std::integral_constant()),\n+0)...});\n+226 }\n+227\n+228\n+229 template()))>::value, int> = 0>\n+231 constexpr void forEach(Range&& _\br_\ba_\bn_\bg_\be, F&& f, PriorityTag<1>)\n+232 {\n+233 auto size = _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bi_\bz_\be(_\br_\ba_\bn_\bg_\be);\n+234 auto indices = std::make_index_sequence();\n+235 (forEachIndex)(std::forward(_\br_\ba_\bn_\bg_\be), std::forward(f), indices);\n+236 }\n+237\n+238 template\n+239 constexpr void forEach(Range&& _\br_\ba_\bn_\bg_\be, F&& f, PriorityTag<0>)\n+240 {\n+241 for(auto&& e : _\br_\ba_\bn_\bg_\be)\n+242 f(e);\n+243 }\n+244\n+245} // namespace Impl\n+246\n+247\n+248\n+267template\n+_\b2_\b6_\b8constexpr void _\bf_\bo_\br_\bE_\ba_\bc_\bh(Range&& _\br_\ba_\bn_\bg_\be, F&& f)\n+269{\n+270 Impl::forEach(std::forward(_\br_\ba_\bn_\bg_\be), std::forward(f),\n+_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n+271}\n+272\n+273\n+274\n+290template\n+_\b2_\b9_\b1constexpr T _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be(Range&& _\br_\ba_\bn_\bg_\be, T value, F&& f)\n+292{\n+293 _\bf_\bo_\br_\bE_\ba_\bc_\bh(std::forward(_\br_\ba_\bn_\bg_\be), [&](auto&& entry) {\n+294 value = f(value, entry);\n+295 });\n+296 return value;\n+297}\n+298\n+299\n+300\n+301namespace Impl {\n+302\n+303 struct Id {\n+304 template\n+305 constexpr T operator()(T&& x) const {\n+306 return std::forward(x);\n+307 }\n+308 };\n+309\n+310 template\n+311 constexpr decltype(auto) ifElse(std::true_type, IfFunc&& ifFunc, ElseFunc&&\n+/*elseFunc*/)\n+312 {\n+313 return ifFunc(Id{});\n+314 }\n+315\n+316 template\n+317 constexpr decltype(auto) ifElse(std::false_type, IfFunc&& /*ifFunc*/,\n+ElseFunc&& elseFunc)\n+318 {\n+319 return elseFunc(Id{});\n+320 }\n+321\n+322 template\n+323 decltype(auto) ifElse(const bool& condition, IfFunc&& ifFunc, ElseFunc&&\n+elseFunc)\n+324 {\n+325 if (condition)\n+326 return ifFunc(Id{});\n+327 else\n+328 return elseFunc(Id{});\n+329 }\n+330\n+331} // namespace Impl\n+332\n+333\n+334\n+355template\n+_\b3_\b5_\b6decltype(auto) _\bi_\bf_\bE_\bl_\bs_\be(const Condition& condition, IfFunc&& ifFunc,\n+ElseFunc&& elseFunc)\n+357{\n+358 return Impl::ifElse(condition, std::forward(ifFunc), std::\n+forward(elseFunc));\n+359}\n+360\n+368template\n+_\b3_\b6_\b9void _\bi_\bf_\bE_\bl_\bs_\be(const Condition& condition, IfFunc&& ifFunc)\n+370{\n+371 _\bi_\bf_\bE_\bl_\bs_\be(condition, std::forward(ifFunc), [](auto&&) {});\n+372}\n+373\n+374\n+375\n+376namespace Impl {\n+377\n+378 template\n+379 constexpr auto equals(const T1& /*t1*/, const T2& /*t2*/, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>) -\n+> decltype(T1::value, T2::value, std::integral_constant())\n+380 { return {}; }\n+381\n+382 template\n+383 constexpr auto equals(const T1& t1, const T2& t2, PriorityTag<0>)\n+384 {\n+385 return t1==t2;\n+386 }\n+387\n+388} // namespace Impl\n+389\n+390\n+391\n+401template\n+_\b4_\b0_\b2constexpr auto _\be_\bq_\bu_\ba_\bl_\bs(T1&& t1, T2&& t2)\n+403{\n+404 return Impl::equals(std::forward(t1), std::forward(t2),\n+_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>());\n+405}\n+406\n+407\n+408\n+409namespace Impl {\n+410\n+411 template\n+412 constexpr Result switchCases(std::integer_sequence, const Value& /\n+*value*/, Branches&& /*branches*/, ElseBranch&& elseBranch)\n+413 {\n+414 return elseBranch();\n+415 }\n+416\n+417 template\n+418 constexpr Result switchCases(std::integer_sequence, const\n+Value& value, Branches&& branches, ElseBranch&& elseBranch)\n+419 {\n+420 return ifElse(\n+421 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(std::integral_constant(), value),\n+422 [&](auto id) -> decltype(auto) {\n+423 return id(branches)(std::integral_constant());\n+424 }, [&](auto id) -> decltype(auto) {\n+425 return Impl::switchCases(id(std::integer_sequence()),\n+value, branches, elseBranch);\n+426 });\n+427 }\n+428\n+429} // namespace Impl\n+430\n+431\n+432\n+460template\n+_\b4_\b6_\b1constexpr decltype(auto) _\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs(const Cases& cases, const Value& value,\n+Branches&& branches, ElseBranch&& elseBranch)\n+462{\n+463 return Impl::switchCases(cases, value, std::\n+forward(branches), std::forward(elseBranch));\n+464}\n+465\n+486template\n+_\b4_\b8_\b7constexpr void _\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs(const Cases& cases, const Value& value,\n+Branches&& branches)\n+488{\n+489 Impl::switchCases(cases, value, std::forward(branches), []\n+() {});\n+490}\n+491\n+492\n+493} // namespace Hybrid\n+494} // namespace Dune\n+495\n+496\n+497#endif // #ifndef DUNE_COMMON_HYBRIDUTILITIES_HH\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\ba_\bs_\bs_\be_\br_\bt_\ba_\bn_\bd_\br_\be_\bt_\bu_\br_\bn_\b._\bh_\bh\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+_\bi_\bn_\bd_\bi_\bc_\be_\bs_\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+_\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:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b0\n+constexpr index_constant< 0 > _0\n+Compile time index with value 0.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:53\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:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bi_\bz_\be\n+constexpr auto size(const T &t)\n+Size query.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+constexpr auto equals(T1 &&t1, T2 &&t2)\n+Equality comparison.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:402\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:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs\n+constexpr decltype(auto) switchCases(const Cases &cases, const Value &value,\n+Branches &&branches, ElseBranch &&elseBranch)\n+Switch statement.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:461\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bf_\bE_\bl_\bs_\be\n+decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc\n+&&elseFunc)\n+A conditional expression.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:356\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+constexpr auto integralRange(const Begin &begin, const End &end)\n+Create an integral range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n+constexpr decltype(auto) elementAt(Container &&c, Index &&i)\n+Get element at given position from container.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be\n+constexpr T accumulate(Range &&range, T value, F &&f)\n+Accumulate values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:291\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:462\n+_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bA_\bN_\bD_\b__\bR_\bE_\bT_\bU_\bR_\bN\n+#define DUNE_ASSERT_AND_RETURN(C, X)\n+Asserts a condition and return on success in constexpr context.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn assertandreturn.hh:22\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:_\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:95\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:175\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:225\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:_\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 ===============================================================================\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: singleton.hh File Reference\n+dune-common: vc.hh File Reference\n \n \n \n \n \n \n \n@@ -69,42 +69,25 @@\n \n
\n \n
\n \n
\n- \n-
singleton.hh File Reference
\n+
vc.hh File Reference
\n
\n
\n \n-

Useful wrapper for creating singletons. \n+

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

\n-\n+\n

Go to the source code of this file.

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

\n-Classes

class  Dune::Singleton< T >
 An adapter to turn a class into a singleton. More...
 
\n-\n-\n-\n-\n-

\n-Namespaces

namespace  Dune
 Dune namespace.
 
\n

Detailed Description

\n-

Useful wrapper for creating singletons.

\n-

Inspired by the article CodeGuru: A Leak-Free Singleton class

\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,24 +1,15 @@\n dune-common\u00a02.9.0\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-singleton.hh File Reference\n-Useful wrapper for creating singletons. _\bM_\bo_\br_\be_\b._\b._\b.\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+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-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b<_\b _\bT_\b _\b>\n-\u00a0 An adapter to turn a class into a singleton. _\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-Useful wrapper for creating singletons.\n-Inspired by the article _\bC_\bo_\bd_\be_\bG_\bu_\br_\bu_\b:_\b _\bA_\b _\bL_\be_\ba_\bk_\b-_\bF_\br_\be_\be_\b _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b _\bc_\bl_\ba_\bs_\bs\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/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: singleton.hh Source File\n+dune-common: vc.hh Source File\n \n \n \n \n \n \n \n@@ -74,62 +74,38 @@\n \n
\n \n
\n
\n
\n-
singleton.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 (C) 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_SINGLETON_HH
\n-
6#define DUNE_SINGLETON_HH
\n-
7
\n-\n-
9
\n-
17namespace Dune
\n-
18{
\n-
54 template<class T>
\n-
\n-\n-
56 {
\n-
57 protected:
\n-
58 /* @brief Protected constructor. */
\n-
59 Singleton() = default;
\n-
60
\n-
61 public:
\n-
62
\n-
63 Singleton(const Singleton&) = delete;
\n-
64 void operator=(const Singleton&) = delete;
\n-
65
\n-
\n-\n-
71 {
\n-
72 static T instance_;
\n-
73 return instance_;
\n-
74 }
\n-
\n-
75 };
\n-
\n-
76
\n-
77} // namespace Dune
\n-
78
\n-
79#endif
\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-
Dune namespace.
Definition alignedallocator.hh:13
\n-
An adapter to turn a class into a singleton.
Definition singleton.hh:56
\n-
Singleton()=default
\n-
Singleton(const Singleton &)=delete
\n-
void operator=(const Singleton &)=delete
\n-
static DUNE_EXPORT T & instance()
Get the instance of the singleton.
Definition singleton.hh:70
\n+Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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#endif // HAVE_VC
\n+
29
\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,66 +1,32 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-singleton.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_SINGLETON_HH\n-6#define DUNE_SINGLETON_HH\n-7\n-8#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-9\n-17namespace _\bD_\bu_\bn_\be\n-18{\n-54 template\n-_\b5_\b5 class _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn\n-56 {\n-57 protected:\n-58 /* @brief Protected constructor. */\n-_\b5_\b9 _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn() = default;\n-60\n-61 public:\n-62\n-_\b6_\b3 _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn(const _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn&) = delete;\n-_\b6_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn&) = delete;\n-65\n-_\b7_\b0 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static T& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be()\n-71 {\n-72 static T instance_;\n-73 return instance_;\n-74 }\n-75 };\n-76\n-77} // namespace Dune\n-78\n-79#endif\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\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_\bn_\bg_\bl_\be_\bt_\bo_\bn\n-An adapter to turn a class into a singleton.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn singleton.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn\n-Singleton()=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn\n-Singleton(const Singleton &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-void operator=(const Singleton &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n-static DUNE_EXPORT T & instance()\n-Get the instance of the singleton.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn singleton.hh:70\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#endif // HAVE_VC\n+29\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/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: referencehelper.hh File Reference\n+dune-common: iteratorfacades.hh File Reference\n \n \n \n \n \n \n \n@@ -70,60 +70,101 @@\n
\n \n
\n
\n
\n \n-
referencehelper.hh File Reference
\n+Functions
\n+
iteratorfacades.hh File Reference
\n \n
\n-
#include <type_traits>
\n-#include <functional>
\n+\n+

This file implements iterator facade classes for writing stl conformant iterators. \n+More...

\n+
#include <iterator>
\n+#include <type_traits>
\n+#include "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::ForwardIteratorFacade< T, V, R, D >
 Base class for stl conformant forward iterators. More...
 
class  Dune::BidirectionalIteratorFacade< T, V, R, D >
 Facade class for stl conformant bidirectional iterators. More...
 
class  Dune::RandomAccessIteratorFacade< T, V, R, D >
 Base class for stl conformant forward iterators. More...
 
\n \n \n \n \n

\n Namespaces

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

\n-Typedefs

template<class T >
using Dune::ResolveRef_t = std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))>
 Type trait to resolve std::reference_wrapper.
 
\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

\n Functions

template<class T >
constexpr T & Dune::resolveRef (T &gf) noexcept
 Helper function to resolve std::reference_wrapper.
 
template<class T >
const auto & Dune::resolveRef (T &&gf)=delete
 
template<class T >
constexpr T & Dune::resolveRef (std::reference_wrapper< T > gf) noexcept
 Helper function to resolve std::reference_wrapper.
 
\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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

template<class T >
constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value
 Helper to detect if given type is a std::reference_wrapper.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator== (const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for inequality.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
std::enable_if< std::is_convertible< T2, T1 >::value, bool >::type Dune::operator== (const BidirectionalIteratorFacade< T1, V1, R1, D > &lhs, const BidirectionalIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
std::enable_if< std::is_convertible< T1, T2 >::value &&!std::is_convertible< T2, T1 >::value, bool >::type Dune::operator== (const BidirectionalIteratorFacade< T1, V1, R1, D > &lhs, const BidirectionalIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const BidirectionalIteratorFacade< T1, V1, R1, D > &lhs, const BidirectionalIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for inequality.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator== (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for inequality.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator< (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator<= (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator> (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator>= (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator.
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, D >::type Dune::operator- (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Calculates the difference between two pointers.
 
\n-
\n+

Detailed Description

\n+

This file implements iterator facade classes for writing stl conformant iterators.

\n+

With using these facades writing iterators for arbitrary containers becomes much less cumbersome as only few functions have to be implemented. All other functions needed by the stl are provided by the facades using the Barton-Nackman trick (also known as curiously recurring template pattern.

\n+
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,40 +1,145 @@\n dune-common\u00a02.9.0\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 | _\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-referencehelper.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+iteratorfacades.hh File Reference\n+This file implements iterator facade classes for writing stl conformant\n+iterators. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n-#include \n+#include \"_\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:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\b _\bT_\b,_\b _\bV_\b,_\b _\bR_\b,_\b _\bD_\b _\b>\n+\u00a0 Base class for stl conformant forward iterators. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\bV_\b,_\b _\bR_\b,_\b _\bD_\b _\b>\n+\u00a0 Facade class for stl conformant bidirectional iterators. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\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 _\bT_\b,_\b _\bV_\b,_\b _\bR_\b,_\b _\bD_\b _\b>\n+\u00a0 Base class for stl conformant forward 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-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf_\b__\bt = std::remove_reference_t< decltype(_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf\n- (std::declval< T & >()))>\n-\u00a0 Type trait to resolve std::reference_wrapper.\n-\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-constexpr T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf (T &gf) noexcept\n-\u00a0 Helper function to resolve std::reference_wrapper.\n-\u00a0\n-template\n- const auto &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf (T &&gf)=delete\n-\u00a0\n-template\n-constexpr T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf (std::reference_wrapper< T > gf) noexcept\n-\u00a0 Helper function to resolve std::reference_wrapper.\n-\u00a0\n-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n-template\n-constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\bW_\br_\ba_\bp_\bp_\be_\br_\b__\bv = Impl::IsReferenceWrapper::value\n-\u00a0 Helper to detect if given type is a std::reference_wrapper.\n-\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n+ type\u00a0 _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be< T1, V1, R1, D >\n+ &lhs, const _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be< T2,\n+ V2, R2, D > &rhs)\n+\u00a0 Checks for equality.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const\n+ type\u00a0 _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be< T1, V1, R1, D >\n+ &lhs, const _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be< T2,\n+ V2, R2, D > &rhs)\n+\u00a0 Checks for inequality.\n+\u00a0\n+template\n+ std::enable_if< std::is_convertible< _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n+ T2, T1 >::value, bool >::type\u00a0 _\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< T1, V1,\n+ R1, D > &lhs, const\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< T2, V2,\n+ R2, D > &rhs)\n+\u00a0 Checks for equality.\n+\u00a0\n+template\n+ std::enable_if< std::is_convertible< _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n+T1, T2 >::value &&!std::is_convertible< _\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< T1, V1,\n+ T2, T1 >::value, bool >::type\u00a0 R1, D > &lhs, const\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< T2, V2,\n+ R2, D > &rhs)\n+\u00a0 Checks for equality.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const\n+ type\u00a0 _\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< T1, V1,\n+ R1, D > &lhs, const\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< T2, V2,\n+ R2, D > &rhs)\n+\u00a0 Checks for inequality.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const\n+ type\u00a0 _\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< T1, V1, R1,\n+ D > &lhs, const\n+ _\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< T2, V2, R2,\n+ D > &rhs)\n+\u00a0 Checks for equality.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const\n+ type\u00a0 _\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< T1, V1, R1,\n+ D > &lhs, const\n+ _\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< T2, V2, R2,\n+ D > &rhs)\n+\u00a0 Checks for inequality.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b< (const\n+ type\u00a0 _\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< T1, V1, R1,\n+ D > &lhs, const\n+ _\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< T2, V2, R2,\n+ D > &rhs)\n+\u00a0 Comparison operator.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b= (const\n+ type\u00a0 _\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< T1, V1, R1,\n+ D > &lhs, const\n+ _\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< T2, V2, R2,\n+ D > &rhs)\n+\u00a0 Comparison operator.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b> (const\n+ type\u00a0 _\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< T1, V1, R1,\n+ D > &lhs, const\n+ _\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< T2, V2, R2,\n+ D > &rhs)\n+\u00a0 Comparison operator.\n+\u00a0\n+template\n+_\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, bool >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b= (const\n+ type\u00a0 _\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< T1, V1, R1,\n+ D > &lhs, const\n+ _\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< T2, V2, R2,\n+ D > &rhs)\n+\u00a0 Comparison operator.\n+\u00a0\n+template\n+ _\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be< T1, T2, D >:: _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b- (const\n+ type\u00a0 _\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< T1, V1, R1,\n+ D > &lhs, const\n+ _\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< T2, V2, R2,\n+ D > &rhs)\n+\u00a0 Calculates the difference between two\n+ pointers.\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 iterator facade classes for writing stl conformant\n+iterators.\n+With using these facades writing iterators for arbitrary containers becomes\n+much less cumbersome as only few functions have to be implemented. All other\n+functions needed by the stl are provided by the facades using the Barton-\n+Nackman trick (also known as curiously recurring template pattern.\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: referencehelper.hh Source File\n+dune-common: iteratorfacades.hh Source File\n \n \n \n \n \n \n \n@@ -74,92 +74,507 @@\n \n
\n \n
\n \n
\n-
referencehelper.hh
\n+
iteratorfacades.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 (C) 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_REFERENCE_HELPER_HH
\n-
6#define DUNE_COMMON_REFERENCE_HELPER_HH
\n+
5#ifndef DUNE_ITERATORFACADES_HH
\n+
6#define DUNE_ITERATORFACADES_HH
\n
7
\n-
8#include <type_traits>
\n-
9#include <functional>
\n+
8#include <iterator>
\n+
9#include <type_traits>
\n
10
\n-
11
\n+
11#include "typetraits.hh"
\n
12
\n-
13namespace Dune {
\n-
14
\n-
15namespace Impl {
\n-
16
\n-
17 template<class T>
\n-
18 class IsReferenceWrapper : public std::false_type {};
\n-
19
\n-
20 template<class T>
\n-
21 class IsReferenceWrapper<std::reference_wrapper<T>> : public std::true_type {};
\n-
22
\n-
23 template<class T>
\n-
24 class IsReferenceWrapper<const std::reference_wrapper<T>> : public std::true_type {};
\n-
25
\n-
26} // namespace Dune::Impl
\n-
27
\n-
28
\n-
34template<class T>
\n-
35constexpr bool IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value;
\n-
36
\n-
37
\n-
46template<class T>
\n-
\n-
47constexpr T& resolveRef(T& gf) noexcept
\n-
48{
\n-
49 return gf;
\n-
50}
\n-
\n-
51
\n-
52
\n-
53// There's no overload for non std::reference_wrapper r-values,
\n-
54// because this may lead to undefined behavior whenever the
\n-
55// return value is stored.
\n-
56// Notice that deleting the overload is not necessary, but
\n-
57// helps to document that it is missing on purpose. It also
\n-
58// leads to nicer error messages.
\n-
59template<class T>
\n-
60const auto& resolveRef(T&& gf) = delete;
\n-
61
\n-
62
\n-
81template<class T>
\n-
\n-
82constexpr T& resolveRef(std::reference_wrapper<T> gf) noexcept
\n-
83{
\n-
84 return gf.get();
\n-
85}
\n-
\n-
86
\n-
87
\n-
88
\n-
99template<class T>
\n-
100using ResolveRef_t = std::remove_reference_t<decltype(Dune::resolveRef(std::declval<T&>()))>;
\n-
101
\n-
102
\n-
103} // namespace Dune
\n-
104
\n-
105
\n-
106
\n-
107#endif // DUNE_COMMON_REFERENCE_HELPER_HH
\n-
constexpr bool IsReferenceWrapper_v
Helper to detect if given type is a std::reference_wrapper.
Definition referencehelper.hh:35
\n-
constexpr T & resolveRef(T &gf) noexcept
Helper function to resolve std::reference_wrapper.
Definition referencehelper.hh:47
\n-
STL namespace.
\n+
13namespace Dune
\n+
14{
\n+
139 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
\n+
\n+\n+
141 {
\n+
142
\n+
143 public:
\n+
144 /* type aliases required by C++ for iterators */
\n+
145 using iterator_category = std::forward_iterator_tag;
\n+
146 using value_type = typename std::remove_const<V>::type;
\n+\n+
148 using pointer = V*;
\n+
149 using reference = R;
\n+
150
\n+
175 typedef T DerivedType;
\n+
176
\n+
180 typedef V Value;
\n+
181
\n+
185 typedef V* Pointer;
\n+
186
\n+
190 typedef D DifferenceType;
\n+
191
\n+
195 typedef R Reference;
\n+
196
\n+
\n+\n+
199 {
\n+
200 return static_cast<DerivedType const*>(this)->dereference();
\n+
201 }
\n+
\n+
202
\n+
\n+\n+
204 {
\n+
205 return &(static_cast<const DerivedType *>(this)->dereference());
\n+
206 }
\n+
\n+
207
\n+
\n+\n+
210 {
\n+
211 static_cast<DerivedType *>(this)->increment();
\n+
212 return *static_cast<DerivedType *>(this);
\n+
213 }
\n+
\n+
214
\n+
\n+\n+
217 {
\n+
218 DerivedType tmp(static_cast<DerivedType const&>(*this));
\n+
219 this->operator++();
\n+
220 return tmp;
\n+
221 }
\n+
\n+
222 };
\n+
\n+
223
\n+
234 template<class T1, class V1, class R1, class D,
\n+
235 class T2, class V2, class R2>
\n+
236 inline typename EnableIfInterOperable<T1,T2,bool>::type
\n+
\n+\n+\n+
239 {
\n+
240 if(std::is_convertible<T2,T1>::value)
\n+
241 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
\n+
242 else
\n+
243 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
\n+
244 }
\n+
\n+
245
\n+
256 template<class T1, class V1, class R1, class D,
\n+
257 class T2, class V2, class R2>
\n+
258 inline typename EnableIfInterOperable<T1,T2,bool>::type
\n+
\n+\n+\n+
261 {
\n+
262 if(std::is_convertible<T2,T1>::value)
\n+
263 return !static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
\n+
264 else
\n+
265 return !static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
\n+
266 }
\n+
\n+
267
\n+
272 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
\n+
\n+\n+
274 {
\n+
275
\n+
276 public:
\n+
277 /* type aliases required by C++ for iterators */
\n+
278 using iterator_category = std::bidirectional_iterator_tag;
\n+
279 using value_type = typename std::remove_const<V>::type;
\n+\n+
281 using pointer = V*;
\n+
282 using reference = R;
\n+
283
\n+
309 typedef T DerivedType;
\n+
310
\n+
314 typedef V Value;
\n+
315
\n+
319 typedef V* Pointer;
\n+
320
\n+
324 typedef D DifferenceType;
\n+
325
\n+
329 typedef R Reference;
\n+
330
\n+
\n+\n+
333 {
\n+
334 return static_cast<DerivedType const*>(this)->dereference();
\n+
335 }
\n+
\n+
336
\n+
\n+\n+
338 {
\n+
339 return &(static_cast<const DerivedType *>(this)->dereference());
\n+
340 }
\n+
\n+
341
\n+
\n+\n+
344 {
\n+
345 static_cast<DerivedType *>(this)->increment();
\n+
346 return *static_cast<DerivedType *>(this);
\n+
347 }
\n+
\n+
348
\n+
\n+\n+
351 {
\n+
352 DerivedType tmp(static_cast<DerivedType const&>(*this));
\n+
353 this->operator++();
\n+
354 return tmp;
\n+
355 }
\n+
\n+
356
\n+
357
\n+
\n+\n+
360 {
\n+
361 static_cast<DerivedType *>(this)->decrement();
\n+
362 return *static_cast<DerivedType *>(this);
\n+
363 }
\n+
\n+
364
\n+
\n+\n+
367 {
\n+
368 DerivedType tmp(static_cast<DerivedType const&>(*this));
\n+
369 this->operator--();
\n+
370 return tmp;
\n+
371 }
\n+
\n+
372 };
\n+
\n+
373
\n+
381 template<class T1, class V1, class R1, class D,
\n+
382 class T2, class V2, class R2>
\n+
383 inline typename std::enable_if<std::is_convertible<T2,T1>::value,bool>::type
\n+
\n+\n+\n+
386 {
\n+
387 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
\n+
388 }
\n+
\n+
389
\n+
398 template<class T1, class V1, class R1, class D,
\n+
399 class T2, class V2, class R2>
\n+
400 inline
\n+
401 typename std::enable_if<std::is_convertible<T1,T2>::value && !std::is_convertible<T2,T1>::value,
\n+
402 bool>::type
\n+
\n+\n+\n+
405 {
\n+
406 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
\n+
407 }
\n+
\n+
408
\n+
419 template<class T1, class V1, class R1, class D,
\n+
420 class T2, class V2, class R2>
\n+
421 inline typename EnableIfInterOperable<T1,T2,bool>::type
\n+
\n+\n+\n+
424 {
\n+
425 return !(lhs == rhs);
\n+
426 }
\n+
\n+
427
\n+
432 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
\n+
\n+\n+
434 {
\n+
435
\n+
436 public:
\n+
437 /* type aliases required by C++ for iterators */
\n+
438 using iterator_category = std::random_access_iterator_tag;
\n+
439 using value_type = typename std::remove_const<V>::type;
\n+\n+
441 using pointer = V*;
\n+
442 using reference = R;
\n+
443
\n+
477 typedef T DerivedType;
\n+
478
\n+
482 typedef V Value;
\n+
483
\n+
487 typedef V* Pointer;
\n+
488
\n+
492 typedef D DifferenceType;
\n+
493
\n+
497 typedef R Reference;
\n+
498
\n+
\n+\n+
501 {
\n+
502 return static_cast<DerivedType const*>(this)->dereference();
\n+
503 }
\n+
\n+
504
\n+
\n+\n+
506 {
\n+
507 return &(static_cast<const DerivedType *>(this)->dereference());
\n+
508 }
\n+
\n+
509
\n+
\n+\n+
516 {
\n+
517 return static_cast<const DerivedType *>(this)->elementAt(n);
\n+
518 }
\n+
\n+
519
\n+
\n+\n+
522 {
\n+
523 static_cast<DerivedType *>(this)->increment();
\n+
524 return *static_cast<DerivedType *>(this);
\n+
525 }
\n+
\n+
526
\n+
\n+\n+
529 {
\n+
530 DerivedType tmp(static_cast<DerivedType const&>(*this));
\n+
531 this->operator++();
\n+
532 return tmp;
\n+
533 }
\n+
\n+
534
\n+
\n+\n+
536 {
\n+
537 static_cast<DerivedType *>(this)->advance(n);
\n+
538 return *static_cast<DerivedType *>(this);
\n+
539 }
\n+
\n+
540
\n+
\n+\n+
542 {
\n+
543 DerivedType tmp(static_cast<DerivedType const&>(*this));
\n+
544 tmp.advance(n);
\n+
545 return tmp;
\n+
546 }
\n+
\n+
547
\n+
548
\n+
\n+\n+
551 {
\n+
552 static_cast<DerivedType *>(this)->decrement();
\n+
553 return *static_cast<DerivedType *>(this);
\n+
554 }
\n+
\n+
555
\n+
\n+\n+
558 {
\n+
559 DerivedType tmp(static_cast<DerivedType const&>(*this));
\n+
560 this->operator--();
\n+
561 return tmp;
\n+
562 }
\n+
\n+
563
\n+
\n+\n+
565 {
\n+
566 static_cast<DerivedType *>(this)->advance(-n);
\n+
567 return *static_cast<DerivedType *>(this);
\n+
568 }
\n+
\n+
569
\n+
\n+\n+
571 {
\n+
572 DerivedType tmp(static_cast<DerivedType const&>(*this));
\n+
573 tmp.advance(-n);
\n+
574 return tmp;
\n+
575 }
\n+
\n+
576
\n+
577
\n+
578 };
\n+
\n+
579
\n+
590 template<class T1, class V1, class R1, class D,
\n+
591 class T2, class V2, class R2>
\n+
592 inline typename EnableIfInterOperable<T1,T2,bool>::type
\n+
\n+\n+\n+
595 {
\n+
596 if(std::is_convertible<T2,T1>::value)
\n+
597 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
\n+
598 else
\n+
599 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
\n+
600 }
\n+
\n+
601
\n+
612 template<class T1, class V1, class R1, class D,
\n+
613 class T2, class V2, class R2>
\n+
614 inline typename EnableIfInterOperable<T1,T2,bool>::type
\n+
\n+\n+\n+
617 {
\n+
618 if(std::is_convertible<T2,T1>::value)
\n+
619 return !static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
\n+
620 else
\n+
621 return !static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
\n+
622 }
\n+
\n+
623
\n+
634 template<class T1, class V1, class R1, class D,
\n+
635 class T2, class V2, class R2>
\n+
\n+\n+\n+\n+
639 {
\n+
640 if(std::is_convertible<T2,T1>::value)
\n+
641 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))>0;
\n+
642 else
\n+
643 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))<0;
\n+
644 }
\n+
\n+
645
\n+
646
\n+
657 template<class T1, class V1, class R1, class D,
\n+
658 class T2, class V2, class R2>
\n+
\n+\n+\n+\n+
662 {
\n+
663 if(std::is_convertible<T2,T1>::value)
\n+
664 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))>=0;
\n+
665 else
\n+
666 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))<=0;
\n+
667 }
\n+
\n+
668
\n+
669
\n+
680 template<class T1, class V1, class R1, class D,
\n+
681 class T2, class V2, class R2>
\n+
682 inline typename EnableIfInterOperable<T1,T2,bool>::type
\n+
\n+\n+\n+
685 {
\n+
686 if(std::is_convertible<T2,T1>::value)
\n+
687 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))<0;
\n+
688 else
\n+
689 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))>0;
\n+
690 }
\n+
\n+
691
\n+
702 template<class T1, class V1, class R1, class D,
\n+
703 class T2, class V2, class R2>
\n+
704 inline typename EnableIfInterOperable<T1,T2,bool>::type
\n+
\n+\n+\n+
707 {
\n+
708 if(std::is_convertible<T2,T1>::value)
\n+
709 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))<=0;
\n+
710 else
\n+
711 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))>=0;
\n+
712 }
\n+
\n+
713
\n+
724 template<class T1, class V1, class R1, class D,
\n+
725 class T2, class V2, class R2>
\n+
726 inline typename EnableIfInterOperable<T1,T2,D>::type
\n+
\n+\n+\n+
729 {
\n+
730 if(std::is_convertible<T2,T1>::value)
\n+
731 return -static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs));
\n+
732 else
\n+
733 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs));
\n+
734 }
\n+
\n+
735
\n+
737}
\n+
738#endif
\n+
Traits for type conversions and type information.
\n+
bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
Definition bigunsignedint.hh:542
\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:637
\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:683
\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:660
\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:237
\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:705
\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:259
\n
Dune namespace.
Definition alignedallocator.hh:13
\n-
std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> ResolveRef_t
Type trait to resolve std::reference_wrapper.
Definition referencehelper.hh:100
\n+
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:141
\n+
std::forward_iterator_tag iterator_category
Definition iteratorfacades.hh:145
\n+
V * pointer
Definition iteratorfacades.hh:148
\n+
DerivedType & operator++()
Preincrement operator.
Definition iteratorfacades.hh:209
\n+
D DifferenceType
The type of the difference between two positions.
Definition iteratorfacades.hh:190
\n+
R Reference
The type of the reference to the values accessed.
Definition iteratorfacades.hh:195
\n+
Pointer operator->() const
Definition iteratorfacades.hh:203
\n+
T DerivedType
The type of derived iterator.
Definition iteratorfacades.hh:175
\n+
V Value
The type of value accessed through the iterator.
Definition iteratorfacades.hh:180
\n+
typename std::remove_const< V >::type value_type
Definition iteratorfacades.hh:146
\n+
DerivedType operator++(int)
Postincrement operator.
Definition iteratorfacades.hh:216
\n+
V * Pointer
The pointer to the Value.
Definition iteratorfacades.hh:185
\n+
D difference_type
Definition iteratorfacades.hh:147
\n+
Reference operator*() const
Dereferencing operator.
Definition iteratorfacades.hh:198
\n+
R reference
Definition iteratorfacades.hh:149
\n+
Facade class for stl conformant bidirectional iterators.
Definition iteratorfacades.hh:274
\n+
V * pointer
Definition iteratorfacades.hh:281
\n+
typename std::remove_const< V >::type value_type
Definition iteratorfacades.hh:279
\n+
Reference operator*() const
Dereferencing operator.
Definition iteratorfacades.hh:332
\n+
D difference_type
Definition iteratorfacades.hh:280
\n+
T DerivedType
The type of derived iterator.
Definition iteratorfacades.hh:309
\n+
DerivedType & operator--()
Preincrement operator.
Definition iteratorfacades.hh:359
\n+
Pointer operator->() const
Definition iteratorfacades.hh:337
\n+
DerivedType & operator++()
Preincrement operator.
Definition iteratorfacades.hh:343
\n+
V * Pointer
The pointer to the Value.
Definition iteratorfacades.hh:319
\n+
R Reference
The type of the reference to the values accessed.
Definition iteratorfacades.hh:329
\n+
DerivedType operator++(int)
Postincrement operator.
Definition iteratorfacades.hh:350
\n+
std::bidirectional_iterator_tag iterator_category
Definition iteratorfacades.hh:278
\n+
D DifferenceType
The type of the difference between two positions.
Definition iteratorfacades.hh:324
\n+
DerivedType operator--(int)
Postincrement operator.
Definition iteratorfacades.hh:366
\n+
R reference
Definition iteratorfacades.hh:282
\n+
V Value
The type of value accessed through the iterator.
Definition iteratorfacades.hh:314
\n+
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:434
\n+
typename std::remove_const< V >::type value_type
Definition iteratorfacades.hh:439
\n+
D difference_type
Definition iteratorfacades.hh:440
\n+
DerivedType operator--(int)
Postdecrement operator.
Definition iteratorfacades.hh:557
\n+
V * pointer
Definition iteratorfacades.hh:441
\n+
std::random_access_iterator_tag iterator_category
Definition iteratorfacades.hh:438
\n+
Reference operator*() const
Dereferencing operator.
Definition iteratorfacades.hh:500
\n+
DerivedType & operator++()
Preincrement operator.
Definition iteratorfacades.hh:521
\n+
R reference
Definition iteratorfacades.hh:442
\n+
Pointer operator->() const
Definition iteratorfacades.hh:505
\n+
D DifferenceType
The type of the difference between two positions.
Definition iteratorfacades.hh:492
\n+
DerivedType & operator--()
Predecrement operator.
Definition iteratorfacades.hh:550
\n+
DerivedType & operator-=(DifferenceType n)
Definition iteratorfacades.hh:564
\n+
DerivedType operator+(DifferenceType n) const
Definition iteratorfacades.hh:541
\n+
Reference operator[](DifferenceType n) const
Get the element n positions from the current one.
Definition iteratorfacades.hh:515
\n+
T DerivedType
The type of derived iterator.
Definition iteratorfacades.hh:477
\n+
V * Pointer
The pointer to the Value.
Definition iteratorfacades.hh:487
\n+
DerivedType operator-(DifferenceType n) const
Definition iteratorfacades.hh:570
\n+
DerivedType operator++(int)
Postincrement operator.
Definition iteratorfacades.hh:528
\n+
V Value
The type of value accessed through the iterator.
Definition iteratorfacades.hh:482
\n+
DerivedType & operator+=(DifferenceType n)
Definition iteratorfacades.hh:535
\n+
R Reference
The type of the reference to the values accessed.
Definition iteratorfacades.hh:497
\n+
Enable typedef if two types are interoperable.
Definition typetraits.hh:81
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,98 +1,614 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-referencehelper.hh\n+iteratorfacades.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 (C) 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_REFERENCE_HELPER_HH\n-6#define DUNE_COMMON_REFERENCE_HELPER_HH\n+5#ifndef DUNE_ITERATORFACADES_HH\n+6#define DUNE_ITERATORFACADES_HH\n 7\n-8#include \n-9#include \n+8#include \n+9#include \n 10\n-11\n+11#include \"_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n 12\n-13namespace _\bD_\bu_\bn_\be {\n-14\n-15namespace Impl {\n-16\n-17 template\n-18 class IsReferenceWrapper : public std::false_type {};\n-19\n-20 template\n-21 class IsReferenceWrapper<_\bs_\bt_\bd::reference_wrapper> : public std::true_type\n-{};\n-22\n-23 template\n-24 class IsReferenceWrapper> : public std::\n-true_type {};\n-25\n-26} // namespace Dune::Impl\n-27\n-28\n-34template\n-_\b3_\b5constexpr bool _\bI_\bs_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\bW_\br_\ba_\bp_\bp_\be_\br_\b__\bv = Impl::IsReferenceWrapper::value;\n-36\n-37\n-46template\n-_\b4_\b7constexpr T& _\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf(T& gf) noexcept\n-48{\n-49 return gf;\n-50}\n-51\n-52\n-53// There's no overload for non std::reference_wrapper r-values,\n-54// because this may lead to undefined behavior whenever the\n-55// return value is stored.\n-56// Notice that deleting the overload is not necessary, but\n-57// helps to document that it is missing on purpose. It also\n-58// leads to nicer error messages.\n-59template\n-_\b6_\b0const auto& _\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf(T&& gf) = delete;\n-61\n-62\n-81template\n-_\b8_\b2constexpr T& _\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf(std::reference_wrapper gf) noexcept\n-83{\n-84 return gf.get();\n-85}\n-86\n-87\n-88\n-99template\n-_\b1_\b0_\b0using _\bR_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf_\b__\bt = std::remove_reference_t()))>;\n-101\n-102\n-103} // namespace Dune\n-104\n-105\n-106\n-107#endif // DUNE_COMMON_REFERENCE_HELPER_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\bW_\br_\ba_\bp_\bp_\be_\br_\b__\bv\n-constexpr bool IsReferenceWrapper_v\n-Helper to detect if given type is a std::reference_wrapper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn referencehelper.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf\n-constexpr T & resolveRef(T &gf) noexcept\n-Helper function to resolve std::reference_wrapper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn referencehelper.hh:47\n-_\bs_\bt_\bd\n-STL namespace.\n+13namespace _\bD_\bu_\bn_\be\n+14{\n+139 template\n+_\b1_\b4_\b0 class _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be\n+141 {\n+142\n+143 public:\n+144 /* type aliases required by C++ for iterators */\n+_\b1_\b4_\b5 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by = std::forward_iterator_tag;\n+_\b1_\b4_\b6 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = typename std::remove_const::type;\n+_\b1_\b4_\b7 using _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be = D;\n+_\b1_\b4_\b8 using _\bp_\bo_\bi_\bn_\bt_\be_\br = V*;\n+_\b1_\b4_\b9 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = R;\n+150\n+_\b1_\b7_\b5 typedef T _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be;\n+176\n+_\b1_\b8_\b0 typedef V _\bV_\ba_\bl_\bu_\be;\n+181\n+_\b1_\b8_\b5 typedef V* _\bP_\bo_\bi_\bn_\bt_\be_\br;\n+186\n+_\b1_\b9_\b0 typedef D _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be;\n+191\n+_\b1_\b9_\b5 typedef R _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+196\n+_\b1_\b9_\b8 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n+199 {\n+200 return static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const*>(this)->dereference();\n+201 }\n+202\n+_\b2_\b0_\b3 _\bP_\bo_\bi_\bn_\bt_\be_\br _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n+204 {\n+205 return &(static_cast(this)->dereference());\n+206 }\n+207\n+_\b2_\b0_\b9 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+210 {\n+211 static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this)->increment();\n+212 return *static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this);\n+213 }\n+214\n+_\b2_\b1_\b6 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+(int)\n+217 {\n+218 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be tmp(static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const&>(*this));\n+219 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+220 return tmp;\n+221 }\n+222 };\n+223\n+234 template\n+236 inline typename EnableIfInterOperable::type\n+_\b2_\b3_\b7 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+238 const _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+239 {\n+240 if(std::is_convertible::value)\n+241 return static_cast(lhs).equals(static_cast(rhs));\n+242 else\n+243 return static_cast(rhs).equals(static_cast(lhs));\n+244 }\n+245\n+256 template\n+258 inline typename EnableIfInterOperable::type\n+_\b2_\b5_\b9 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+260 const _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+261 {\n+262 if(std::is_convertible::value)\n+263 return !static_cast(lhs).equals(static_cast(rhs));\n+264 else\n+265 return !static_cast(rhs).equals(static_cast(lhs));\n+266 }\n+267\n+272 template\n+_\b2_\b7_\b3 class _\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+274 {\n+275\n+276 public:\n+277 /* type aliases required by C++ for iterators */\n+_\b2_\b7_\b8 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by = std::bidirectional_iterator_tag;\n+_\b2_\b7_\b9 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = typename std::remove_const::type;\n+_\b2_\b8_\b0 using _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be = D;\n+_\b2_\b8_\b1 using _\bp_\bo_\bi_\bn_\bt_\be_\br = V*;\n+_\b2_\b8_\b2 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = R;\n+283\n+_\b3_\b0_\b9 typedef T _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be;\n+310\n+_\b3_\b1_\b4 typedef V _\bV_\ba_\bl_\bu_\be;\n+315\n+_\b3_\b1_\b9 typedef V* _\bP_\bo_\bi_\bn_\bt_\be_\br;\n+320\n+_\b3_\b2_\b4 typedef D _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be;\n+325\n+_\b3_\b2_\b9 typedef R _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+330\n+_\b3_\b3_\b2 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n+333 {\n+334 return static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const*>(this)->dereference();\n+335 }\n+336\n+_\b3_\b3_\b7 _\bP_\bo_\bi_\bn_\bt_\be_\br _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n+338 {\n+339 return &(static_cast(this)->dereference());\n+340 }\n+341\n+_\b3_\b4_\b3 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+344 {\n+345 static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this)->increment();\n+346 return *static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this);\n+347 }\n+348\n+_\b3_\b5_\b0 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+(int)\n+351 {\n+352 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be tmp(static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const&>(*this));\n+353 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+354 return tmp;\n+355 }\n+356\n+357\n+_\b3_\b5_\b9 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-()\n+360 {\n+361 static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this)->decrement();\n+362 return *static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this);\n+363 }\n+364\n+_\b3_\b6_\b6 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-(int)\n+367 {\n+368 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be tmp(static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const&>(*this));\n+369 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-();\n+370 return tmp;\n+371 }\n+372 };\n+373\n+381 template\n+383 inline typename std::enable_if::value,bool>::\n+type\n+_\b3_\b8_\b4 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\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_\b<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+385 const _\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_\b<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+386 {\n+387 return static_cast(lhs).equals(static_cast(rhs));\n+388 }\n+389\n+398 template\n+400 inline\n+401 typename std::enable_if::value && !std::\n+is_convertible::value,\n+402 bool>::type\n+_\b4_\b0_\b3 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\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_\b<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+404 const _\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_\b<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+405 {\n+406 return static_cast(rhs).equals(static_cast(lhs));\n+407 }\n+408\n+419 template\n+421 inline typename EnableIfInterOperable::type\n+_\b4_\b2_\b2 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\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_\b<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+423 const _\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_\b<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+424 {\n+425 return !(lhs == rhs);\n+426 }\n+427\n+432 template\n+_\b4_\b3_\b3 class _\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+434 {\n+435\n+436 public:\n+437 /* type aliases required by C++ for iterators */\n+_\b4_\b3_\b8 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by = std::random_access_iterator_tag;\n+_\b4_\b3_\b9 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = typename std::remove_const::type;\n+_\b4_\b4_\b0 using _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be = D;\n+_\b4_\b4_\b1 using _\bp_\bo_\bi_\bn_\bt_\be_\br = V*;\n+_\b4_\b4_\b2 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = R;\n+443\n+_\b4_\b7_\b7 typedef T _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be;\n+478\n+_\b4_\b8_\b2 typedef V _\bV_\ba_\bl_\bu_\be;\n+483\n+_\b4_\b8_\b7 typedef V* _\bP_\bo_\bi_\bn_\bt_\be_\br;\n+488\n+_\b4_\b9_\b2 typedef D _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be;\n+493\n+_\b4_\b9_\b7 typedef R _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+498\n+_\b5_\b0_\b0 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n+501 {\n+502 return static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const*>(this)->dereference();\n+503 }\n+504\n+_\b5_\b0_\b5 _\bP_\bo_\bi_\bn_\bt_\be_\br _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n+506 {\n+507 return &(static_cast(this)->dereference());\n+508 }\n+509\n+_\b5_\b1_\b5 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be n) const\n+516 {\n+517 return static_cast(this)->elementAt(n);\n+518 }\n+519\n+_\b5_\b2_\b1 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+522 {\n+523 static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this)->increment();\n+524 return *static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this);\n+525 }\n+526\n+_\b5_\b2_\b8 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+(int)\n+529 {\n+530 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be tmp(static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const&>(*this));\n+531 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+532 return tmp;\n+533 }\n+534\n+_\b5_\b3_\b5 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=(_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be n)\n+536 {\n+537 static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this)->advance(n);\n+538 return *static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this);\n+539 }\n+540\n+_\b5_\b4_\b1 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be n) const\n+542 {\n+543 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be tmp(static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const&>(*this));\n+544 tmp.advance(n);\n+545 return tmp;\n+546 }\n+547\n+548\n+_\b5_\b5_\b0 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-()\n+551 {\n+552 static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this)->decrement();\n+553 return *static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this);\n+554 }\n+555\n+_\b5_\b5_\b7 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-(int)\n+558 {\n+559 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be tmp(static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const&>(*this));\n+560 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-();\n+561 return tmp;\n+562 }\n+563\n+_\b5_\b6_\b4 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=(_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be n)\n+565 {\n+566 static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this)->advance(-n);\n+567 return *static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be *>(this);\n+568 }\n+569\n+_\b5_\b7_\b0 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be n) const\n+571 {\n+572 _\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be tmp(static_cast<_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be const&>(*this));\n+573 tmp.advance(-n);\n+574 return tmp;\n+575 }\n+576\n+577\n+578 };\n+579\n+590 template\n+592 inline typename EnableIfInterOperable::type\n+_\b5_\b9_\b3 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\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<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+594 const _\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<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+595 {\n+596 if(std::is_convertible::value)\n+597 return static_cast(lhs).equals(static_cast(rhs));\n+598 else\n+599 return static_cast(rhs).equals(static_cast(lhs));\n+600 }\n+601\n+612 template\n+614 inline typename EnableIfInterOperable::type\n+_\b6_\b1_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\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<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+616 const _\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<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+617 {\n+618 if(std::is_convertible::value)\n+619 return !static_cast(lhs).equals(static_cast(rhs));\n+620 else\n+621 return !static_cast(rhs).equals(static_cast(lhs));\n+622 }\n+623\n+634 template\n+_\b6_\b3_\b6 inline typename _\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be_\b<_\bT_\b1_\b,_\bT_\b2_\b,_\bb_\bo_\bo_\bl_\b>_\b:_\b:_\bt_\by_\bp_\be\n+637 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\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<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+638 const _\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<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+639 {\n+640 if(std::is_convertible::value)\n+641 return static_cast(lhs).distanceTo(static_cast\n+(rhs))>0;\n+642 else\n+643 return static_cast(rhs).distanceTo(static_cast\n+(lhs))<0;\n+644 }\n+645\n+646\n+657 template\n+_\b6_\b5_\b9 inline typename _\bE_\bn_\ba_\bb_\bl_\be_\bI_\bf_\bI_\bn_\bt_\be_\br_\bO_\bp_\be_\br_\ba_\bb_\bl_\be_\b<_\bT_\b1_\b,_\bT_\b2_\b,_\bb_\bo_\bo_\bl_\b>_\b:_\b:_\bt_\by_\bp_\be\n+660 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const _\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<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+661 const _\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<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+662 {\n+663 if(std::is_convertible::value)\n+664 return static_cast(lhs).distanceTo(static_cast\n+(rhs))>=0;\n+665 else\n+666 return static_cast(rhs).distanceTo(static_cast\n+(lhs))<=0;\n+667 }\n+668\n+669\n+680 template\n+682 inline typename EnableIfInterOperable::type\n+_\b6_\b8_\b3 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>(const _\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<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+684 const _\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<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+685 {\n+686 if(std::is_convertible::value)\n+687 return static_cast(lhs).distanceTo(static_cast\n+(rhs))<0;\n+688 else\n+689 return static_cast(rhs).distanceTo(static_cast\n+(lhs))>0;\n+690 }\n+691\n+702 template\n+704 inline typename EnableIfInterOperable::type\n+_\b7_\b0_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=(const _\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<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+706 const _\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<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+707 {\n+708 if(std::is_convertible::value)\n+709 return static_cast(lhs).distanceTo(static_cast\n+(rhs))<=0;\n+710 else\n+711 return static_cast(rhs).distanceTo(static_cast\n+(lhs))>=0;\n+712 }\n+713\n+724 template\n+726 inline typename EnableIfInterOperable::type\n+_\b7_\b2_\b7 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(const _\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<_\bT_\b1_\b,_\bV_\b1_\b,_\bR_\b1_\b,_\bD_\b>& lhs,\n+728 const _\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<_\bT_\b2_\b,_\bV_\b2_\b,_\bR_\b2_\b,_\bD_\b>& rhs)\n+729 {\n+730 if(std::is_convertible::value)\n+731 return -static_cast(lhs).distanceTo(static_cast\n+(rhs));\n+732 else\n+733 return static_cast(rhs).distanceTo(static_cast(lhs));\n+734 }\n+735\n+737}\n+738#endif\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:_\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+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:637\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:683\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:660\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:237\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:705\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:259\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_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf_\b__\bt\n-std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))>\n-ResolveRef_t\n-Type trait to resolve std::reference_wrapper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn referencehelper.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\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:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+std::forward_iterator_tag iterator_category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+V * pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\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+_\b+\n+DerivedType & operator++()\n+Preincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\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 iteratorfacades.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\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 iteratorfacades.hh:195\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\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-_\b>\n+Pointer operator->() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be\n+T DerivedType\n+The type of derived iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bV_\ba_\bl_\bu_\be\n+V Value\n+The type of value accessed through the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+typename std::remove_const< V >::type value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\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+_\b+\n+DerivedType operator++(int)\n+Postincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br\n+V * Pointer\n+The pointer to the Value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+D difference_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\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+Reference operator*() const\n+Dereferencing operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:198\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+R reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:149\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:274\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_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+V * pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:281\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_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+typename std::remove_const< V >::type value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:279\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_\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:332\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_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+D difference_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:280\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_\b:_\b:_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be\n+T DerivedType\n+The type of derived iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:309\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n+DerivedType & operator--()\n+Preincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:359\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n+Pointer operator->() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:337\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+DerivedType & operator++()\n+Preincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:343\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_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br\n+V * Pointer\n+The pointer to the Value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:319\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_\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 iteratorfacades.hh:329\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+DerivedType operator++(int)\n+Postincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:350\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_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+std::bidirectional_iterator_tag iterator_category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:278\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_\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 iteratorfacades.hh:324\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n+DerivedType operator--(int)\n+Postincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:366\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_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+R reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:282\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_\b:_\b:_\bV_\ba_\bl_\bu_\be\n+V Value\n+The type of value accessed through the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:314\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:434\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:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+typename std::remove_const< V >::type value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:439\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:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+D difference_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:440\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n+DerivedType operator--(int)\n+Postdecrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:557\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:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+V * pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:441\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:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+std::random_access_iterator_tag iterator_category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:438\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:_\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:500\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+DerivedType & operator++()\n+Preincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:521\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:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+R reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:442\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n+Pointer operator->() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:505\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:_\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 iteratorfacades.hh:492\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n+DerivedType & operator--()\n+Predecrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:550\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+DerivedType & operator-=(DifferenceType n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:564\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n+DerivedType operator+(DifferenceType n) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:541\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+Reference operator[](DifferenceType n) const\n+Get the element n positions from the current one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:515\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:_\bD_\be_\br_\bi_\bv_\be_\bd_\bT_\by_\bp_\be\n+T DerivedType\n+The type of derived iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:477\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:_\bP_\bo_\bi_\bn_\bt_\be_\br\n+V * Pointer\n+The pointer to the Value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:487\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n+DerivedType operator-(DifferenceType n) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:570\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+DerivedType operator++(int)\n+Postincrement operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:528\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:_\bV_\ba_\bl_\bu_\be\n+V Value\n+The type of value accessed through the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:482\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+DerivedType & operator+=(DifferenceType n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn iteratorfacades.hh:535\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:_\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 iteratorfacades.hh:497\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 ===============================================================================\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: rangeutilities.hh File Reference\n+dune-common: matvectraits.hh File Reference\n \n \n \n \n \n \n \n@@ -71,120 +71,37 @@\n \n \n \n
\n \n-
rangeutilities.hh File Reference
\n+Namespaces
\n+
matvectraits.hh File Reference
\n \n
\n \n-

Utilities for reduction like operations on ranges. \n+

Documentation of the traits classes you need to write for each implementation of DenseVector or DenseMatrix. \n More...

\n-
#include <dune/common/typetraits.hh>
\n-#include <algorithm>
\n-#include <utility>
\n-#include <type_traits>
\n-#include <bitset>
\n-
\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 Classes

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...
struct  Dune::DenseMatVecTraits< 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-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\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, const F &f)
 Create a TransformedRangeView.
 
template<class R , class F >
auto Dune::iteratorTransformedRangeView (R &&range, const 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

Detailed Description

\n-

Utilities for reduction like operations on ranges.

\n-
Author
Christian Engwer
\n+

Documentation of the traits classes you need to write for each implementation of DenseVector or DenseMatrix.

\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,132 +1,23 @@\n dune-common\u00a02.9.0\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 | _\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 <_\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 \n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+matvectraits.hh File Reference\n+Documentation of the traits classes you need to write for each implementation\n+of DenseVector or DenseMatrix. _\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- 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+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 _\bT_\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::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- const 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, const 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+Documentation of the traits classes you need to write for each implementation\n+of DenseVector or DenseMatrix.\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: rangeutilities.hh Source File\n+dune-common: matvectraits.hh Source File\n \n \n \n \n \n \n \n@@ -74,707 +74,37 @@\n \n
\n \n
\n
\n
\n-
rangeutilities.hh
\n+
matvectraits.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 (C) 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_RANGE_UTILITIES_HH
\n-
6#define DUNE_COMMON_RANGE_UTILITIES_HH
\n+
5#ifndef DUNE_MATVECTRAITS_HH
\n+
6#define DUNE_MATVECTRAITS_HH
\n
7
\n-\n-
9#include <algorithm>
\n-
10#include <utility>
\n-
11#include <type_traits>
\n-
12#include <bitset>
\n+
12namespace Dune {
\n
13
\n-
21namespace Dune
\n-
22{
\n-
23
\n-
34 template <typename T,
\n-
35 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
\n-
36 typename T::value_type
\n-
\n-
37 max_value(const T & v) {
\n-
38 using std::max_element;
\n-
39 return *max_element(v.begin(), v.end());
\n-
40 }
\n-
\n-
41
\n-
42 template <typename T,
\n-
43 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
\n-
44 const T & max_value(const T & v) { return v; }
\n-
45
\n-
51 template <typename T,
\n-
52 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
\n-
53 typename T::value_type
\n-
\n-
54 min_value(const T & v) {
\n-
55 using std::min_element;
\n-
56 return *min_element(v.begin(), v.end());
\n-
57 }
\n-
\n-
58
\n-
59 template <typename T,
\n-
60 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
\n-
61 const T & min_value(const T & v) { return v; }
\n-
62
\n-
68 template <typename T,
\n-
69 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
\n-
\n-
70 bool any_true(const T & v) {
\n-
71 bool b = false;
\n-
72 for (const auto & e : v)
\n-
73 b = b or bool(e);
\n-
74 return b;
\n-
75 }
\n-
\n-
76
\n-
77 template <typename T,
\n-
78 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
\n-
79 bool any_true(const T & v) { return v; }
\n-
80
\n-
81 template<std::size_t N>
\n-
\n-
82 bool any_true(const std::bitset<N> & b)
\n-
83 {
\n-
84 return b.any();
\n-
85 }
\n-
\n-
86
\n-
92 template <typename T,
\n-
93 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
\n-
\n-
94 bool all_true(const T & v) {
\n-
95 bool b = true;
\n-
96 for (const auto & e : v)
\n-
97 b = b and bool(e);
\n-
98 return b;
\n-
99 }
\n-
\n-
100
\n-
101 template <typename T,
\n-
102 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
\n-
103 bool all_true(const T & v) { return v; }
\n-
104
\n-
105 template<std::size_t N>
\n-
\n-
106 bool all_true(const std::bitset<N> & b)
\n-
107 {
\n-
108 return b.all();
\n-
109 }
\n-
\n-
110
\n-
111
\n-
112
\n-
113 namespace Impl
\n-
114 {
\n-
115
\n-
116 template <class T>
\n-
117 class IntegralRangeIterator
\n-
118 {
\n-
119 public:
\n-
120 typedef std::random_access_iterator_tag iterator_category;
\n-
121 typedef T value_type;
\n-
122 typedef std::make_signed_t<T> difference_type;
\n-
123 typedef const T *pointer;
\n-
124 typedef T reference;
\n-
125
\n-
126 constexpr IntegralRangeIterator() noexcept : value_(0) {}
\n-
127 constexpr explicit IntegralRangeIterator(value_type value) noexcept : value_(value) {}
\n-
128
\n-
129 pointer operator->() const noexcept { return &value_; }
\n-
130 constexpr reference operator*() const noexcept { return value_; }
\n-
131
\n-
132 constexpr reference operator[]( difference_type n ) const noexcept { return (value_ + n); }
\n-
133
\n-
134 constexpr bool operator==(const IntegralRangeIterator & other) const noexcept { return (value_ == other.value_); }
\n-
135 constexpr bool operator!=(const IntegralRangeIterator & other) const noexcept { return (value_ != other.value_); }
\n-
136
\n-
137 constexpr bool operator<(const IntegralRangeIterator & other) const noexcept { return (value_ <= other.value_); }
\n-
138 constexpr bool operator<=(const IntegralRangeIterator & other) const noexcept { return (value_ <= other.value_); }
\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
\n-
142 IntegralRangeIterator& operator++() noexcept { ++value_; return *this; }
\n-
143 IntegralRangeIterator operator++(int) noexcept { IntegralRangeIterator copy( *this ); ++(*this); return copy; }
\n-
144
\n-
145 IntegralRangeIterator& operator--() noexcept { --value_; return *this; }
\n-
146 IntegralRangeIterator operator--(int) noexcept { IntegralRangeIterator copy( *this ); --(*this); return copy; }
\n-
147
\n-
148 IntegralRangeIterator& operator+=(difference_type n) noexcept { value_ += n; return *this; }
\n-
149 IntegralRangeIterator& operator-=(difference_type n) noexcept { value_ -= n; return *this; }
\n-
150
\n-
151 friend constexpr IntegralRangeIterator operator+(const IntegralRangeIterator &a, difference_type n) noexcept { return IntegralRangeIterator(a.value_ + n); }
\n-
152 friend constexpr IntegralRangeIterator operator+(difference_type n, const IntegralRangeIterator &a) noexcept { return IntegralRangeIterator(a.value_ + n); }
\n-
153 friend constexpr IntegralRangeIterator operator-(const IntegralRangeIterator &a, difference_type n) noexcept { return IntegralRangeIterator(a.value_ - n); }
\n-
154
\n-
155 constexpr difference_type operator-(const IntegralRangeIterator &other) const noexcept { return (static_cast<difference_type>(value_) - static_cast<difference_type>(other.value_)); }
\n-
156
\n-
157 private:
\n-
158 value_type value_;
\n-
159 };
\n-
160
\n-
161 } // namespace Impl
\n-
162
\n-
163
\n-
164
\n-
173 template <class T>
\n-
\n-\n-
175 {
\n-
176 public:
\n-
178 typedef T value_type;
\n-
180 typedef Impl::IntegralRangeIterator<T> iterator;
\n-
182 typedef std::make_unsigned_t<T> size_type;
\n-
183
\n-
185 constexpr IntegralRange(value_type from, value_type to) noexcept : from_(from), to_(to) {}
\n-
187 constexpr explicit IntegralRange(value_type to) noexcept : from_(0), to_(to) {}
\n-
189 constexpr IntegralRange(std::pair<value_type, value_type> range) noexcept : from_(range.first), to_(range.second) {}
\n-
190
\n-
192 constexpr iterator begin() const noexcept { return iterator(from_); }
\n-
194 constexpr iterator end() const noexcept { return iterator(to_); }
\n-
195
\n-
197 constexpr value_type operator[](const value_type &i) const noexcept { return (from_ + i); }
\n-
198
\n-
200 constexpr bool empty() const noexcept { return (from_ == to_); }
\n-
202 constexpr size_type size() const noexcept { return (static_cast<size_type>(to_) - static_cast<size_type>(from_)); }
\n-
203
\n-
204 private:
\n-
205 value_type from_, to_;
\n-
206 };
\n-
\n-
207
\n-
208
\n-
223 template <class T, T to, T from = 0>
\n-
\n-\n-
225 {
\n-
226 template <T ofs, T... i>
\n-
227 static std::integer_sequence<T, (i+ofs)...> shift_integer_sequence(std::integer_sequence<T, i...>);
\n-
228
\n-
229 public:
\n-
231 typedef T value_type;
\n-
233 typedef Impl::IntegralRangeIterator<T> iterator;
\n-
235 typedef std::make_unsigned_t<T> size_type;
\n-
236
\n-
238 typedef decltype(shift_integer_sequence<from>(std::make_integer_sequence<T, to-from>())) integer_sequence;
\n-
239
\n-
241 constexpr StaticIntegralRange() noexcept = default;
\n-
242
\n-
244 constexpr operator IntegralRange<T>() const noexcept { return {from, to}; }
\n-
246 constexpr operator integer_sequence() const noexcept { return {}; }
\n-
247
\n-
249 static constexpr iterator begin() noexcept { return iterator(from); }
\n-
251 static constexpr iterator end() noexcept { return iterator(to); }
\n-
252
\n-
254 template <class U, U i>
\n-
\n-
255 constexpr auto operator[](const std::integral_constant<U, i> &) const noexcept
\n-
256 -> std::integral_constant<value_type, from + static_cast<value_type>(i)>
\n-
257 {
\n-
258 return {};
\n-
259 }
\n-
\n-
260
\n-
262 constexpr value_type operator[](const size_type &i) const noexcept { return (from + static_cast<value_type>(i)); }
\n-
263
\n-
265 static constexpr std::integral_constant<bool, from == to> empty() noexcept { return {}; }
\n-
267 static constexpr std::integral_constant<size_type, static_cast<size_type>(to) - static_cast<size_type>(from) > size() noexcept { return {}; }
\n-
268 };
\n-
\n-
269
\n-
279 template<class T, class U,
\n-
280 std::enable_if_t<std::is_same<std::decay_t<T>, std::decay_t<U>>::value, int> = 0,
\n-
281 std::enable_if_t<std::is_integral<std::decay_t<T>>::value, int> = 0>
\n-
\n-
282 inline static IntegralRange<std::decay_t<T>> range(T &&from, U &&to) noexcept
\n-
283 {
\n-
284 return IntegralRange<std::decay_t<T>>(std::forward<T>(from), std::forward<U>(to));
\n-
285 }
\n-
\n-
286
\n-
287 template<class T, std::enable_if_t<std::is_integral<std::decay_t<T>>::value, int> = 0>
\n-
\n-
288 inline static IntegralRange<std::decay_t<T>> range(T &&to) noexcept
\n-
289 {
\n-
290 return IntegralRange<std::decay_t<T>>(std::forward<T>(to));
\n-
291 }
\n-
\n-
292
\n-
293 template<class T, std::enable_if_t<std::is_enum<std::decay_t<T>>::value, int> = 0>
\n-
\n-\n-
295 {
\n-
296 return IntegralRange<std::underlying_type_t<std::decay_t<T>>>(std::forward<T>(to));
\n-
297 }
\n-
\n-
298
\n-
299 template<class T, T from, T to>
\n-
\n-
300 inline static StaticIntegralRange<T, to, from> range(std::integral_constant<T, from>, std::integral_constant<T, to>) noexcept
\n-
301 {
\n-
302 return {};
\n-
303 }
\n-
\n-
304
\n-
305 template<class T, T to>
\n-
\n-
306 inline static StaticIntegralRange<T, to> range(std::integral_constant<T, to>) noexcept
\n-
307 {
\n-
308 return {};
\n-
309 }
\n-
\n-
310
\n-
311
\n-
312
\n-\n-
317
\n-\n-
322
\n-
323 namespace Impl
\n-
324 {
\n-
325
\n-
326 // Helper class to mimic a pointer for proxy objects.
\n-
327 // This is needed to implement operator-> on an iterator
\n-
328 // using proxy-values. It stores the proxy value but
\n-
329 // provides operator-> like a pointer.
\n-
330 template<class ProxyType>
\n-
331 class PointerProxy
\n-
332 {
\n-
333 public:
\n-
334 PointerProxy(ProxyType&& p) : p_(p)
\n-
335 {}
\n-
336
\n-
337 ProxyType* operator->()
\n-
338 {
\n-
339 return &p_;
\n-
340 }
\n-
341
\n-
342 ProxyType p_;
\n-
343 };
\n-
344
\n-
345 // An iterator transforming a wrapped iterator using
\n-
346 // an unary function. It inherits the iterator-category
\n-
347 // of the underlying iterator.
\n-
348 template <class I, class F, class TransformationType, class C = typename std::iterator_traits<I>::iterator_category>
\n-
349 class TransformedRangeIterator;
\n-
350
\n-
351 template <class I, class F, class TransformationType>
\n-
352 class TransformedRangeIterator<I,F,TransformationType,std::forward_iterator_tag>
\n-
353 {
\n-
354 protected:
\n-
355
\n-
356 static decltype(auto) transform(const F& f, const I& it) {
\n-
357 if constexpr (std::is_same_v<TransformationType,IteratorTransformationTag>)
\n-
358 return f(it);
\n-
359 else
\n-
360 return f(*it);
\n-
361 }
\n-
362
\n-
363 public:
\n-
364 using iterator_category = std::forward_iterator_tag;
\n-
365 using reference = decltype(transform(std::declval<F>(), std::declval<I>()));
\n-
366 using value_type = std::decay_t<reference>;
\n-
367 using pointer = PointerProxy<value_type>;
\n-
368
\n-
369 // If we later want to allow standalone TransformedRangeIterators,
\n-
370 // we could customize the FunctionPointer to be a default-constructible,
\n-
371 // copy-assignable type storing a function but acting like a pointer
\n-
372 // to function.
\n-
373 using FunctionPointer = const F*;
\n-
374
\n-
375 constexpr TransformedRangeIterator(const I& it, FunctionPointer f) noexcept :
\n-
376 it_(it),
\n-
377 f_(f)
\n-
378 {}
\n-
379
\n-
380 // Explicitly initialize members. Using a plain
\n-
381 //
\n-
382 // constexpr TransformedRangeIterator() noexcept {}
\n-
383 //
\n-
384 // would default-initialize the members while
\n-
385 //
\n-
386 // constexpr TransformedRangeIterator() noexcept : it_(), f_() {}
\n-
387 //
\n-
388 // leads to value-initialization. This is a case where
\n-
389 // both are really different. If it_ is a raw pointer (i.e. POD)
\n-
390 // then default-initialization leaves it uninitialized while
\n-
391 // value-initialization zero-initializes it.
\n-
392 constexpr TransformedRangeIterator() noexcept :
\n-
393 it_(),
\n-
394 f_()
\n-
395 {}
\n-
396
\n-
397 // Dereferencing returns a value created by the function
\n-
398 constexpr reference operator*() const noexcept {
\n-
399 return transform(*f_, it_);
\n-
400 }
\n-
401
\n-
402 // Dereferencing returns a value created by the function
\n-
403 pointer operator->() const noexcept {
\n-
404 return transform(*f_, it_);
\n-
405 }
\n-
406
\n-
407 constexpr TransformedRangeIterator& operator=(const TransformedRangeIterator& other) = default;
\n-
408
\n-
409 constexpr bool operator==(const TransformedRangeIterator& other) const noexcept {
\n-
410 return (it_ == other.it_);
\n-
411 }
\n-
412
\n-
413 constexpr bool operator!=(const TransformedRangeIterator& other) const noexcept {
\n-
414 return (it_ != other.it_);
\n-
415 }
\n-
416
\n-
417 TransformedRangeIterator& operator++() noexcept {
\n-
418 ++it_;
\n-
419 return *this;
\n-
420 }
\n-
421
\n-
422 TransformedRangeIterator operator++(int) noexcept {
\n-
423 TransformedRangeIterator copy(*this);
\n-
424 ++(*this);
\n-
425 return copy;
\n-
426 }
\n-
427
\n-
428 protected:
\n-
429 I it_;
\n-
430 FunctionPointer f_;
\n-
431 };
\n-
432
\n-
433
\n-
434
\n-
435 template <class I, class F, class T>
\n-
436 class TransformedRangeIterator<I,F,T,std::bidirectional_iterator_tag> :
\n-
437 public TransformedRangeIterator<I,F,T,std::forward_iterator_tag>
\n-
438 {
\n-
439 protected:
\n-
440 using Base = TransformedRangeIterator<I,F,T,std::forward_iterator_tag>;
\n-
441 using Base::it_;
\n-
442 using Base::f_;
\n-
443 public:
\n-
444 using iterator_category = std::bidirectional_iterator_tag;
\n-
445 using reference = typename Base::reference;
\n-
446 using value_type = typename Base::value_type;
\n-
447 using pointer = typename Base::pointer;
\n-
448
\n-
449 using FunctionPointer = typename Base::FunctionPointer;
\n-
450
\n-
451 using Base::Base;
\n-
452
\n-
453 // Member functions of the forward_iterator that need
\n-
454 // to be redefined because the base class methods return a
\n-
455 // forward_iterator.
\n-
456 constexpr TransformedRangeIterator& operator=(const TransformedRangeIterator& other) = default;
\n-
457
\n-
458 TransformedRangeIterator& operator++() noexcept {
\n-
459 ++it_;
\n-
460 return *this;
\n-
461 }
\n-
462
\n-
463 TransformedRangeIterator operator++(int) noexcept {
\n-
464 TransformedRangeIterator copy(*this);
\n-
465 ++(*this);
\n-
466 return copy;
\n-
467 }
\n-
468
\n-
469 // Additional member functions of bidirectional_iterator
\n-
470 TransformedRangeIterator& operator--() noexcept {
\n-
471 --(this->it_);
\n-
472 return *this;
\n-
473 }
\n-
474
\n-
475 TransformedRangeIterator operator--(int) noexcept {
\n-
476 TransformedRangeIterator copy(*this);
\n-
477 --(*this);
\n-
478 return copy;
\n-
479 }
\n-
480 };
\n-
481
\n-
482
\n-
483
\n-
484 template <class I, class F, class T>
\n-
485 class TransformedRangeIterator<I,F,T,std::random_access_iterator_tag> :
\n-
486 public TransformedRangeIterator<I,F,T,std::bidirectional_iterator_tag>
\n-
487 {
\n-
488 protected:
\n-
489 using Base = TransformedRangeIterator<I,F,T,std::bidirectional_iterator_tag>;
\n-
490 using Base::it_;
\n-
491 using Base::f_;
\n-
492 public:
\n-
493 using iterator_category = std::random_access_iterator_tag;
\n-
494 using reference = typename Base::reference;
\n-
495 using value_type = typename Base::value_type;
\n-
496 using pointer = typename Base::pointer;
\n-
497 using difference_type = typename std::iterator_traits<I>::difference_type;
\n-
498
\n-
499 using FunctionPointer = typename Base::FunctionPointer;
\n-
500
\n-
501 using Base::Base;
\n-
502
\n-
503 // Member functions of the forward_iterator that need
\n-
504 // to be redefined because the base class methods return a
\n-
505 // forward_iterator.
\n-
506 constexpr TransformedRangeIterator& operator=(const TransformedRangeIterator& other) = default;
\n-
507
\n-
508 TransformedRangeIterator& operator++() noexcept {
\n-
509 ++it_;
\n-
510 return *this;
\n-
511 }
\n-
512
\n-
513 TransformedRangeIterator operator++(int) noexcept {
\n-
514 TransformedRangeIterator copy(*this);
\n-
515 ++(*this);
\n-
516 return copy;
\n-
517 }
\n-
518
\n-
519 // Member functions of the bidirectional_iterator that need
\n-
520 // to be redefined because the base class methods return a
\n-
521 // bidirectional_iterator.
\n-
522 TransformedRangeIterator& operator--() noexcept {
\n-
523 --(this->it_);
\n-
524 return *this;
\n-
525 }
\n-
526
\n-
527 TransformedRangeIterator operator--(int) noexcept {
\n-
528 TransformedRangeIterator copy(*this);
\n-
529 --(*this);
\n-
530 return copy;
\n-
531 }
\n-
532
\n-
533 // Additional member functions of random_access_iterator
\n-
534 TransformedRangeIterator& operator+=(difference_type n) noexcept {
\n-
535 it_ += n;
\n-
536 return *this;
\n-
537 }
\n-
538
\n-
539 TransformedRangeIterator& operator-=(difference_type n) noexcept {
\n-
540 it_ -= n;
\n-
541 return *this;
\n-
542 }
\n-
543
\n-
544 bool operator<(const TransformedRangeIterator& other) noexcept {
\n-
545 return it_<other.it_;
\n-
546 }
\n-
547
\n-
548 bool operator<=(const TransformedRangeIterator& other) noexcept {
\n-
549 return it_<=other.it_;
\n-
550 }
\n-
551
\n-
552 bool operator>(const TransformedRangeIterator& other) noexcept {
\n-
553 return it_>other.it_;
\n-
554 }
\n-
555
\n-
556 bool operator>=(const TransformedRangeIterator& other) noexcept {
\n-
557 return it_>=other.it_;
\n-
558 }
\n-
559
\n-
560 reference operator[](difference_type n) noexcept {
\n-
561 return Base::transform(*f_, it_+n);
\n-
562 }
\n-
563
\n-
564 friend
\n-
565 TransformedRangeIterator operator+(const TransformedRangeIterator& it, difference_type n) noexcept {
\n-
566 return TransformedRangeIterator(it.it_+n, it.f_);
\n-
567 }
\n-
568
\n-
569 friend
\n-
570 TransformedRangeIterator operator+(difference_type n, const TransformedRangeIterator& it) noexcept {
\n-
571 return TransformedRangeIterator(n+it.it_, it.f_);
\n-
572 }
\n-
573
\n-
574 friend
\n-
575 TransformedRangeIterator operator-(const TransformedRangeIterator& it, difference_type n) noexcept {
\n-
576 return TransformedRangeIterator(it.it_-n, it.f_);
\n-
577 }
\n-
578
\n-
579 friend
\n-
580 difference_type operator-(const TransformedRangeIterator& first, const TransformedRangeIterator& second) noexcept {
\n-
581 return first.it_-second.it_;
\n-
582 }
\n-
583 };
\n-
584
\n-
585
\n-
586 } // namespace Impl
\n-
587
\n-
588
\n-
589
\n-
626 template <class R, class F, class T=ValueTransformationTag>
\n-
\n-\n-
628 {
\n-
629 using RawConstIterator = std::decay_t<decltype(std::declval<const R>().begin())>;
\n-
630 using RawIterator = std::decay_t<decltype(std::declval<R>().begin())>;
\n-
631
\n-
632 public:
\n-
633
\n-
640 using const_iterator = Impl::TransformedRangeIterator<RawConstIterator, F, T>;
\n-
641
\n-
648 using iterator = Impl::TransformedRangeIterator<RawIterator, F, T>;
\n-
649
\n-
656 using RawRange = std::remove_reference_t<R>;
\n-
657
\n-
661 template<class RR>
\n-
\n-
662 constexpr TransformedRangeView(RR&& rawRange, const F& f) noexcept :
\n-
663 rawRange_(std::forward<RR>(rawRange)),
\n-
664 f_(f)
\n-
665 {
\n-
666 static_assert(std::is_same_v<T, ValueTransformationTag> or std::is_same_v<T, IteratorTransformationTag>,
\n-
667 "The TransformationType passed to TransformedRangeView has to be either ValueTransformationTag or IteratorTransformationTag.");
\n-
668 }
\n-
\n-
669
\n-
\n-
678 constexpr const_iterator begin() const noexcept {
\n-
679 return const_iterator(rawRange_.begin(), &f_);
\n-
680 }
\n-
\n-
681
\n-
\n-
682 constexpr iterator begin() noexcept {
\n-
683 return iterator(rawRange_.begin(), &f_);
\n-
684 }
\n-
\n-
685
\n-
\n-
694 constexpr const_iterator end() const noexcept {
\n-
695 return const_iterator(rawRange_.end(), &f_);
\n-
696 }
\n-
\n-
697
\n-
\n-
698 constexpr iterator end() noexcept {
\n-
699 return iterator(rawRange_.end(), &f_);
\n-
700 }
\n-
\n-
701
\n-
712 template<class Dummy=R,
\n-
713 class = std::void_t<decltype(std::declval<Dummy>().size())>>
\n-
\n-
714 auto size() const
\n-
715 {
\n-
716 return rawRange_.size();
\n-
717 }
\n-
\n-
718
\n-
\n-
722 const RawRange& rawRange() const
\n-
723 {
\n-
724 return rawRange_;
\n-
725 }
\n-
\n-
726
\n-
\n-\n-
731 {
\n-
732 return rawRange_;
\n-
733 }
\n-
\n-
734
\n-
735 private:
\n-
736 R rawRange_;
\n-
737 F f_;
\n-
738 };
\n-
\n-
739
\n-
768 template <class R, class F>
\n-
\n-
769 auto transformedRangeView(R&& range, const F& f)
\n-
770 {
\n-\n-
772 }
\n-
\n-
773
\n-
801 template <class R, class F>
\n-
\n-\n-
803 {
\n-\n-
805 }
\n-
\n-
806
\n-
807
\n-
820 template<class Range>
\n-
\n-
821 auto sparseRange(Range&& range) {
\n-
822 return Dune::iteratorTransformedRangeView(std::forward<Range>(range), [](auto&& it) {
\n-
823 return std::tuple<decltype(*it), decltype(it.index())>(*it, it.index());
\n-
824 });
\n-
825 }
\n-
\n-
826
\n-
831}
\n-
832
\n-
833#endif // DUNE_COMMON_RANGE_UTILITIES_HH
\n-
Traits for type conversions and type information.
\n-
auto sparseRange(Range &&range)
Allow structured-binding for-loops for sparse iterators.
Definition rangeutilities.hh:821
\n-
auto iteratorTransformedRangeView(R &&range, const F &f)
Create a TransformedRangeView using an iterator transformation.
Definition rangeutilities.hh:802
\n-
auto transformedRangeView(R &&range, const F &f)
Create a TransformedRangeView.
Definition rangeutilities.hh:769
\n-
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition rangeutilities.hh:300
\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:637
\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:683
\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:660
\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:237
\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:705
\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:259
\n-
STL namespace.
\n+
22
\n+
24
\n+
26
\n+
30 template<class T>
\n+\n+
32
\n+
33} // end namespace Dune
\n+
34
\n+
35#endif // DUNE_FTRAITS_HH
\n
Dune namespace.
Definition alignedallocator.hh:13
\n-
bool any_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:493
\n-
bool all_true(const AlignedNumber< bool, align > &val)
Definition debugalign.hh:499
\n-
T max_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:481
\n-
T min_value(const AlignedNumber< T, align > &val)
Definition debugalign.hh:487
\n-
dynamic integer range for use in range-based for loops
Definition rangeutilities.hh:175
\n-
constexpr iterator begin() const noexcept
obtain a random-access iterator to the first element
Definition rangeutilities.hh:192
\n-
constexpr iterator end() const noexcept
obtain a random-access iterator past the last element
Definition rangeutilities.hh:194
\n-
std::make_unsigned_t< T > size_type
unsigned integer type corresponding to value_type
Definition rangeutilities.hh:182
\n-
Impl::IntegralRangeIterator< T > iterator
type of iterator
Definition rangeutilities.hh:180
\n-
constexpr value_type operator[](const value_type &i) const noexcept
access specified element
Definition rangeutilities.hh:197
\n-
constexpr bool empty() const noexcept
check whether the range is empty
Definition rangeutilities.hh:200
\n-
constexpr IntegralRange(std::pair< value_type, value_type > range) noexcept
construct integer range std::pair
Definition rangeutilities.hh:189
\n-
constexpr IntegralRange(value_type from, value_type to) noexcept
construct integer range [from, to)
Definition rangeutilities.hh:185
\n-
constexpr size_type size() const noexcept
obtain number of elements in the range
Definition rangeutilities.hh:202
\n-
constexpr IntegralRange(value_type to) noexcept
construct integer range [0, to)
Definition rangeutilities.hh:187
\n-
T value_type
type of integers contained in the range
Definition rangeutilities.hh:178
\n-
static integer range for use in range-based for loops
Definition rangeutilities.hh:225
\n-
static constexpr iterator end() noexcept
obtain a random-access iterator past the last element
Definition rangeutilities.hh:251
\n-
decltype(shift_integer_sequence< from >(std::make_integer_sequence< T, to-from >())) integer_sequence
type of corresponding std::integer_sequence
Definition rangeutilities.hh:238
\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:235
\n-
T value_type
type of integers contained in the range
Definition rangeutilities.hh:231
\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:255
\n-
static constexpr std::integral_constant< bool, from==to > empty() noexcept
check whether the range is empty
Definition rangeutilities.hh:265
\n-
static constexpr iterator begin() noexcept
obtain a random-access iterator to the first element
Definition rangeutilities.hh:249
\n-
constexpr value_type operator[](const size_type &i) const noexcept
access specified element (dynamic version)
Definition rangeutilities.hh:262
\n-
Impl::IntegralRangeIterator< T > iterator
type of iterator
Definition rangeutilities.hh:233
\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:267
\n-
Tag to enable value based transformations in TransformedRangeView.
Definition rangeutilities.hh:316
\n-
Tag to enable iterator based transformations in TransformedRangeView.
Definition rangeutilities.hh:321
\n-
A range transforming the values of another range on-the-fly.
Definition rangeutilities.hh:628
\n-
auto size() const
Obtain the size of the range.
Definition rangeutilities.hh:714
\n-
constexpr iterator end() noexcept
Definition rangeutilities.hh:698
\n-
std::remove_reference_t< R > RawRange
Export type of the wrapped untransformed range.
Definition rangeutilities.hh:656
\n-
Impl::TransformedRangeIterator< RawConstIterator, F, T > const_iterator
Const iterator type.
Definition rangeutilities.hh:640
\n-
constexpr iterator begin() noexcept
Definition rangeutilities.hh:682
\n-
constexpr TransformedRangeView(RR &&rawRange, const F &f) noexcept
Construct from range and function.
Definition rangeutilities.hh:662
\n-
const RawRange & rawRange() const
Export the wrapped untransformed range.
Definition rangeutilities.hh:722
\n-
Impl::TransformedRangeIterator< RawIterator, F, T > iterator
Iterator type.
Definition rangeutilities.hh:648
\n-
constexpr const_iterator begin() const noexcept
Obtain a iterator to the first element.
Definition rangeutilities.hh:678
\n-
constexpr const_iterator end() const noexcept
Obtain a iterator past the last element.
Definition rangeutilities.hh:694
\n-
RawRange & rawRange()
Export the wrapped untransformed range.
Definition rangeutilities.hh:730
\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,880 +1,34 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-rangeutilities.hh\n+matvectraits.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 (C) 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_RANGE_UTILITIES_HH\n-6#define DUNE_COMMON_RANGE_UTILITIES_HH\n+5#ifndef DUNE_MATVECTRAITS_HH\n+6#define DUNE_MATVECTRAITS_HH\n 7\n-8#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-9#include \n-10#include \n-11#include \n-12#include \n+12namespace _\bD_\bu_\bn_\be {\n 13\n-21namespace _\bD_\bu_\bn_\be\n-22{\n-23\n-34 template ::value, int>::type = 0>\n-36 typename T::value_type\n-_\b3_\b7 _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const T & v) {\n-38 using std::max_element;\n-39 return *max_element(v.begin(), v.end());\n-40 }\n-41\n-42 template ::value, int>::type = 0>\n-_\b4_\b4 const T & _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const T & v) { return v; }\n-45\n-51 template ::value, int>::type = 0>\n-53 typename T::value_type\n-_\b5_\b4 _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const T & v) {\n-55 using std::min_element;\n-56 return *min_element(v.begin(), v.end());\n-57 }\n-58\n-59 template ::value, int>::type = 0>\n-_\b6_\b1 const T & _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const T & v) { return v; }\n-62\n-68 template ::value, int>::type = 0>\n-_\b7_\b0 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const T & v) {\n-71 bool b = false;\n-72 for (const auto & e : v)\n-73 b = b or bool(e);\n-74 return b;\n-75 }\n-76\n-77 template ::value, int>::type = 0>\n-79 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const T & v) { return v; }\n-80\n-81 template\n-_\b8_\b2 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const std::bitset & b)\n-83 {\n-84 return b.any();\n-85 }\n-86\n-92 template ::value, int>::type = 0>\n-_\b9_\b4 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const T & v) {\n-95 bool b = true;\n-96 for (const auto & e : v)\n-97 b = b and bool(e);\n-98 return b;\n-99 }\n-100\n-101 template ::value, int>::type = 0>\n-103 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const T & v) { return v; }\n-104\n-105 template\n-_\b1_\b0_\b6 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const std::bitset & b)\n-107 {\n-108 return b.all();\n-109 }\n-110\n-111\n-112\n-113 namespace Impl\n-114 {\n-115\n-116 template \n-117 class IntegralRangeIterator\n-118 {\n-119 public:\n-120 typedef std::random_access_iterator_tag iterator_category;\n-121 typedef T value_type;\n-122 typedef std::make_signed_t difference_type;\n-123 typedef const T *pointer;\n-124 typedef T reference;\n-125\n-126 constexpr IntegralRangeIterator() noexcept : value_(0) {}\n-127 constexpr explicit IntegralRangeIterator(value_type value) noexcept :\n-value_(value) {}\n-128\n-129 pointer operator->() const noexcept { return &value_; }\n-130 constexpr reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const noexcept { return value_; }\n-131\n-132 constexpr reference operator[]( difference_type n ) const noexcept { return\n-(value_ + n); }\n-133\n-134 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const IntegralRangeIterator & other) const\n-noexcept { return (value_ == other.value_); }\n-135 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const IntegralRangeIterator & other) const\n-noexcept { return (value_ != other.value_); }\n-136\n-137 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const IntegralRangeIterator & other) const\n-noexcept { return (value_ <= other.value_); }\n-138 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const IntegralRangeIterator & other) const\n-noexcept { return (value_ <= other.value_); }\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\n-142 IntegralRangeIterator& operator++() noexcept { ++value_; return *this; }\n-143 IntegralRangeIterator operator++(int) noexcept { IntegralRangeIterator copy\n-( *this ); ++(*this); return copy; }\n-144\n-145 IntegralRangeIterator& operator--() noexcept { --value_; return *this; }\n-146 IntegralRangeIterator operator--(int) noexcept { IntegralRangeIterator copy\n-( *this ); --(*this); return copy; }\n-147\n-148 IntegralRangeIterator& operator+=(difference_type n) noexcept { value_ +=\n-n; return *this; }\n-149 IntegralRangeIterator& operator-=(difference_type n) noexcept { value_ -\n-= n; return *this; }\n-150\n-151 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-152 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-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\n-155 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-156\n-157 private:\n-158 value_type value_;\n-159 };\n-160\n-161 } // namespace Impl\n-162\n-163\n-164\n-173 template \n-_\b1_\b7_\b4 class _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n-175 {\n-176 public:\n-_\b1_\b7_\b8 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b1_\b8_\b0 typedef Impl::IntegralRangeIterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b8_\b2 typedef std::make_unsigned_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-183\n-_\b1_\b8_\b5 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_\b7 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_\b8_\b9 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-190\n-_\b1_\b9_\b2 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_\b4 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-195\n-_\b1_\b9_\b7 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-198\n-_\b2_\b0_\b0 constexpr bool _\be_\bm_\bp_\bt_\by() const noexcept { return (from_ == to_); }\n-_\b2_\b0_\b2 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-203\n-204 private:\n-205 _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be from_, to_;\n-206 };\n-207\n-208\n-223 template \n-_\b2_\b2_\b4 class _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n-225 {\n-226 template \n-227 static std::integer_sequence shift_integer_sequence(std::\n-integer_sequence);\n-228\n-229 public:\n-_\b2_\b3_\b1 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b2_\b3_\b3 typedef Impl::IntegralRangeIterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b3_\b5 typedef std::make_unsigned_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-236\n-_\b2_\b3_\b8 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-239\n-_\b2_\b4_\b1 constexpr _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be() noexcept = default;\n-242\n-_\b2_\b4_\b4 constexpr operator _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be() const noexcept { return {from, to}; }\n-_\b2_\b4_\b6 constexpr operator _\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be() const noexcept { return {}; }\n-247\n-_\b2_\b4_\b9 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_\b1 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-252\n-254 template \n-_\b2_\b5_\b5 constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const std::integral_constant &) const\n-noexcept\n-256 -> std::integral_constant(i)>\n-257 {\n-258 return {};\n-259 }\n-260\n-_\b2_\b6_\b2 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-263\n-_\b2_\b6_\b5 static constexpr std::integral_constant _\be_\bm_\bp_\bt_\by() noexcept\n-{ return {}; }\n-_\b2_\b6_\b7 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-268 };\n-269\n-279 template, std::decay_t>::value,\n-int> = 0,\n-281 std::enable_if_t>::value, int> = 0>\n-_\b2_\b8_\b2 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-283 {\n-284 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-285 }\n-286\n-287 template>::\n-value, int> = 0>\n-_\b2_\b8_\b8 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-289 {\n-290 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-291 }\n-292\n-293 template>::value,\n-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:_\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-295 {\n-296 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-297 }\n-298\n-299 template\n-_\b3_\b0_\b0 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-301 {\n-302 return {};\n-303 }\n-304\n-305 template\n-_\b3_\b0_\b6 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-307 {\n-308 return {};\n-309 }\n-310\n-311\n-312\n-_\b3_\b1_\b6 struct _\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg {};\n-317\n-_\b3_\b2_\b1 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-322\n-323 namespace Impl\n-324 {\n-325\n-326 // Helper class to mimic a pointer for proxy objects.\n-327 // This is needed to implement operator-> on an iterator\n-328 // using proxy-values. It stores the proxy value but\n-329 // provides operator-> like a pointer.\n-330 template\n-331 class PointerProxy\n-332 {\n-333 public:\n-334 PointerProxy(ProxyType&& p) : p_(p)\n-335 {}\n-336\n-337 ProxyType* operator->()\n-338 {\n-339 return &p_;\n-340 }\n-341\n-342 ProxyType p_;\n-343 };\n-344\n-345 // An iterator transforming a wrapped iterator using\n-346 // an unary function. It inherits the iterator-category\n-347 // of the underlying iterator.\n-348 template ::iterator_category>\n-349 class TransformedRangeIterator;\n-350\n-351 template \n-352 class TransformedRangeIterator\n-353 {\n-354 protected:\n-355\n-356 static decltype(auto) transform(const F& f, const I& it) {\n-357 if constexpr (std::is_same_v)\n-358 return f(it);\n-359 else\n-360 return f(*it);\n-361 }\n-362\n-363 public:\n-364 using iterator_category = std::forward_iterator_tag;\n-365 using reference = decltype(transform(std::declval(), std::declval\n-()));\n-366 using value_type = std::decay_t;\n-367 using pointer = PointerProxy;\n-368\n-369 // If we later want to allow standalone TransformedRangeIterators,\n-370 // we could customize the FunctionPointer to be a default-constructible,\n-371 // copy-assignable type storing a function but acting like a pointer\n-372 // to function.\n-373 using FunctionPointer = const F*;\n-374\n-375 constexpr TransformedRangeIterator(const I& it, FunctionPointer f) noexcept\n-:\n-376 it_(it),\n-377 f_(f)\n-378 {}\n-379\n-380 // Explicitly initialize members. Using a plain\n-381 //\n-382 // constexpr TransformedRangeIterator() noexcept {}\n-383 //\n-384 // would default-initialize the members while\n-385 //\n-386 // constexpr TransformedRangeIterator() noexcept : it_(), f_() {}\n-387 //\n-388 // leads to value-initialization. This is a case where\n-389 // both are really different. If it_ is a raw pointer (i.e. POD)\n-390 // then default-initialization leaves it uninitialized while\n-391 // value-initialization zero-initializes it.\n-392 constexpr TransformedRangeIterator() noexcept :\n-393 it_(),\n-394 f_()\n-395 {}\n-396\n-397 // Dereferencing returns a value created by the function\n-398 constexpr reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const noexcept {\n-399 return transform(*f_, it_);\n-400 }\n-401\n-402 // Dereferencing returns a value created by the function\n-403 pointer operator->() const noexcept {\n-404 return transform(*f_, it_);\n-405 }\n-406\n-407 constexpr TransformedRangeIterator& operator=(const\n-TransformedRangeIterator& other) = default;\n-408\n-409 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const TransformedRangeIterator& other) const\n-noexcept {\n-410 return (it_ == other.it_);\n-411 }\n-412\n-413 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const TransformedRangeIterator& other) const\n-noexcept {\n-414 return (it_ != other.it_);\n-415 }\n-416\n-417 TransformedRangeIterator& operator++() noexcept {\n-418 ++it_;\n-419 return *this;\n-420 }\n-421\n-422 TransformedRangeIterator operator++(int) noexcept {\n-423 TransformedRangeIterator copy(*this);\n-424 ++(*this);\n-425 return copy;\n-426 }\n-427\n-428 protected:\n-429 I it_;\n-430 FunctionPointer f_;\n-431 };\n-432\n-433\n-434\n-435 template \n-436 class TransformedRangeIterator :\n-437 public TransformedRangeIterator\n-438 {\n-439 protected:\n-440 using Base = TransformedRangeIterator;\n-441 using Base::it_;\n-442 using Base::f_;\n-443 public:\n-444 using iterator_category = std::bidirectional_iterator_tag;\n-445 using reference = typename Base::reference;\n-446 using value_type = typename Base::value_type;\n-447 using pointer = typename Base::pointer;\n-448\n-449 using FunctionPointer = typename Base::FunctionPointer;\n-450\n-451 using Base::Base;\n-452\n-453 // Member functions of the forward_iterator that need\n-454 // to be redefined because the base class methods return a\n-455 // forward_iterator.\n-456 constexpr TransformedRangeIterator& operator=(const\n-TransformedRangeIterator& other) = default;\n-457\n-458 TransformedRangeIterator& operator++() noexcept {\n-459 ++it_;\n-460 return *this;\n-461 }\n-462\n-463 TransformedRangeIterator operator++(int) noexcept {\n-464 TransformedRangeIterator copy(*this);\n-465 ++(*this);\n-466 return copy;\n-467 }\n-468\n-469 // Additional member functions of bidirectional_iterator\n-470 TransformedRangeIterator& operator--() noexcept {\n-471 --(this->it_);\n-472 return *this;\n-473 }\n-474\n-475 TransformedRangeIterator operator--(int) noexcept {\n-476 TransformedRangeIterator copy(*this);\n-477 --(*this);\n-478 return copy;\n-479 }\n-480 };\n-481\n-482\n-483\n-484 template \n-485 class TransformedRangeIterator :\n-486 public TransformedRangeIterator\n-487 {\n-488 protected:\n-489 using Base = TransformedRangeIterator;\n-490 using Base::it_;\n-491 using Base::f_;\n-492 public:\n-493 using iterator_category = std::random_access_iterator_tag;\n-494 using reference = typename Base::reference;\n-495 using value_type = typename Base::value_type;\n-496 using pointer = typename Base::pointer;\n-497 using difference_type = typename std::iterator_traits::difference_type;\n-498\n-499 using FunctionPointer = typename Base::FunctionPointer;\n-500\n-501 using Base::Base;\n-502\n-503 // Member functions of the forward_iterator that need\n-504 // to be redefined because the base class methods return a\n-505 // forward_iterator.\n-506 constexpr TransformedRangeIterator& operator=(const\n-TransformedRangeIterator& other) = default;\n-507\n-508 TransformedRangeIterator& operator++() noexcept {\n-509 ++it_;\n-510 return *this;\n-511 }\n-512\n-513 TransformedRangeIterator operator++(int) noexcept {\n-514 TransformedRangeIterator copy(*this);\n-515 ++(*this);\n-516 return copy;\n-517 }\n-518\n-519 // Member functions of the bidirectional_iterator that need\n-520 // to be redefined because the base class methods return a\n-521 // bidirectional_iterator.\n-522 TransformedRangeIterator& operator--() noexcept {\n-523 --(this->it_);\n-524 return *this;\n-525 }\n-526\n-527 TransformedRangeIterator operator--(int) noexcept {\n-528 TransformedRangeIterator copy(*this);\n-529 --(*this);\n-530 return copy;\n-531 }\n-532\n-533 // Additional member functions of random_access_iterator\n-534 TransformedRangeIterator& operator+=(difference_type n) noexcept {\n-535 it_ += n;\n-536 return *this;\n-537 }\n-538\n-539 TransformedRangeIterator& operator-=(difference_type n) noexcept {\n-540 it_ -= n;\n-541 return *this;\n-542 }\n-543\n-544 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const TransformedRangeIterator& other) noexcept {\n-545 return it_(const TransformedRangeIterator& other) noexcept {\n-553 return it_>other.it_;\n-554 }\n-555\n-556 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=(const TransformedRangeIterator& other) noexcept {\n-557 return it_>=other.it_;\n-558 }\n-559\n-560 reference operator[](difference_type n) noexcept {\n-561 return Base::transform(*f_, it_+n);\n-562 }\n-563\n-564 friend\n-565 TransformedRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(const TransformedRangeIterator& it,\n-difference_type n) noexcept {\n-566 return TransformedRangeIterator(it.it_+n, it.f_);\n-567 }\n-568\n-569 friend\n-570 TransformedRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(difference_type n, const\n-TransformedRangeIterator& it) noexcept {\n-571 return TransformedRangeIterator(n+it.it_, it.f_);\n-572 }\n-573\n-574 friend\n-575 TransformedRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(const TransformedRangeIterator& it,\n-difference_type n) noexcept {\n-576 return TransformedRangeIterator(it.it_-n, it.f_);\n-577 }\n-578\n-579 friend\n-580 difference_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(const TransformedRangeIterator& first, const\n-TransformedRangeIterator& second) noexcept {\n-581 return first.it_-second.it_;\n-582 }\n-583 };\n-584\n-585\n-586 } // namespace Impl\n-587\n-588\n-589\n-626 template \n-_\b6_\b2_\b7 class _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw\n-628 {\n-629 using RawConstIterator = std::decay_t\n-()._\bb_\be_\bg_\bi_\bn())>;\n-630 using RawIterator = std::decay_t().begin())>;\n-631\n-632 public:\n-633\n-_\b6_\b4_\b0 using _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br = Impl::TransformedRangeIterator;\n-641\n-_\b6_\b4_\b8 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br = Impl::TransformedRangeIterator;\n-649\n-_\b6_\b5_\b6 using _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be = std::remove_reference_t;\n-657\n-661 template\n-_\b6_\b6_\b2 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, const F& f) noexcept :\n-663 rawRange_(std::forward(_\br_\ba_\bw_\bR_\ba_\bn_\bg_\be)),\n-664 f_(f)\n-665 {\n-666 static_assert(std::is_same_v or std::\n-is_same_v,\n-667 \"The TransformationType passed to TransformedRangeView has to be either\n-ValueTransformationTag or IteratorTransformationTag.\");\n-668 }\n-669\n-_\b6_\b7_\b8 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const noexcept {\n-679 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.begin(), &f_);\n-680 }\n-681\n-_\b6_\b8_\b2 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() noexcept {\n-683 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.begin(), &f_);\n-684 }\n-685\n-_\b6_\b9_\b4 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const noexcept {\n-695 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.end(), &f_);\n-696 }\n-697\n-_\b6_\b9_\b8 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() noexcept {\n-699 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.end(), &f_);\n-700 }\n-701\n-712 template().size())>>\n-_\b7_\b1_\b4 auto _\bs_\bi_\bz_\be() const\n-715 {\n-716 return rawRange_.size();\n-717 }\n-718\n-_\b7_\b2_\b2 const _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be& _\br_\ba_\bw_\bR_\ba_\bn_\bg_\be() const\n-723 {\n-724 return rawRange_;\n-725 }\n-726\n-_\b7_\b3_\b0 _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be& _\br_\ba_\bw_\bR_\ba_\bn_\bg_\be()\n-731 {\n-732 return rawRange_;\n-733 }\n-734\n-735 private:\n-736 R rawRange_;\n-737 F f_;\n-738 };\n-739\n-768 template \n-_\b7_\b6_\b9 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, const F& f)\n-770 {\n-771 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 _\bF_\b,_\b _\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b>(std::forward\n-(_\br_\ba_\bn_\bg_\be), f);\n-772 }\n-773\n-801 template \n-_\b8_\b0_\b2 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, const F& f)\n-803 {\n-804 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 _\bF_\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_\b>(std::\n-forward(_\br_\ba_\bn_\bg_\be), f);\n-805 }\n-806\n-807\n-820 template\n-_\b8_\b2_\b1 auto _\bs_\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(Range&& _\br_\ba_\bn_\bg_\be) {\n-822 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-823 return std::tuple(*it, it.index());\n-824 });\n-825 }\n-826\n-831}\n-832\n-833#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-_\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:821\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, const F &f)\n-Create a TransformedRangeView using an iterator transformation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:802\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, const F &f)\n-Create a TransformedRangeView.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:769\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:300\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:637\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:683\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:660\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:237\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:705\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:259\n-_\bs_\bt_\bd\n-STL namespace.\n+22\n+24\n+26\n+30 template\n+_\b3_\b1 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs {};\n+32\n+33} // end namespace Dune\n+34\n+35#endif // DUNE_FTRAITS_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:_\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:493\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:499\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:481\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:487\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:175\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:192\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:194\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:182\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:180\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:197\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:200\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:189\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:185\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: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(value_type to) noexcept\n-construct integer range [0, 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:_\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:178\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:225\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:251\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: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_\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:235\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:231\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:255\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:265\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:249\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:262\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:233\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:267\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:316\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:321\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:628\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\n-Obtain the size of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:714\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:698\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:656\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, F, T > const_iterator\n-Const iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:640\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:682\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, const F &f) noexcept\n-Construct from range and function.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:662\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\n-Export the wrapped untransformed range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:722\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:648\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:678\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:694\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()\n-Export the wrapped untransformed range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:730\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/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: parametertree.cc File Reference\n+dune-common: debugalign.cc File Reference\n \n \n \n \n \n \n \n@@ -69,27 +69,47 @@\n \n
\n \n
\n \n
\n-
parametertree.cc File Reference
\n+ \n+
debugalign.cc File Reference
\n
\n
\n-
#include <cstdlib>
\n+
#include <config.h>
\n+#include <cstddef>
\n+#include <cstdlib>
\n+#include <functional>
\n+#include <ios>
\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-
\n+#include <utility>
\n+#include <dune/common/debugalign.hh>
\n+
\n+\n+\n+\n+\n+

\n+Namespaces

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

\n+Functions

static void Dune::defaultViolatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 default alignment violation handler
 
ViolatedAlignmentHandlerDune::violatedAlignmentHandler ()
 access the handler called by violatedAlignment()
 
void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 called when an alignment violation is detected
 
\n+\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,19 +1,35 @@\n dune-common\u00a02.9.0\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+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+debugalign.cc File Reference\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/_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\b._\bh_\bh>\n+#include \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+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+ static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt (const char\n+ *_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be, std::size_t expectedAlignment, const\n+ void *address)\n+\u00a0 default alignment violation handler\n+\u00a0\n+_\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br ()\n+\u00a0 access the handler called by _\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\b(_\b)\n+\u00a0\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt (const char *_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be,\n+ std::size_t expectedAlignment, const void *address)\n+\u00a0 called when an alignment violation is detected\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/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: exceptions.cc File Reference\n+dune-common: lru.hh File Reference\n \n \n \n \n \n \n \n@@ -70,26 +70,45 @@\n
\n \n
\n \n
\n \n-
exceptions.cc File Reference
\n+
lru.hh File Reference
\n
\n
\n-\n+\n+

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

\n+
#include <list>
\n+#include <utility>
\n+#include <map>
\n+#include <memory>
\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::lru< Key, Tp, Traits >
 LRU Cache Container. More...
 
\n \n \n \n \n

\n Namespaces

namespace  Dune
 Dune namespace.
 
\n-
\n+

Detailed Description

\n+

LRU Cache Container, using an STL like interface.

\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,15 +1,29 @@\n dune-common\u00a02.9.0\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\n-exceptions.cc File Reference\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+#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:_\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+\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 ===============================================================================\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: propertymap.hh File Reference\n+dune-common: stdthread.cc File Reference\n \n \n \n \n \n \n \n@@ -70,78 +70,35 @@\n
\n \n
\n \n
\n \n-
propertymap.hh File Reference
\n+
stdthread.cc File Reference
\n
\n
\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-Classes

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+
#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+\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)
 
void Dune::doAssertCallOnce (const char *file, int line, const char *function)
 
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,65 +1,22 @@\n dune-common\u00a02.9.0\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-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-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+_\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 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+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 ===============================================================================\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: stdstreams.hh File Reference\n+dune-common: visibility.hh File Reference\n \n \n \n \n \n \n \n@@ -70,84 +70,70 @@\n
\n \n
\n \n
\n \n-
stdstreams.hh File Reference
\n+Macros
\n+
visibility.hh File Reference
\n \n
\n \n-

Standard Dune debug streams. \n+

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

\n-
#include "debugstream.hh"
\n-
\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 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+\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.
 
#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

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+

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 \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,70 +1,35 @@\n dune-common\u00a02.9.0\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 | _\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 \"_\bd_\be_\bb_\bu_\bg_\bs_\bt_\br_\be_\ba_\bm_\b._\bh_\bh\"\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 _\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 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+#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-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+#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 \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+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 ===============================================================================\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: stdstreams.hh Source File\n+dune-common: visibility.hh Source File\n \n \n \n \n \n \n \n@@ -74,94 +74,48 @@\n \n
\n \n
\n \n
\n-
stdstreams.hh
\n+
visibility.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 (C) 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-
15#ifndef DUNE_COMMON_STDSTREAMS_HH
\n-
16#define DUNE_COMMON_STDSTREAMS_HH
\n-
17
\n-
18#include "debugstream.hh"
\n-
19
\n-
20namespace Dune {
\n+
5#ifndef DUNE_COMMON_VISIBILITY_HH
\n+
6#define DUNE_COMMON_VISIBILITY_HH
\n+
7
\n+
12#ifdef DOXYGEN
\n+
13
\n+
15
\n+
20#define DUNE_EXPORT implementation_defined
\n
21
\n-
66#ifndef DUNE_MINIMAL_DEBUG_LEVEL
\n-
67#define DUNE_MINIMAL_DEBUG_LEVEL 4
\n-
68#endif
\n-\n-
70
\n-\n-
76
\n-\n-
82
\n-\n-
96
\n-\n-
102
\n-\n-
108
\n-\n-
117
\n-
122 static const DebugLevel INFO_DEBUG_LEVEL = 3;
\n-
123
\n-\n-
129
\n-\n-
141
\n-
146 static const DebugLevel WARN_DEBUG_LEVEL = 4;
\n-
147
\n-\n-
153
\n-\n-
162
\n-\n-
168
\n-\n-
171
\n-\n-
180
\n-\n-
183
\n-\n-
196
\n-
198}
\n-
199
\n-
200#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:81
\n-
DebugStream< WARN_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DWarnType
Type of debug stream with warn level.
Definition stdstreams.hh:152
\n-
DVVerbType dvverb(std::cout)
stream for very verbose output.
Definition stdstreams.hh:95
\n-
static const DebugLevel MINIMAL_DEBUG_LEVEL
Definition stdstreams.hh:69
\n-
#define DUNE_MINIMAL_DEBUG_LEVEL
The default minimum debug level.
Definition stdstreams.hh:67
\n-
static const DebugLevel VERY_VERBOSE_DEBUG_LEVEL
The level of the very verbose debug stream.
Definition stdstreams.hh:75
\n-
DWarnType dwarn(std::cerr)
Stream for warnings indicating problems.
Definition stdstreams.hh:161
\n-
static const DebugLevel GRAVE_DEBUG_LEVEL
The level of the debug stream for fatal errors.
Definition stdstreams.hh:167
\n-
DebugStream< VERBOSE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DVerbType
Type of more verbose debug stream.
Definition stdstreams.hh:107
\n-
DebugStream< GRAVE_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DGraveType
Type of debug stream for fatal errors.
Definition stdstreams.hh:170
\n-
DGraveType dgrave(std::cerr)
Stream for warnings indicating fatal errors.
Definition stdstreams.hh:179
\n-
DebugStream< 1 > DErrType
The type of the stream used for error messages.
Definition stdstreams.hh:182
\n-
static const DebugLevel INFO_DEBUG_LEVEL
The level of the informative debug stream.
Definition stdstreams.hh:122
\n-
DebugStream< INFO_DEBUG_LEVEL, MINIMAL_DEBUG_LEVEL > DInfoType
Type of debug stream with info level.
Definition stdstreams.hh:128
\n-
DInfoType dinfo(std::cout)
Stream for informative output.
Definition stdstreams.hh:140
\n-
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition stdstreams.hh:116
\n-
static const DebugLevel VERBOSE_DEBUG_LEVEL
The level of the verbose debug stream.
Definition stdstreams.hh:101
\n-
DErrType derr(std::cerr)
Stream for error messages.
Definition stdstreams.hh:195
\n-
static const DebugLevel WARN_DEBUG_LEVEL
The level of the debug stream for warnings.
Definition stdstreams.hh:146
\n-
Dune namespace.
Definition alignedallocator.hh:13
\n-
Generic class to implement debug output streams.
Definition debugstream.hh:192
\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
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,153 +1,44 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-stdstreams.hh\n+visibility.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 (C) 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-15#ifndef DUNE_COMMON_STDSTREAMS_HH\n-16#define DUNE_COMMON_STDSTREAMS_HH\n-17\n-18#include \"_\bd_\be_\bb_\bu_\bg_\bs_\bt_\br_\be_\ba_\bm_\b._\bh_\bh\"\n-19\n-20namespace _\bD_\bu_\bn_\be {\n+5#ifndef DUNE_COMMON_VISIBILITY_HH\n+6#define DUNE_COMMON_VISIBILITY_HH\n+7\n+12#ifdef DOXYGEN\n+13\n+15\n+_\b2_\b0#define DUNE_EXPORT implementation_defined\n 21\n-66#ifndef DUNE_MINIMAL_DEBUG_LEVEL\n-_\b6_\b7#define DUNE_MINIMAL_DEBUG_LEVEL 4\n-68#endif\n-_\b6_\b9 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-70\n-_\b7_\b5 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-76\n-_\b8_\b1 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-82\n-_\b9_\b5 extern _\bD_\bV_\bV_\be_\br_\bb_\bT_\by_\bp_\be _\bd_\bv_\bv_\be_\br_\bb;\n-96\n-_\b1_\b0_\b1 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-102\n-_\b1_\b0_\b7 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-108\n-_\b1_\b1_\b6 extern _\bD_\bV_\be_\br_\bb_\bT_\by_\bp_\be _\bd_\bv_\be_\br_\bb;\n-117\n-_\b1_\b2_\b2 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-123\n-_\b1_\b2_\b8 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-129\n-_\b1_\b4_\b0 extern _\bD_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be _\bd_\bi_\bn_\bf_\bo;\n-141\n-_\b1_\b4_\b6 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-147\n-_\b1_\b5_\b2 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-153\n-_\b1_\b6_\b1 extern _\bD_\bW_\ba_\br_\bn_\bT_\by_\bp_\be _\bd_\bw_\ba_\br_\bn;\n-162\n-_\b1_\b6_\b7 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-168\n-_\b1_\b7_\b0 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-171\n-_\b1_\b7_\b9 extern _\bD_\bG_\br_\ba_\bv_\be_\bT_\by_\bp_\be _\bd_\bg_\br_\ba_\bv_\be;\n-180\n-_\b1_\b8_\b2 typedef _\bD_\be_\bb_\bu_\bg_\bS_\bt_\br_\be_\ba_\bm_\b<_\b1_\b> _\bD_\bE_\br_\br_\bT_\by_\bp_\be;\n-183\n-_\b1_\b9_\b5 extern _\bD_\bE_\br_\br_\bT_\by_\bp_\be _\bd_\be_\br_\br;\n-196\n-198}\n-199\n-200#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:81\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:152\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:95\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:69\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:67\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:75\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:161\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:167\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:107\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:170\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:179\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:182\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:122\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:128\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:140\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:116\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:101\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:195\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:146\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+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 ===============================================================================\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: to_unique_ptr.hh File Reference\n+dune-common: debugstream.hh File Reference\n \n \n \n \n \n \n \n@@ -70,44 +70,64 @@\n
\n \n
\n \n
\n \n-
to_unique_ptr.hh File Reference
\n+Typedefs
\n+
debugstream.hh File Reference
\n \n
\n-
#include <memory>
\n+\n+

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

\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+Classes

struct  Dune::greater_or_equal< current, threshold >
 Greater or equal template test. More...
 
struct  Dune::common_bits< current, mask >
 activate if current and mask have common bits switched on. More...
 
class  Dune::DebugStreamError
 standard exception for the debugstream More...
 
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...
 
\n \n \n \n \n

\n Namespaces

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

\n Typedefs

template<class T >
using Dune::ToUniquePtr = std::unique_ptr< T >
 Alias for std::unique_ptr introduced as transition wrapper.
 
\n-\n-\n-\n-\n-\n+\n+\n+\n

\n-Functions

template<class T , class... Args>
std::unique_ptr< T > Dune::makeToUnique (Args &&... args)
 Alias for std::make_unique introduced as transition wrapper.
 
typedef unsigned int Dune::DebugLevel
 Type for debug levels.
 
\n-
\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+
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,27 +1,47 @@\n dune-common\u00a02.9.0\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 | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-to_unique_ptr.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\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:_\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_\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+ 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+ 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+\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:_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be_\bP_\bt_\br = std::unique_ptr< T >\n-\u00a0 Alias for std::unique_ptr introduced as transition wrapper.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::unique_ptr< T >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be (Args &&... args)\n-\u00a0 Alias for std::make_unique introduced as transition\n- wrapper.\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+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/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: to_unique_ptr.hh Source File\n+dune-common: debugstream.hh Source File\n \n \n \n \n \n \n \n@@ -74,48 +74,333 @@\n \n
\n \n
\n \n
\n-
to_unique_ptr.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 (C) 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_TO_UNIQUE_PTR_HH
\n-
7#define DUNE_TO_UNIQUE_PTR_HH
\n+
6#ifndef DUNE_DEBUGSTREAM_HH
\n+
7#define DUNE_DEBUGSTREAM_HH
\n
8
\n-
9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr or std::shared_ptr instead.
\n-
10
\n-
11#include <memory>
\n-
12
\n-
13namespace Dune
\n-
14{
\n-
17 template <class T>
\n-
18 using ToUniquePtr [[deprecated]] = std::unique_ptr<T>;
\n+
13#include <iostream>
\n+
14#include <stack>
\n+
15
\n+\n+
17
\n+
18namespace Dune {
\n
19
\n-
22 template <class T, class... Args>
\n-
\n-
23 [[deprecated]] std::unique_ptr<T> makeToUnique (Args&&... args)
\n-
24 {
\n-
25 return std::make_unique(std::forward<Args>(args)...);
\n-
26 }
\n-
\n-
27
\n-
28} // end namespace Dune
\n-
29
\n-
30#endif // DUNE_TO_UNIQUE_PTR_HH
\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+
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+
\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+
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-
std::unique_ptr< T > makeToUnique(Args &&... args)
Alias for std::make_unique introduced as transition wrapper.
Definition to_unique_ptr.hh:23
\n-
std::unique_ptr< T > ToUniquePtr
Alias for std::unique_ptr introduced as transition wrapper.
Definition to_unique_ptr.hh:18
\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,49 +1,375 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-to_unique_ptr.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 (C) 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_TO_UNIQUE_PTR_HH\n-7#define DUNE_TO_UNIQUE_PTR_HH\n+6#ifndef DUNE_DEBUGSTREAM_HH\n+7#define DUNE_DEBUGSTREAM_HH\n 8\n-9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr\n-or std::shared_ptr instead.\n-10\n-11#include \n-12\n-13namespace _\bD_\bu_\bn_\be\n-14{\n-17 template \n-_\b1_\b8 using _\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be_\bP_\bt_\br [[deprecated]] = std::unique_ptr;\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-22 template \n-_\b2_\b3 [[deprecated]] std::unique_ptr _\bm_\ba_\bk_\be_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be (Args&&... args)\n-24 {\n-25 return std::make_unique(std::forward(args)...);\n-26 }\n-27\n-28} // end namespace Dune\n-29\n-30#endif // DUNE_TO_UNIQUE_PTR_HH\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+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 // 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+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:_\bm_\ba_\bk_\be_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be\n-std::unique_ptr< T > makeToUnique(Args &&... args)\n-Alias for std::make_unique introduced as transition wrapper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn to_unique_ptr.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be_\bP_\bt_\br\n-std::unique_ptr< T > ToUniquePtr\n-Alias for std::unique_ptr introduced as transition wrapper.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn to_unique_ptr.hh:18\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/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: bitsetvector.hh File Reference\n+dune-common: matrixconcepts.hh File Reference\n \n \n \n \n \n \n \n@@ -70,60 +70,30 @@\n
\n \n
\n \n
\n \n-
bitsetvector.hh File Reference
\n+
matrixconcepts.hh File Reference
\n
\n
\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 <algorithm>
\n-#include <dune/common/boundschecking.hh>
\n-#include <dune/common/genericiterator.hh>
\n-#include <dune/common/exceptions.hh>
\n+
#include <utility>
\n+#include <type_traits>
\n+#include <dune/common/std/type_traits.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
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,48 +1,18 @@\n dune-common\u00a02.9.0\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-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 <_\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+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+matrixconcepts.hh File Reference\n+#include \n+#include \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 _\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/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: bitsetvector.hh Source File\n+dune-common: matrixconcepts.hh Source File\n \n \n \n \n \n \n \n@@ -74,787 +74,109 @@\n \n
\n \n
\n \n
\n-
bitsetvector.hh
\n+
matrixconcepts.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 (C) 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_BLOCK_BITFIELD_HH
\n-
6#define DUNE_BLOCK_BITFIELD_HH
\n+
5#ifndef DUNE_COMMON_MATRIXCONCEPTS_HH
\n+
6#define DUNE_COMMON_MATRIXCONCEPTS_HH
\n
7
\n-
12#include <vector>
\n-
13#include <bitset>
\n-
14#include <iostream>
\n-
15#include <algorithm>
\n+
8
\n+
9
\n+
10#include <utility>
\n+
11#include <type_traits>
\n+
12
\n+\n+
14
\n+
15
\n
16
\n-\n-\n-\n-
20
\n-
21namespace Dune {
\n-
22
\n-
23 template <int block_size, class Alloc> class BitSetVector;
\n-
24 template <int block_size, class Alloc> class BitSetVectorReference;
\n-
25
\n-
36 template <int block_size, class Alloc>
\n-
\n-\n-
38 {
\n-
39 protected:
\n-
40
\n-\n-
42 friend class Dune::BitSetVector<block_size, Alloc>;
\n+
17namespace Dune {
\n+
18
\n+
19 template<class, int, int>
\n+
20 class FieldMatrix;
\n+
21
\n+
22 template<class>
\n+
23 class DynamicMatrix;
\n+
24
\n+
25}
\n+
26
\n+
27namespace Dune::Impl {
\n+
28
\n+
29
\n+
30 // Some traits for checking matrix concepts. Currently these are
\n+
31 // all technical internal helpers that just serve different headers
\n+
32 // to do internal checks and are thus collected here.
\n+
33
\n+
34 template<class T>
\n+
35 using IsMatrixHelper = std::void_t<decltype(std::declval<T>().N(), std::declval<T>().M())>;
\n+
36
\n+
37 template<class T>
\n+
38 struct IsMatrix : public Dune::Std::is_detected<IsMatrixHelper, T> {};
\n+
39
\n+
40 // Check if T is a matrix by checking for member functions N() and M().
\n+
41 template<class T>
\n+
42 constexpr bool IsMatrix_v = Impl::IsMatrix<T>::value;
\n
43
\n-
\n-
44 BitSetVectorConstReference(const BitSetVector& blockBitField_, int block_number_) :
\n-
45 blockBitField(blockBitField_),
\n-
46 block_number(block_number_)
\n-
47 {
\n-
48 DUNE_ASSERT_BOUNDS(blockBitField_.size() > static_cast<size_t>(block_number_));
\n-
49 }
\n-
\n-
50
\n-\n-
53
\n-
54 public:
\n+
44
\n+
45
\n+
46 template<class T>
\n+
47 using IsStaticSizeMatrixHelper = std::void_t<decltype(T::rows, T::cols)>;
\n+
48
\n+
49 template<class T>
\n+
50 struct IsStaticSizeMatrix : public Dune::Std::is_detected<IsStaticSizeMatrixHelper, T> {};
\n+
51
\n+
52 // Check if T is a statically sized matrix by checking for static members rows and cols.
\n+
53 template<class T>
\n+
54 constexpr bool IsStaticSizeMatrix_v = Impl::IsStaticSizeMatrix<T>::value;
\n
55
\n-
56 typedef std::bitset<block_size> bitset;
\n+
56
\n
57
\n-
58 // bitset interface typedefs
\n-
59 typedef typename std::vector<bool, Alloc>::const_reference reference;
\n-
60 typedef typename std::vector<bool, Alloc>::const_reference const_reference;
\n-
61 typedef size_t size_type;
\n-
62
\n-
\n-\n-
65 {
\n-
66 bitset b = *this;
\n-
67 b <<= n;
\n-
68 return b;
\n-
69 }
\n-
\n-
70
\n-
\n-\n-
73 {
\n-
74 bitset b = *this;
\n-
75 b >>= n;
\n-
76 return b;
\n-
77 }
\n-
\n+
58 template<class T>
\n+
59 class IsFieldMatrix : public std::false_type {};
\n+
60
\n+
61 template< class K, int ROWS, int COLS>
\n+
62 class IsFieldMatrix<Dune::FieldMatrix<K, ROWS, COLS>> : public std::true_type {};
\n+
63
\n+
64 // Check if T is an instance of FieldMatrix
\n+
65 template<class T>
\n+
66 constexpr bool IsFieldMatrix_v = Impl::IsFieldMatrix<T>::value;
\n+
67
\n+
68
\n+
69
\n+
70 template<class T>
\n+
71 class IsDenseMatrix : public std::false_type {};
\n+
72
\n+
73 template<class K, int ROWS, int COLS>
\n+
74 class IsDenseMatrix<Dune::FieldMatrix<K, ROWS, COLS>> : public std::true_type {};
\n+
75
\n+
76 template<class K>
\n+
77 class IsDenseMatrix<Dune::DynamicMatrix<K>> : public std::true_type {};
\n
78
\n-
\n-\n-
81 {
\n-
82 bitset b = *this;
\n-
83 b.flip();
\n-
84 return b;
\n-
85 }
\n-
\n+
79 // Check if T is a dense matrix. This is implemented by specialization.
\n+
80 template<class T>
\n+
81 constexpr bool IsDenseMatrix_v = Impl::IsDenseMatrix<T>::value;
\n+
82
\n+
83
\n+
84
\n+
85} // namespace Dune::Impl
\n
86
\n-
\n-\n-
89 {
\n-
90 return block_size;
\n-
91 }
\n-
\n-
92
\n-
\n-\n-
95 {
\n-
96 size_type n = 0;
\n-
97 for(size_type i=0; i<block_size; ++i)
\n-
98 n += getBit(i);
\n-
99 return n;
\n-
100 }
\n-
\n-
101
\n-
\n-
103 bool any() const
\n-
104 {
\n-
105 return count();
\n-
106 }
\n-
\n-
107
\n-
\n-
109 bool none() const
\n-
110 {
\n-
111 return ! any();
\n-
112 }
\n-
\n-
113
\n-
\n-
115 bool all() const
\n-
116 {
\n-
117 for(size_type i=0; i<block_size; ++i)
\n-
118 if(not test(i))
\n-
119 return false;
\n-
120 return true;
\n-
121 }
\n-
\n-
122
\n-
\n-
124 bool test(size_type n) const
\n-
125 {
\n-
126 return getBit(n);
\n-
127 }
\n-
\n-
128
\n-
\n-\n-
131 {
\n-
132 return getBit(i);
\n-
133 }
\n-
\n-
134
\n-
\n-
136 operator bitset() const
\n-
137 {
\n-
138 return blockBitField.getRepr(block_number);
\n-
139 }
\n-
\n-
140
\n-
\n-
142 bool operator== (const bitset& bs) const
\n-
143 {
\n-
144 return equals(bs);
\n-
145 }
\n-
\n-
146
\n-
\n-\n-
149 {
\n-
150 return equals(bs);
\n-
151 }
\n-
\n-
152
\n-
\n-
154 bool operator!= (const bitset& bs) const
\n-
155 {
\n-
156 return ! equals(bs);
\n-
157 }
\n-
\n-
158
\n-
\n-\n-
161 {
\n-
162 return ! equals(bs);
\n-
163 }
\n-
\n-
164
\n-
\n-
171 friend std::ostream& operator<< (std::ostream& s, const BitSetVectorConstReference& v)
\n-
172 {
\n-
173 s << "(";
\n-
174 for(int i=0; i<block_size; ++i)
\n-
175 s << v[i];
\n-
176 s << ")";
\n-
177 return s;
\n-
178 }
\n-
\n-
179
\n-
180 protected:
\n-\n-\n-
183
\n-
\n-\n-
185 {
\n-
186 return blockBitField.getBit(block_number,i);
\n-
187 }
\n-
\n-
188
\n-
189 template<class BS>
\n-
\n-
190 bool equals(const BS & bs) const
\n-
191 {
\n-
192 bool eq = true;
\n-
193 for(int i=0; i<block_size; ++i)
\n-
194 eq &= (getBit(i) == bs[i]);
\n-
195 return eq;
\n-
196 }
\n-
\n-
197
\n-
198 private:
\n-
203 void operator & () = delete;
\n-
204
\n-
205 friend class BitSetVectorReference<block_size, Alloc>;
\n-
206 };
\n-
\n-
207
\n-
220 template <int block_size, class Alloc>
\n-
\n-
221 class BitSetVectorReference : public BitSetVectorConstReference<block_size,Alloc>
\n-
222 {
\n-
223 protected:
\n-
224
\n-\n-
226 friend class Dune::BitSetVector<block_size, Alloc>;
\n-
227
\n-\n-
229
\n-
\n-
230 BitSetVectorReference(BitSetVector& blockBitField_, int block_number_) :
\n-
231 BitSetVectorConstReference(blockBitField_, block_number_),
\n-
232 blockBitField(blockBitField_)
\n-
233 {}
\n-
\n-
234
\n-
235 public:
\n-
236 typedef std::bitset<block_size> bitset;
\n-
237
\n-
241 typedef typename std::vector<bool, Alloc>::reference reference;
\n-
243 typedef typename std::vector<bool, Alloc>::const_reference const_reference;
\n-
245
\n-
247 typedef size_t size_type;
\n-
248
\n-
\n-\n-
251 {
\n-
252 for(int i=0; i<block_size; ++i)
\n-
253 getBit(i) = b;
\n-
254 return (*this);
\n-
255 }
\n-
\n-
256
\n-
\n-\n-
259 {
\n-
260 for(int i=0; i<block_size; ++i)
\n-
261 getBit(i) = b.test(i);
\n-
262 return (*this);
\n-
263 }
\n-
\n-
264
\n-
\n-\n-
267 {
\n-
268 for(int i=0; i<block_size; ++i)
\n-
269 getBit(i) = b.test(i);
\n-
270 return (*this);
\n-
271 }
\n-
\n-
272
\n-
\n-\n-
275 {
\n-
276 for(int i=0; i<block_size; ++i)
\n-
277 getBit(i) = b.test(i);
\n-
278 return (*this);
\n-
279 }
\n-
\n-
280
\n-
\n-\n-
283 {
\n-
284 for (size_type i=0; i<block_size; i++)
\n-
285 getBit(i) = (test(i) & x.test(i));
\n-
286 return *this;
\n-
287 }
\n-
\n-
288
\n-
\n-\n-
291 {
\n-
292 for (size_type i=0; i<block_size; i++)
\n-
293 getBit(i) = (test(i) & x.test(i));
\n-
294 return *this;
\n-
295 }
\n-
\n-
296
\n-
\n-\n-
299 {
\n-
300 for (size_type i=0; i<block_size; i++)
\n-
301 getBit(i) = (test(i) | x.test(i));
\n-
302 return *this;
\n-
303 }
\n-
\n-
304
\n-
\n-\n-
307 {
\n-
308 for (size_type i=0; i<block_size; i++)
\n-
309 getBit(i) = (test(i) | x.test(i));
\n-
310 return *this;
\n-
311 }
\n-
\n-
312
\n-
\n-\n-
315 {
\n-
316 for (size_type i=0; i<block_size; i++)
\n-
317 getBit(i) = (test(i) ^ x.test(i));
\n-
318 return *this;
\n-
319 }
\n-
\n-
320
\n-
321 private:
\n-
322
\n-
323 // For some reason, the following variant of operator^= triggers an ICE or a hanging
\n-
324 // compiler on Debian 9 with GCC 6.3 and full optimizations enabled (-O3).
\n-
325 // The only way to reliably avoid the issue is by making sure that the compiler does not
\n-
326 // see the XOR in the context of the function, so here is a little helper that will normally
\n-
327 // be inlined, but not on the broken compiler. This incurs a substantial overhead (a function
\n-
328 // call), but until someone else has a better idea, it's the only way to make it work reliably.
\n-
329
\n-
330 static bool xor_helper(bool a, bool b)
\n-
331#if defined(__GNUC__) && ! defined(__clang__) && __GNUC__ == 6 && __GNUC_MINOR__ == 3 && __cplusplus \\
\n-
332 == 201402L
\n-
333 __attribute__((noinline))
\n-
334#endif
\n-
335 ;
\n-
336
\n-
337 public:
\n-
338
\n-
\n-\n-
341 {
\n-
342 // This uses the helper from above to hoist the actual XOR computation out of the function for
\n-
343 // the buggy version of GCC.
\n-
344 for (size_type i=0; i<block_size; i++)
\n-
345 getBit(i) = xor_helper(test(i),x.test(i));
\n-
346 return *this;
\n-
347 }
\n-
\n-
348
\n-
\n-\n-
351 {
\n-
352 for (size_type i=0; i<block_size-n; i++)
\n-
353 getBit(i) = test(i+n);
\n-
354 return *this;
\n-
355 }
\n-
\n-
356
\n-
\n-\n-
359 {
\n-
360 for (size_type i=0; i<block_size-n; i++)
\n-
361 getBit(i+n) = test(i);
\n-
362 return *this;
\n-
363 }
\n-
\n-
364
\n-
\n-\n-
367 {
\n-
368 for (size_type i=0; i<block_size; i++)
\n-
369 set(i);
\n-
370 return *this;
\n-
371 }
\n-
\n-
372
\n-
\n-\n-
375 {
\n-
376 for (size_type i=0; i<block_size; i++)
\n-
377 flip(i);
\n-
378 return *this;
\n-
379 }
\n-
\n-
380
\n-
\n-\n-
383 {
\n-
384 *this = false;
\n-
385 return *this;
\n-
386 }
\n-
\n-
387
\n-
\n-\n-
390 {
\n-
391 getBit(n) = val;
\n-
392 return *this;
\n-
393 }
\n-
\n-
394
\n-
\n-\n-
397 {
\n-
398 set(n, false);
\n-
399 return *this;
\n-
400 }
\n-
\n-
401
\n-
\n-\n-
404 {
\n-
405 getBit(n).flip();
\n-
406 return *this;
\n-
407 }
\n-
\n-
408
\n-\n-
410 using BitSetVectorConstReference::operator[];
\n-
411
\n-
\n-\n-
414 {
\n-
415 return getBit(i);
\n-
416 }
\n-
\n-
417
\n-
418 protected:
\n-\n-
420
\n-\n-
422
\n-
\n-\n-
424 {
\n-
425 return blockBitField.getBit(this->block_number,i);
\n-
426 }
\n-
\n-
427 };
\n-
\n-
428
\n-
429 // implementation of helper - I put it into the template to avoid having
\n-
430 // to compile it in a dedicated compilation unit
\n-
431 template<int block_size, class Alloc>
\n-
432 bool BitSetVectorReference<block_size,Alloc>::xor_helper(bool a, bool b)
\n-
433 {
\n-
434 return a ^ b;
\n-
435 }
\n-
436
\n-
440 template<int block_size, class Alloc>
\n-
\n-
441 struct const_reference< BitSetVectorReference<block_size,Alloc> >
\n-
442 {
\n-\n-
444 };
\n-
\n-
445
\n-
446 template<int block_size, class Alloc>
\n-
\n-
447 struct const_reference< BitSetVectorConstReference<block_size,Alloc> >
\n-
448 {
\n-\n-
450 };
\n-
\n-
451
\n-
452 template<int block_size, class Alloc>
\n-
\n-
453 struct mutable_reference< BitSetVectorReference<block_size,Alloc> >
\n-
454 {
\n-\n-
456 };
\n-
\n-
457
\n-
458 template<int block_size, class Alloc>
\n-
\n-\n-
460 {
\n-\n-
462 };
\n-
\n-
463
\n-
467 template <int block_size, class Allocator=std::allocator<bool> >
\n-
\n-
468 class BitSetVector : private std::vector<bool, Allocator>
\n-
469 {
\n-
471 typedef std::vector<bool, Allocator> BlocklessBaseClass;
\n-
472
\n-
473 public:
\n-
476
\n-
478 typedef std::bitset<block_size> value_type;
\n-
479
\n-\n-
482
\n-\n-
485
\n-\n-
488
\n-\n-
491
\n-
493 typedef typename std::vector<bool, Allocator>::size_type size_type;
\n-
494
\n-
496 typedef Allocator allocator_type;
\n-
498
\n-\n-\n-
504
\n-
\n-\n-
507 return iterator(*this, 0);
\n-
508 }
\n-
\n-
509
\n-
\n-\n-
512 return const_iterator(*this, 0);
\n-
513 }
\n-
\n-
514
\n-
\n-\n-
517 return iterator(*this, size());
\n-
518 }
\n-
\n-
519
\n-
\n-\n-
522 return const_iterator(*this, size());
\n-
523 }
\n-
\n-
524
\n-
\n-\n-
527 BlocklessBaseClass()
\n-
528 {}
\n-
\n-
529
\n-
\n-
531 BitSetVector(const BlocklessBaseClass& blocklessBitField) :
\n-
532 BlocklessBaseClass(blocklessBitField)
\n-
533 {
\n-
534 if (blocklessBitField.size()%block_size != 0)
\n-
535 DUNE_THROW(RangeError, "Vector size is not a multiple of the block size!");
\n-
536 }
\n-
\n-
537
\n-
\n-
541 explicit BitSetVector(int n) :
\n-
542 BlocklessBaseClass(n*block_size)
\n-
543 {}
\n-
\n-
544
\n-
\n-
546 BitSetVector(int n, bool v) :
\n-
547 BlocklessBaseClass(n*block_size,v)
\n-
548 {}
\n-
\n-
549
\n-
\n-
551 void clear()
\n-
552 {
\n-
553 BlocklessBaseClass::clear();
\n-
554 }
\n-
\n-
555
\n-
\n-
557 void resize(int n, bool v = bool())
\n-
558 {
\n-
559 BlocklessBaseClass::resize(n*block_size, v);
\n-
560 }
\n-
\n-
561
\n-
\n-\n-
564 {
\n-
565 return BlocklessBaseClass::size()/block_size;
\n-
566 }
\n-
\n-
567
\n-
\n-
569 void setAll() {
\n-
570 this->assign(BlocklessBaseClass::size(), true);
\n-
571 }
\n-
\n-
572
\n-
\n-
574 void unsetAll() {
\n-
575 this->assign(BlocklessBaseClass::size(), false);
\n-
576 }
\n-
\n-
577
\n-
\n-\n-
580 {
\n-
581 return reference(*this, i);
\n-
582 }
\n-
\n-
583
\n-
\n-\n-
586 {
\n-
587 return const_reference(*this, i);
\n-
588 }
\n-
\n-
589
\n-
\n-\n-
592 {
\n-
593 return reference(*this, size()-1);
\n-
594 }
\n-
\n-
595
\n-
\n-\n-
598 {
\n-
599 return const_reference(*this, size()-1);
\n-
600 }
\n-
\n-
601
\n-
\n-\n-
604 {
\n-
605 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), true);
\n-
606 }
\n-
\n-
607
\n-
\n-\n-
610 {
\n-
611 size_type n = 0;
\n-
612 size_type blocks = size();
\n-
613 for(size_type i=0; i<blocks; ++i)
\n-
614 n += getBit(i,j);
\n-
615 return n;
\n-
616 }
\n-
\n-
617
\n-
\n-
619 friend std::ostream& operator<< (std::ostream& s, const BitSetVector& v)
\n-
620 {
\n-
621 for (size_t i=0; i<v.size(); i++)
\n-
622 s << v[i] << " ";
\n-
623 return s;
\n-
624 }
\n-
\n-
625
\n-
626 private:
\n-
627
\n-
629 value_type getRepr(int i) const
\n-
630 {
\n-
631 value_type bits;
\n-
632 for(int j=0; j<block_size; ++j)
\n-
633 bits.set(j, getBit(i,j));
\n-
634 return bits;
\n-
635 }
\n-
636
\n-
637 typename std::vector<bool>::reference getBit(size_type i, size_type j) {
\n-
638 DUNE_ASSERT_BOUNDS(j < block_size);
\n-\n-
640 return BlocklessBaseClass::operator[](i*block_size+j);
\n-
641 }
\n-
642
\n-
643 typename std::vector<bool>::const_reference getBit(size_type i, size_type j) const {
\n-
644 DUNE_ASSERT_BOUNDS(j < block_size);
\n-\n-
646 return BlocklessBaseClass::operator[](i*block_size+j);
\n-
647 }
\n-
648
\n-
649 friend class BitSetVectorReference<block_size,Allocator>;
\n-
650 friend class BitSetVectorConstReference<block_size,Allocator>;
\n-
651 };
\n-
\n-
652
\n-
653} // namespace Dune
\n-
654
\n-
655#endif
\n-
Macro for wrapping boundary checks.
\n-
A few common exception classes.
\n-
Implements a generic iterator class for writing stl conformant iterators.
\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-
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
\n+
87
\n+
88
\n+
89#endif // DUNE_COMMON_MATRIXCONCEPTS_HH
\n+\n+
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition type_traits.hh:141
\n
Dune namespace.
Definition alignedallocator.hh:13
\n-
void assign(T &dst, const T &src, bool mask)
masked Simd assignment (scalar version)
Definition simd.hh:447
\n-
A dynamic array of blocks of booleans.
Definition bitsetvector.hh:469
\n-
const_reference operator[](int i) const
Return const reference to i-th block.
Definition bitsetvector.hh:585
\n-
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition bitsetvector.hh:506
\n-
BitSetVectorConstReference< block_size, Allocator > * const_pointer
Const pointer to a small block of bits.
Definition bitsetvector.hh:490
\n-
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition bitsetvector.hh:521
\n-
BitSetVectorReference< block_size, Allocator > reference
Reference to a small block of bits.
Definition bitsetvector.hh:481
\n-
size_type countmasked(int j) const
Returns the number of set bits, while each block is masked with 1<<i.
Definition bitsetvector.hh:609
\n-
BitSetVectorConstReference< block_size, Allocator > const_reference
Const reference to a small block of bits.
Definition bitsetvector.hh:484
\n-
iterator end()
Returns an iterator pointing to the end of the vector.
Definition bitsetvector.hh:516
\n-
size_type count() const
Returns the number of bits that are set.
Definition bitsetvector.hh:603
\n-
BitSetVector()
Default constructor.
Definition bitsetvector.hh:526
\n-
void setAll()
Sets all entries to true
Definition bitsetvector.hh:569
\n-
Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade > const_iterator
Definition bitsetvector.hh:502
\n-
std::bitset< block_size > value_type
Type of the values stored by the container.
Definition bitsetvector.hh:478
\n-
reference back()
Return reference to last block.
Definition bitsetvector.hh:591
\n-
BitSetVector(const BlocklessBaseClass &blocklessBitField)
Construction from an unblocked bitfield.
Definition bitsetvector.hh:531
\n-
friend std::ostream & operator<<(std::ostream &s, const BitSetVector &v)
Send bitfield to an output stream.
Definition bitsetvector.hh:619
\n-
const_reference back() const
Return const reference to last block.
Definition bitsetvector.hh:597
\n-
void clear()
Erases all of the elements.
Definition bitsetvector.hh:551
\n-
BitSetVectorReference< block_size, Allocator > * pointer
Pointer to a small block of bits.
Definition bitsetvector.hh:487
\n-
reference operator[](int i)
Return reference to i-th block.
Definition bitsetvector.hh:579
\n-
size_type size() const
Return the number of blocks.
Definition bitsetvector.hh:563
\n-
std::vector< bool, Allocator >::size_type size_type
size type
Definition bitsetvector.hh:493
\n-
BitSetVector(int n, bool v)
Constructor which initializes the field with true or false.
Definition bitsetvector.hh:546
\n-
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition bitsetvector.hh:511
\n-
Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type, reference, std::ptrdiff_t, ForwardIteratorFacade > iterator
Definition bitsetvector.hh:501
\n-
void resize(int n, bool v=bool())
Resize field.
Definition bitsetvector.hh:557
\n-
Allocator allocator_type
The type of the allocator.
Definition bitsetvector.hh:496
\n-
BitSetVector(int n)
Definition bitsetvector.hh:541
\n-
void unsetAll()
Sets all entries to false
Definition bitsetvector.hh:574
\n-
A proxy class that acts as a mutable reference to a single bitset in a BitSetVector.
Definition bitsetvector.hh:222
\n-
bool test(size_type n) const
Returns true if bit n is set.
Definition bitsetvector.hh:124
\n-
BitSetVectorReference & operator=(const BitSetVectorConstReference &b)
Assignment from BitSetVectorConstReference.
Definition bitsetvector.hh:266
\n-
reference operator[](size_type i)
Return reference to the i-th bit.
Definition bitsetvector.hh:413
\n-
BitSetVectorReference & reset(size_type n)
Clears bit n.
Definition bitsetvector.hh:396
\n-
BitSetVectorReference & operator<<=(size_type n)
Left shift.
Definition bitsetvector.hh:350
\n-
Dune::BitSetVector< block_size, Alloc > BitSetVector
Definition bitsetvector.hh:225
\n-
std::vector< bool, Alloc >::const_reference const_reference
A proxy class that acts as a const reference to a single bit.
Definition bitsetvector.hh:243
\n-
BitSetVectorReference & operator=(const BitSetVectorReference &b)
Assignment from BitSetVectorReference.
Definition bitsetvector.hh:274
\n-
reference getBit(size_type i)
Definition bitsetvector.hh:423
\n-
BitSetVectorReference & operator&=(const BitSetVectorConstReference &x)
Bitwise and (for BitSetVectorConstReference and BitSetVectorReference)
Definition bitsetvector.hh:290
\n-
BitSetVectorReference(BitSetVector &blockBitField_, int block_number_)
Definition bitsetvector.hh:230
\n-
size_t size_type
size_type typedef (an unsigned integral type)
Definition bitsetvector.hh:247
\n-
BitSetVectorReference & operator=(const bitset &b)
Assignment from bitset.
Definition bitsetvector.hh:258
\n-
Dune::BitSetVectorConstReference< block_size, Alloc > BitSetVectorConstReference
Definition bitsetvector.hh:228
\n-
BitSetVectorReference & reset()
Clears every bit.
Definition bitsetvector.hh:382
\n-
BitSetVector & blockBitField
Definition bitsetvector.hh:419
\n-
BitSetVectorReference & operator|=(const BitSetVectorConstReference &x)
Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference)
Definition bitsetvector.hh:306
\n-
BitSetVectorReference & set(size_type n, int val=1)
Sets bit n if val is nonzero, and clears bit n if val is zero.
Definition bitsetvector.hh:389
\n-
std::bitset< block_size > bitset
Definition bitsetvector.hh:236
\n-
BitSetVectorReference & operator^=(const bitset &x)
Bitwise exclusive or (for bitset).
Definition bitsetvector.hh:314
\n-
std::vector< bool, Alloc >::reference reference
Definition bitsetvector.hh:241
\n-
BitSetVectorReference & operator|=(const bitset &x)
Bitwise inclusive or (for bitset)
Definition bitsetvector.hh:298
\n-
BitSetVectorReference & operator>>=(size_type n)
Right shift.
Definition bitsetvector.hh:358
\n-
BitSetVectorReference & operator^=(const BitSetVectorConstReference &x)
Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference)
Definition bitsetvector.hh:340
\n-
BitSetVectorReference & flip(size_type n)
Flips bit n.
Definition bitsetvector.hh:403
\n-
BitSetVectorReference & flip()
Flips the value of every bit.
Definition bitsetvector.hh:374
\n-
BitSetVectorReference & set()
Sets every bit.
Definition bitsetvector.hh:366
\n-
BitSetVectorReference & operator&=(const bitset &x)
Bitwise and (for bitset).
Definition bitsetvector.hh:282
\n-
BitSetVectorReference & operator=(bool b)
Assignment from bool, sets each bit in the bitset to b.
Definition bitsetvector.hh:250
\n-
A proxy class that acts as a const reference to a single bitset in a BitSetVector.
Definition bitsetvector.hh:38
\n-
bool operator==(const bitset &bs) const
Equality of reference and std::bitset.
Definition bitsetvector.hh:142
\n-
bool test(size_type n) const
Returns true if bit n is set.
Definition bitsetvector.hh:124
\n-
const_reference operator[](size_type i) const
Return reference to the i-th bit.
Definition bitsetvector.hh:130
\n-
bitset operator<<(size_type n) const
Returns a copy of *this shifted left by n bits.
Definition bitsetvector.hh:64
\n-
BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b)
hide assignment operator
\n-
BitSetVectorConstReference(const BitSetVector &blockBitField_, int block_number_)
Definition bitsetvector.hh:44
\n-
const BitSetVector & blockBitField
Definition bitsetvector.hh:181
\n-
bitset operator>>(size_type n) const
Returns a copy of *this shifted right by n bits.
Definition bitsetvector.hh:72
\n-
const_reference getBit(size_type i) const
Definition bitsetvector.hh:184
\n-
bool operator!=(const bitset &bs) const
Inequality of reference and std::bitset.
Definition bitsetvector.hh:154
\n-
bool equals(const BS &bs) const
Definition bitsetvector.hh:190
\n-
Dune::BitSetVector< block_size, Alloc > BitSetVector
Definition bitsetvector.hh:41
\n-
std::bitset< block_size > bitset
Definition bitsetvector.hh:56
\n-
bool all() const
Returns true if all bits are set.
Definition bitsetvector.hh:115
\n-
size_t size_type
Definition bitsetvector.hh:61
\n-
bitset operator~() const
Returns a copy of *this with all of its bits flipped.
Definition bitsetvector.hh:80
\n-
std::vector< bool, Alloc >::const_reference reference
Definition bitsetvector.hh:59
\n-
size_type size() const
Returns block_size.
Definition bitsetvector.hh:88
\n-
size_type count() const
Returns the number of bits that are set.
Definition bitsetvector.hh:94
\n-
bool none() const
Returns true if no bits are set.
Definition bitsetvector.hh:109
\n-
bool any() const
Returns true if any bits are set.
Definition bitsetvector.hh:103
\n-
int block_number
Definition bitsetvector.hh:182
\n-
std::vector< bool, Alloc >::const_reference const_reference
Definition bitsetvector.hh:60
\n-
friend std::ostream & operator<<(std::ostream &s, const BitSetVectorConstReference &v)
Definition bitsetvector.hh:171
\n-
BitSetVectorConstReference< block_size, Alloc > type
Definition bitsetvector.hh:443
\n-
BitSetVectorConstReference< block_size, Alloc > type
Definition bitsetvector.hh:449
\n-
BitSetVectorReference< block_size, Alloc > type
Definition bitsetvector.hh:455
\n-
BitSetVectorReference< block_size, Alloc > type
Definition bitsetvector.hh:461
\n-
Default exception class for range errors.
Definition exceptions.hh:254
\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-
Generic class for stl-conforming iterators for container classes with operator[].
Definition genericiterator.hh:153
\n-
Base class for stl conformant forward iterators.
Definition iteratorfacades.hh:141
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,936 +1,113 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-bitsetvector.hh\n+matrixconcepts.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 (C) 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_BLOCK_BITFIELD_HH\n-6#define DUNE_BLOCK_BITFIELD_HH\n+5#ifndef DUNE_COMMON_MATRIXCONCEPTS_HH\n+6#define DUNE_COMMON_MATRIXCONCEPTS_HH\n 7\n-12#include \n-13#include \n-14#include \n-15#include \n+8\n+9\n+10#include \n+11#include \n+12\n+13#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+14\n+15\n 16\n-17#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-18#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-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\n-21namespace _\bD_\bu_\bn_\be {\n-22\n-23 template class BitSetVector;\n-24 template class BitSetVectorReference;\n-25\n-36 template \n-_\b3_\b7 class _\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\n-38 {\n-39 protected:\n-40\n-_\b4_\b1 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b> _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n-42 friend class _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n+17namespace _\bD_\bu_\bn_\be {\n+18\n+19 template\n+20 class FieldMatrix;\n+21\n+22 template\n+23 class DynamicMatrix;\n+24\n+25}\n+26\n+27namespace Dune::Impl {\n+28\n+29\n+30 // Some traits for checking matrix concepts. Currently these are\n+31 // all technical internal helpers that just serve different headers\n+32 // to do internal checks and are thus collected here.\n+33\n+34 template\n+35 using IsMatrixHelper = std::void_t().N(), std::\n+declval().M())>;\n+36\n+37 template\n+38 struct IsMatrix : public _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd {};\n+39\n+40 // Check if T is a matrix by checking for member functions N() and M().\n+41 template\n+42 constexpr bool IsMatrix_v = Impl::IsMatrix::value;\n 43\n-_\b4_\b4 _\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(const _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br& blockBitField_, int\n-block_number_) :\n-45 _\bb_\bl_\bo_\bc_\bk_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd(blockBitField_),\n-46 _\bb_\bl_\bo_\bc_\bk_\b__\bn_\bu_\bm_\bb_\be_\br(block_number_)\n-47 {\n-48 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(blockBitField_._\bs_\bi_\bz_\be() > static_cast\n-(block_number_));\n-49 }\n-50\n-_\b5_\b2 _\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& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\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);\n-53\n-54 public:\n+44\n+45\n+46 template\n+47 using IsStaticSizeMatrixHelper = std::void_t;\n+48\n+49 template\n+50 struct IsStaticSizeMatrix : public _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:\n+_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd {};\n+51\n+52 // Check if T is a statically sized matrix by checking for static members\n+rows and cols.\n+53 template\n+54 constexpr bool IsStaticSizeMatrix_v = Impl::IsStaticSizeMatrix::value;\n 55\n-_\b5_\b6 typedef std::bitset _\bb_\bi_\bt_\bs_\be_\bt;\n+56\n 57\n-58 // bitset interface typedefs\n-_\b5_\b9 typedef typename std::vector::const_reference _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-_\b6_\b0 typedef typename std::vector::const_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-_\b6_\b1 typedef size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-62\n-_\b6_\b4 _\bb_\bi_\bt_\bs_\be_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n) const\n-65 {\n-66 _\bb_\bi_\bt_\bs_\be_\bt b = *this;\n-67 b <<= n;\n-68 return b;\n-69 }\n-70\n-_\b7_\b2 _\bb_\bi_\bt_\bs_\be_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n) const\n-73 {\n-74 _\bb_\bi_\bt_\bs_\be_\bt b = *this;\n-75 b >>= n;\n-76 return b;\n-77 }\n+58 template\n+59 class IsFieldMatrix : public std::false_type {};\n+60\n+61 template< class K, int ROWS, int COLS>\n+62 class IsFieldMatrix<_\bD_\bu_\bn_\be::FieldMatrix> : public std::\n+true_type {};\n+63\n+64 // Check if T is an instance of FieldMatrix\n+65 template\n+66 constexpr bool IsFieldMatrix_v = Impl::IsFieldMatrix::value;\n+67\n+68\n+69\n+70 template\n+71 class IsDenseMatrix : public std::false_type {};\n+72\n+73 template\n+74 class IsDenseMatrix<_\bD_\bu_\bn_\be::FieldMatrix> : public std::\n+true_type {};\n+75\n+76 template\n+77 class IsDenseMatrix<_\bD_\bu_\bn_\be::DynamicMatrix> : public std::true_type {};\n 78\n-_\b8_\b0 _\bb_\bi_\bt_\bs_\be_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~() const\n-81 {\n-82 _\bb_\bi_\bt_\bs_\be_\bt b = *this;\n-83 b.flip();\n-84 return b;\n-85 }\n+79 // Check if T is a dense matrix. This is implemented by specialization.\n+80 template\n+81 constexpr bool IsDenseMatrix_v = Impl::IsDenseMatrix::value;\n+82\n+83\n+84\n+85} // namespace Dune::Impl\n 86\n-_\b8_\b8 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n-89 {\n-90 return block_size;\n-91 }\n-92\n-_\b9_\b4 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bu_\bn_\bt() const\n-95 {\n-96 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n = 0;\n-97 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b1_\b9_\b0 bool _\be_\bq_\bu_\ba_\bl_\bs(const BS & bs) const\n-191 {\n-192 bool eq = true;\n-193 for(int i=0; i;\n-206 };\n-207\n-220 template \n-_\b2_\b2_\b1 class _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be : public\n-_\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\n-222 {\n-223 protected:\n-224\n-_\b2_\b2_\b5 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b> _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n-226 friend class _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n-227\n-_\b2_\b2_\b8 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b>\n-_\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;\n-229\n-_\b2_\b3_\b0 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be(_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br& blockBitField_, int block_number_) :\n-231 _\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(blockBitField_, block_number_),\n-232 _\bb_\bl_\bo_\bc_\bk_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd(blockBitField_)\n-233 {}\n-234\n-235 public:\n-_\b2_\b3_\b6 typedef std::bitset _\bb_\bi_\bt_\bs_\be_\bt;\n-237\n-_\b2_\b4_\b1 typedef typename std::vector::reference _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-_\b2_\b4_\b3 typedef typename std::vector::const_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-245\n-_\b2_\b4_\b7 typedef size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-248\n-_\b2_\b5_\b0 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(bool b)\n-251 {\n-252 for(int i=0; i_\b>_\b=(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n)\n-359 {\n-360 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\bb_\bl_\bo_\bc_\bk_\b__\bn_\bu_\bm_\bb_\be_\br,i);\n-426 }\n-427 };\n-428\n-429 // implementation of helper - I put it into the template to avoid having\n-430 // to compile it in a dedicated compilation unit\n-431 template\n-432 bool BitSetVectorReference::xor_helper(bool a, bool b)\n-433 {\n-434 return a ^ b;\n-435 }\n-436\n-440 template\n-_\b4_\b4_\b1 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be >\n-442 {\n-_\b4_\b4_\b3 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n-444 };\n-445\n-446 template\n-_\b4_\b4_\b7 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\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 >\n-448 {\n-_\b4_\b4_\b9 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n-450 };\n-451\n-452 template\n-_\b4_\b5_\b3 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be >\n-454 {\n-_\b4_\b5_\b5 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n-456 };\n-457\n-458 template\n-_\b4_\b5_\b9 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\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 >\n-460 {\n-_\b4_\b6_\b1 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n-462 };\n-463\n-467 template >\n-_\b4_\b6_\b8 class _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br : private std::vector\n-469 {\n-471 typedef std::vector BlocklessBaseClass;\n-472\n-473 public:\n-476\n-_\b4_\b7_\b8 typedef std::bitset _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-479\n-_\b4_\b8_\b1 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-482\n-_\b4_\b8_\b4 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-485\n-_\b4_\b8_\b7 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>* _\bp_\bo_\bi_\bn_\bt_\be_\br;\n-488\n-_\b4_\b9_\b0 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>* _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n-491\n-_\b4_\b9_\b3 typedef typename std::vector::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-494\n-_\b4_\b9_\b6 typedef Allocator _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n-498\n-_\b5_\b0_\b1 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>,\n-_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be, _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be, std::ptrdiff_t, _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b5_\b0_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>,\n-const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be, _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be, std::ptrdiff_t, _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be>\n-_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-504\n-_\b5_\b0_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(){\n-507 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0);\n-508 }\n-509\n-_\b5_\b1_\b1 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const {\n-512 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0);\n-513 }\n-514\n-_\b5_\b1_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(){\n-517 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, _\bs_\bi_\bz_\be());\n-518 }\n-519\n-_\b5_\b2_\b1 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const {\n-522 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, _\bs_\bi_\bz_\be());\n-523 }\n-524\n-_\b5_\b2_\b6 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br() :\n-527 BlocklessBaseClass()\n-528 {}\n-529\n-_\b5_\b3_\b1 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br(const BlocklessBaseClass& blocklessBitField) :\n-532 BlocklessBaseClass(blocklessBitField)\n-533 {\n-534 if (blocklessBitField.size()%block_size != 0)\n-535 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"Vector size is not a multiple of the block size!\");\n-536 }\n-537\n-_\b5_\b4_\b1 explicit _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br(int n) :\n-542 BlocklessBaseClass(n*block_size)\n-543 {}\n-544\n-_\b5_\b4_\b6 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br(int n, bool v) :\n-547 BlocklessBaseClass(n*block_size,v)\n-548 {}\n-549\n-_\b5_\b5_\b1 void _\bc_\bl_\be_\ba_\br()\n-552 {\n-553 BlocklessBaseClass::clear();\n-554 }\n-555\n-_\b5_\b5_\b7 void _\br_\be_\bs_\bi_\bz_\be(int n, bool v = bool())\n-558 {\n-559 BlocklessBaseClass::resize(n*block_size, v);\n-560 }\n-561\n-_\b5_\b6_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n-564 {\n-565 return BlocklessBaseClass::size()/block_size;\n-566 }\n-567\n-_\b5_\b6_\b9 void _\bs_\be_\bt_\bA_\bl_\bl() {\n-570 this->_\ba_\bs_\bs_\bi_\bg_\bn(BlocklessBaseClass::size(), true);\n-571 }\n-572\n-_\b5_\b7_\b4 void _\bu_\bn_\bs_\be_\bt_\bA_\bl_\bl() {\n-575 this->_\ba_\bs_\bs_\bi_\bg_\bn(BlocklessBaseClass::size(), false);\n-576 }\n-577\n-_\b5_\b7_\b9 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](int i)\n-580 {\n-581 return _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, i);\n-582 }\n-583\n-_\b5_\b8_\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](int i) const\n-586 {\n-587 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, i);\n-588 }\n-589\n-_\b5_\b9_\b1 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk()\n-592 {\n-593 return _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, _\bs_\bi_\bz_\be()-1);\n-594 }\n-595\n-_\b5_\b9_\b7 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk() const\n-598 {\n-599 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, _\bs_\bi_\bz_\be()-1);\n-600 }\n-601\n-_\b6_\b0_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bu_\bn_\bt() const\n-604 {\n-605 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(),\n-true);\n-606 }\n-607\n-_\b6_\b0_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bu_\bn_\bt_\bm_\ba_\bs_\bk_\be_\bd(int j) const\n-610 {\n-611 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n = 0;\n-612 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be blocks = _\bs_\bi_\bz_\be();\n-613 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i::reference getBit(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j) {\n-638 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(j < block_size);\n-639 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _\bs_\bi_\bz_\be());\n-640 return BlocklessBaseClass::operator[](i*block_size+j);\n-641 }\n-642\n-_\b6_\b4_\b3 typename std::vector::const_reference getBit(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-j) const {\n-644 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(j < block_size);\n-645 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _\bs_\bi_\bz_\be());\n-646 return BlocklessBaseClass::operator[](i*block_size+j);\n-647 }\n-648\n-649 friend class _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-650 friend class _\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;\n-651 };\n-652\n-653} // namespace Dune\n-654\n-655#endif\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-_\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-_\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__\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+87\n+88\n+89#endif // DUNE_COMMON_MATRIXCONCEPTS_HH\n+_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\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:141\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_\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:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n-A dynamic array of blocks of booleans.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:469\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const_reference operator[](int i) const\n-Return const reference to i-th block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:585\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-Returns a iterator pointing to the beginning of the vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:506\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n-BitSetVectorConstReference< block_size, Allocator > * const_pointer\n-Const pointer to a small block of bits.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:490\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-Returns a const_iterator pointing to the end of the vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:521\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-BitSetVectorReference< block_size, Allocator > reference\n-Reference to a small block of bits.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:481\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bm_\ba_\bs_\bk_\be_\bd\n-size_type countmasked(int j) const\n-Returns the number of set bits, while each block is masked with 1< const_reference\n-Const reference to a small block of bits.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:484\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-Returns an iterator pointing to the end of the vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:516\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bu_\bn_\bt\n-size_type count() const\n-Returns the number of bits that are set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:603\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n-BitSetVector()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\be_\bt_\bA_\bl_\bl\n-void setAll()\n-Sets all entries to true\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:569\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const\n-value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade >\n-const_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:502\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-std::bitset< block_size > value_type\n-Type of the values stored by the container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:478\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n-reference back()\n-Return reference to last block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:591\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n-BitSetVector(const BlocklessBaseClass &blocklessBitField)\n-Construction from an unblocked bitfield.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:531\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\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 BitSetVector &v)\n-Send bitfield to an output stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:619\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n-const_reference back() const\n-Return const reference to last block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:597\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bl_\be_\ba_\br\n-void clear()\n-Erases all of the elements.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:551\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n-BitSetVectorReference< block_size, Allocator > * pointer\n-Pointer to a small block of bits.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:487\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-reference operator[](int i)\n-Return reference to i-th block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:579\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const\n-Return the number of blocks.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-std::vector< bool, Allocator >::size_type size_type\n-size type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:493\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n-BitSetVector(int n, bool v)\n-Constructor which initializes the field with true or false.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:546\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-Returns a const_iterator pointing to the beginning of the vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:511\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type,\n-reference, std::ptrdiff_t, ForwardIteratorFacade > iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:501\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(int n, bool v=bool())\n-Resize field.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:557\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-Allocator allocator_type\n-The type of the allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n-BitSetVector(int n)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:541\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bu_\bn_\bs_\be_\bt_\bA_\bl_\bl\n-void unsetAll()\n-Sets all entries to false\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:574\n-_\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\n-A proxy class that acts as a mutable reference to a single bitset in a\n-BitSetVector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:222\n-_\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:_\bt_\be_\bs_\bt\n-bool test(size_type n) const\n-Returns true if bit n is set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:124\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BitSetVectorReference & operator=(const BitSetVectorConstReference &b)\n-Assignment from BitSetVectorConstReference.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:266\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-reference operator[](size_type i)\n-Return reference to the i-th bit.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:413\n-_\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:_\br_\be_\bs_\be_\bt\n-BitSetVectorReference & reset(size_type n)\n-Clears bit n.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:396\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b=\n-BitSetVectorReference & operator<<=(size_type n)\n-Left shift.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:350\n-_\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_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n-Dune::BitSetVector< block_size, Alloc > BitSetVector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:225\n-_\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:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-std::vector< bool, Alloc >::const_reference const_reference\n-A proxy class that acts as a const reference to a single bit.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:243\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BitSetVectorReference & operator=(const BitSetVectorReference &b)\n-Assignment from BitSetVectorReference.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:274\n-_\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:_\bg_\be_\bt_\bB_\bi_\bt\n-reference getBit(size_type i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:423\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=\n-BitSetVectorReference & operator&=(const BitSetVectorConstReference &x)\n-Bitwise and (for BitSetVectorConstReference and BitSetVectorReference)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:290\n-_\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_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-BitSetVectorReference(BitSetVector &blockBitField_, int block_number_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:230\n-_\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:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-size_t size_type\n-size_type typedef (an unsigned integral type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:247\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BitSetVectorReference & operator=(const bitset &b)\n-Assignment from bitset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:258\n-_\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_\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\n-Dune::BitSetVectorConstReference< block_size, Alloc >\n-BitSetVectorConstReference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:228\n-_\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:_\br_\be_\bs_\be_\bt\n-BitSetVectorReference & reset()\n-Clears every bit.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:382\n-_\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_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd\n-BitSetVector & blockBitField\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:419\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=\n-BitSetVectorReference & operator|=(const BitSetVectorConstReference &x)\n-Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:306\n-_\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:_\bs_\be_\bt\n-BitSetVectorReference & set(size_type n, int val=1)\n-Sets bit n if val is nonzero, and clears bit n if val is zero.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:389\n-_\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_\bi_\bt_\bs_\be_\bt\n-std::bitset< block_size > bitset\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:236\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=\n-BitSetVectorReference & operator^=(const bitset &x)\n-Bitwise exclusive or (for bitset).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:314\n-_\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:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-std::vector< bool, Alloc >::reference reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:241\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=\n-BitSetVectorReference & operator|=(const bitset &x)\n-Bitwise inclusive or (for bitset)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:298\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>_\b=\n-BitSetVectorReference & operator>>=(size_type n)\n-Right shift.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:358\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=\n-BitSetVectorReference & operator^=(const BitSetVectorConstReference &x)\n-Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:340\n-_\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:_\bf_\bl_\bi_\bp\n-BitSetVectorReference & flip(size_type n)\n-Flips bit n.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:403\n-_\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:_\bf_\bl_\bi_\bp\n-BitSetVectorReference & flip()\n-Flips the value of every bit.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:374\n-_\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:_\bs_\be_\bt\n-BitSetVectorReference & set()\n-Sets every bit.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:366\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=\n-BitSetVectorReference & operator&=(const bitset &x)\n-Bitwise and (for bitset).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:282\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BitSetVectorReference & operator=(bool b)\n-Assignment from bool, sets each bit in the bitset to b.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:250\n-_\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\n-A proxy class that acts as a const reference to a single bitset in a\n-BitSetVector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:38\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const bitset &bs) const\n-Equality of reference and std::bitset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:142\n-_\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:_\bt_\be_\bs_\bt\n-bool test(size_type n) const\n-Returns true if bit n is set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:124\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const_reference operator[](size_type i) const\n-Return reference to the i-th bit.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:130\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-bitset operator<<(size_type n) const\n-Returns a copy of *this shifted left by n bits.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:64\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b)\n-hide assignment operator\n-_\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_\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\n-BitSetVectorConstReference(const BitSetVector &blockBitField_, int\n-block_number_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:44\n-_\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_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd\n-const BitSetVector & blockBitField\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:181\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n-bitset operator>>(size_type n) const\n-Returns a copy of *this shifted right by n bits.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:72\n-_\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:_\bg_\be_\bt_\bB_\bi_\bt\n-const_reference getBit(size_type i) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:184\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const bitset &bs) const\n-Inequality of reference and std::bitset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:154\n-_\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:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const BS &bs) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:190\n-_\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_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n-Dune::BitSetVector< block_size, Alloc > BitSetVector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:41\n-_\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_\bi_\bt_\bs_\be_\bt\n-std::bitset< block_size > bitset\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:56\n-_\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:_\ba_\bl_\bl\n-bool all() const\n-Returns true if all bits are set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:115\n-_\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:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-size_t size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:61\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~\n-bitset operator~() const\n-Returns a copy of *this with all of its bits flipped.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:80\n-_\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:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-std::vector< bool, Alloc >::const_reference reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:59\n-_\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:_\bs_\bi_\bz_\be\n-size_type size() const\n-Returns block_size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:88\n-_\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:_\bc_\bo_\bu_\bn_\bt\n-size_type count() const\n-Returns the number of bits that are set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:94\n-_\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:_\bn_\bo_\bn_\be\n-bool none() const\n-Returns true if no bits are set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:109\n-_\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:_\ba_\bn_\by\n-bool any() const\n-Returns true if any bits are set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:103\n-_\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__\bn_\bu_\bm_\bb_\be_\br\n-int block_number\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:182\n-_\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:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-std::vector< bool, Alloc >::const_reference const_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:60\n-_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-friend std::ostream & operator<<(std::ostream &s, const\n-BitSetVectorConstReference &v)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:171\n-_\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>_\b:_\b:_\bt_\by_\bp_\be\n-BitSetVectorConstReference< block_size, Alloc > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:443\n-_\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>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-BitSetVectorConstReference< block_size, Alloc > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:449\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 _\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>_\b:_\b:_\bt_\by_\bp_\be\n-BitSetVectorReference< block_size, Alloc > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:455\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 _\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>_\b _\b>_\b:_\b:\n-_\bt_\by_\bp_\be\n-BitSetVectorReference< block_size, Alloc > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:461\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:_\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:_\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:_\bF_\bo_\br_\bw_\ba_\br_\bd_\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:141\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: ios_state.cc File Reference\n+dune-common: filledarray.hh File Reference\n \n \n \n \n \n \n \n@@ -70,26 +70,42 @@\n
\n \n
\n \n
\n \n-
ios_state.cc File Reference
\n+Namespaces |\n+Functions
\n+
filledarray.hh File Reference
\n \n
\n-\n+\n+

Utility to generate an array with a certain value. \n+More...

\n+
#include <array>
\n+#include <cstddef>
\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+Functions

template<std::size_t n, class T >
constexpr std::array< T, n > Dune::filledArray (const T &t)
 Return an array filled with the provided value.
 
\n-
\n+

Detailed Description

\n+

Utility to generate an array with a certain value.

\n+
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,15 +1,25 @@\n dune-common\u00a02.9.0\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\n-ios_state.cc File Reference\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bo_\bs_\b__\bs_\bt_\ba_\bt_\be_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+filledarray.hh File Reference\n+Utility to generate an array with a certain value. _\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+constexpr std::array< T, n >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\bl_\bl_\be_\bd_\bA_\br_\br_\ba_\by (const T &t)\n+\u00a0 Return an array filled with the provided value.\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 to generate an array with a certain value.\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: lru.hh File Reference\n+dune-common: path.hh File Reference\n \n \n \n \n \n \n \n@@ -70,45 +70,56 @@\n
\n \n
\n \n
\n \n-
lru.hh File Reference
\n+Namespaces |\n+Functions
\n+
path.hh File Reference
\n \n
\n \n-

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

Utilities for handling filesystem paths. \n More...

\n-
#include <list>
\n-#include <utility>
\n-#include <map>
\n-#include <memory>
\n-#include <dune/common/exceptions.hh>
\n+
#include <string>
\n
\n

Go to the source code of this file.

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

\n-Classes

class  Dune::lru< Key, Tp, Traits >
 LRU Cache Container. 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-

LRU Cache Container, using an STL like interface.

\n-
Author
Christian Engwer
\n+

Utilities for handling filesystem paths.

\n+
Author
J\u00f6 Fahlke jorri.nosp@m.t@jo.nosp@m.rrit..nosp@m.de
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-us-ascii\n+utf-8\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,29 +1,42 @@\n dune-common\u00a02.9.0\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-#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+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+path.hh 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 _\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-\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-LRU Cache Container, using an STL like interface.\n+Utilities for handling filesystem paths.\n Author\n- Christian Engwer\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 ===============================================================================\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: lru.hh Source File\n+dune-common: path.hh Source File\n \n \n \n \n \n \n \n@@ -74,238 +74,54 @@\n \n
\n \n
\n
\n
\n-
lru.hh
\n+
path.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 (C) 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_COMMON_PATH_HH
\n+
6#define DUNE_COMMON_PATH_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+
8#include <string>
\n+
9
\n+
10namespace Dune {
\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-
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-
96
\n-
\n-
101 const_reference back ([[maybe_unused]] int i) const
\n-
102 {
\n-
103 return _data.back().second;
\n-
104 }
\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-
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-
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-
235
\n-
236} // namespace Dune
\n-
237
\n-
238#endif // DUNE_COMMON_LRU_HH
\n-
A few common exception classes.
\n-
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
\n+
51 std::string concatPaths(const std::string& base, const std::string& p);
\n+
52
\n+
54
\n+
98 std::string processPath(const std::string& p);
\n+
99
\n+
101
\n+
109 bool pathIndicatesDirectory(const std::string& p);
\n+
110
\n+
112
\n+
151 std::string prettyPath(const std::string& p, bool isDirectory);
\n+
152
\n+
154
\n+
160 std::string prettyPath(const std::string& p);
\n+
161
\n+
163
\n+
179 std::string relativePath(const std::string& newbase, const std::string& p);
\n+
180
\n+
182}
\n+
183
\n+
184#endif // DUNE_COMMON_PATH_HH
\n+
std::string processPath(const std::string &p)
sanitize a path for further processing
Definition path.cc:41
\n+
bool pathIndicatesDirectory(const std::string &p)
check whether the given path indicates that it is a directory
Definition path.cc:115
\n+
std::string prettyPath(const std::string &p, bool isDirectory)
pretty print path
Definition path.cc:126
\n+
std::string relativePath(const std::string &newbase, const std::string &p)
compute a relative path between two paths
Definition path.cc:153
\n+
std::string concatPaths(const std::string &base, const std::string &p)
concatenate two paths
Definition path.cc:32
\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
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,267 +1,65 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-lru.hh\n+path.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 (C) 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_COMMON_PATH_HH\n+6#define DUNE_COMMON_PATH_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+8#include \n+9\n+10namespace _\bD_\bu_\bn_\be {\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-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-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-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-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-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-237\n-238#endif // DUNE_COMMON_LRU_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+51 std::string _\bc_\bo_\bn_\bc_\ba_\bt_\bP_\ba_\bt_\bh_\bs(const std::string& base, const std::string& p);\n+52\n+54\n+98 std::string _\bp_\br_\bo_\bc_\be_\bs_\bs_\bP_\ba_\bt_\bh(const std::string& p);\n+99\n+101\n+109 bool _\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+110\n+112\n+151 std::string _\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh(const std::string& p, bool isDirectory);\n+152\n+154\n+160 std::string _\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh(const std::string& p);\n+161\n+163\n+179 std::string _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bP_\ba_\bt_\bh(const std::string& newbase, const std::string& p);\n+180\n+182}\n+183\n+184#endif // DUNE_COMMON_PATH_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bo_\bc_\be_\bs_\bs_\bP_\ba_\bt_\bh\n+std::string processPath(const std::string &p)\n+sanitize a path for further processing\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:41\n+_\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\n+bool pathIndicatesDirectory(const std::string &p)\n+check whether the given path indicates that it is a directory\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh\n+std::string prettyPath(const std::string &p, bool isDirectory)\n+pretty print path\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bP_\ba_\bt_\bh\n+std::string relativePath(const std::string &newbase, const std::string &p)\n+compute a relative path between two paths\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bc_\ba_\bt_\bP_\ba_\bt_\bh_\bs\n+std::string concatPaths(const std::string &base, const std::string &p)\n+concatenate two paths\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:32\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 ===============================================================================\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: scalarvectorview.hh File Reference\n+dune-common: precision.hh File Reference\n \n \n \n \n \n \n \n@@ -70,39 +70,40 @@\n
\n \n
\n
\n
\n \n-
scalarvectorview.hh File Reference
\n+
precision.hh File Reference
\n
\n
\n \n-

Implements a scalar vector view wrapper around an existing scalar. \n+

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

\n-
#include <cstddef>
\n-#include <type_traits>
\n-#include <istream>
\n-#include <dune/common/densevector.hh>
\n-#include <dune/common/fvector.hh>
\n-#include <dune/common/typetraits.hh>
\n-#include <dune/common/matvectraits.hh>
\n+
#include <stdlib.h>
\n
\n

Go to the source code of this file.

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

\n+Classes

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-

Implements a scalar vector view wrapper around an existing scalar.

\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,26 +1,24 @@\n dune-common\u00a02.9.0\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\n-scalarvectorview.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 vector 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/_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\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/_\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+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\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+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-Implements a scalar vector view wrapper around an existing scalar.\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/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: scalarvectorview.hh Source File\n+dune-common: precision.hh Source File\n \n \n \n \n \n \n \n@@ -74,194 +74,62 @@\n \n
\n \n
\n
\n
\n-
scalarvectorview.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 (C) 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_SCALARVECTORVIEW_HH
\n-
6#define DUNE_COMMON_SCALARVECTORVIEW_HH
\n+
5#ifndef DUNE_PRECISION_HH
\n+
6#define DUNE_PRECISION_HH
\n
7
\n-
8#include <cstddef>
\n-
9#include <type_traits>
\n-
10#include <istream>
\n-
11
\n-\n-\n-\n-\n-
16
\n-
17namespace Dune {
\n-
18
\n-
19namespace Impl {
\n-
20
\n-
35 template<class K>
\n-
36 class ScalarVectorView :
\n-
37 public DenseVector<ScalarVectorView<K>>
\n-
38 {
\n-
39 K* dataP_;
\n-
40 using Base = DenseVector<ScalarVectorView<K>>;
\n-
41
\n-
42 template <class>
\n-
43 friend class ScalarVectorView;
\n-
44 public:
\n-
45
\n-
47 constexpr static int dimension = 1;
\n-
48
\n-
50 using size_type = typename Base::size_type;
\n-
51
\n-
53 using reference = std::decay_t<K>&;
\n-
54
\n-
56 using const_reference = const K&;
\n-
57
\n-
58 //===== construction
\n-
59
\n-
61 constexpr ScalarVectorView ()
\n-
62 : dataP_(nullptr)
\n-
63 {}
\n-
64
\n-
66 ScalarVectorView (K* p) :
\n-
67 dataP_(p)
\n-
68 {}
\n-
69
\n-
71 ScalarVectorView (const ScalarVectorView &other) :
\n-
72 Base(),
\n-
73 dataP_(other.dataP_)
\n-
74 {}
\n-
75
\n-
77 ScalarVectorView (ScalarVectorView &&other) :
\n-
78 Base(),
\n-
79 dataP_( other.dataP_ )
\n-
80 {}
\n-
81
\n-
83 ScalarVectorView& operator= (const ScalarVectorView& other)
\n-
84 {
\n-
85 assert(dataP_);
\n-
86 assert(other.dataP_);
\n-
87 *dataP_ = *(other.dataP_);
\n-
88 return *this;
\n-
89 }
\n-
90
\n-
91 template<class KK>
\n-
92 ScalarVectorView& operator= (const ScalarVectorView<KK>& other)
\n-
93 {
\n-
94 assert(dataP_);
\n-
95 assert(other.dataP_);
\n-
96 *dataP_ = *(other.dataP_);
\n-
97 return *this;
\n-
98 }
\n-
99
\n-
101 template<typename T,
\n-
102 std::enable_if_t<std::is_convertible<T, K>::value, int> = 0>
\n-
103 inline ScalarVectorView& operator= (const T& k)
\n-
104 {
\n-
105 *dataP_ = k;
\n-
106 return *this;
\n-
107 }
\n-
108
\n-
110 static constexpr size_type size ()
\n-
111 {
\n-
112 return 1;
\n-
113 }
\n-
114
\n-
116 K& operator[] ([[maybe_unused]] size_type i)
\n-
117 {
\n-
118 DUNE_ASSERT_BOUNDS(i == 0);
\n-
119 return *dataP_;
\n-
120 }
\n-
121
\n-
123 const K& operator[] ([[maybe_unused]] size_type i) const
\n-
124 {
\n-
125 DUNE_ASSERT_BOUNDS(i == 0);
\n-
126 return *dataP_;
\n-
127 }
\n-
128 }; // class ScalarVectorView
\n-
129
\n-
130} // namespace Impl
\n-
131
\n-
132
\n-
133 template< class K>
\n-
134 struct DenseMatVecTraits< Impl::ScalarVectorView<K> >
\n-
135 {
\n-
136 using derived_type = Impl::ScalarVectorView<K>;
\n-
137 using value_type = std::remove_const_t<K>;
\n-
138 using size_type = std::size_t;
\n-
139 };
\n-
140
\n-
141 template< class K >
\n-
142 struct FieldTraits< Impl::ScalarVectorView<K> > : public FieldTraits<std::remove_const_t<K>> {};
\n-
143
\n-
144 template<class K>
\n-
145 struct AutonomousValueType<Impl::ScalarVectorView<K>>
\n-
146 {
\n-
147 using type = FieldVector<std::remove_const_t<K>,1>;
\n-
148 };
\n-
149
\n-
150namespace Impl {
\n-
151
\n-
163 template<class K>
\n-
164 inline std::istream &operator>> ( std::istream &in, ScalarVectorView<K> &v )
\n-
165 {
\n-
166 K w;
\n-
167 if(in >> w)
\n-
168 v = w;
\n-
169 return in;
\n-
170 }
\n-
171
\n-
172
\n-
174 template<class T,
\n-
175 std::enable_if_t<IsNumber<T>::value, int> = 0>
\n-
176 auto asVector(T& t)
\n-
177 {
\n-
178 return ScalarVectorView<T>{&t};
\n-
179 }
\n-
180
\n-
182 template<class T,
\n-
183 std::enable_if_t<IsNumber<T>::value, int> = 0>
\n-
184 auto asVector(const T& t)
\n-
185 {
\n-
186 return ScalarVectorView<const T>{&t};
\n-
187 }
\n-
188
\n-
190 template<class T,
\n-
191 std::enable_if_t<not IsNumber<T>::value, int> = 0>
\n-
192 T& asVector(T& t)
\n-
193 {
\n-
194 return t;
\n-
195 }
\n-
196
\n-
198 template<class T,
\n-
199 std::enable_if_t<not IsNumber<T>::value, int> = 0>
\n-
200 const T& asVector(const T& t)
\n-
201 {
\n-
202 return t;
\n-
203 }
\n-
204
\n-
205} // end namespace Impl
\n-
206
\n-
207} // end namespace Dune
\n-
208
\n-
209#endif // DUNE_COMMON_SCALARVECTORVIEW_HH
\n-
Implements the dense vector interface, with an exchangeable storage class.
\n-
Implements a vector constructed from a given type representing a field and a compile-time given size.
\n-
Traits for type conversions and type information.
\n-
Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
\n-
Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
Read a std::tuple.
Definition streamoperators.hh:43
\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+
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-
size_type size() const
size method
Definition densevector.hh:336
\n-
Traits::size_type size_type
The type used for the index access and size operation.
Definition densevector.hh:259
\n-
T type
Definition typetraits.hh:501
\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,213 +1,60 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-scalarvectorview.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 (C) 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_SCALARVECTORVIEW_HH\n-6#define DUNE_COMMON_SCALARVECTORVIEW_HH\n+5#ifndef DUNE_PRECISION_HH\n+6#define DUNE_PRECISION_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/_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-14#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-15#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-16\n-17namespace _\bD_\bu_\bn_\be {\n-18\n-19namespace Impl {\n-20\n-35 template\n-36 class ScalarVectorView :\n-37 public DenseVector>\n-38 {\n-39 K* dataP_;\n-40 using Base = DenseVector>;\n-41\n-42 template \n-43 friend class ScalarVectorView;\n-44 public:\n-45\n-47 constexpr static int dimension = 1;\n-48\n-50 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-51\n-53 using reference = std::decay_t&;\n-54\n-56 using const_reference = const K&;\n-57\n-58 //===== construction\n-59\n-61 constexpr ScalarVectorView ()\n-62 : dataP_(nullptr)\n-63 {}\n-64\n-66 ScalarVectorView (K* p) :\n-67 dataP_(p)\n-68 {}\n-69\n-71 ScalarVectorView (const ScalarVectorView &other) :\n-72 Base(),\n-73 dataP_(other.dataP_)\n-74 {}\n-75\n-77 ScalarVectorView (ScalarVectorView &&other) :\n-78 Base(),\n-79 dataP_( other.dataP_ )\n-80 {}\n-81\n-83 ScalarVectorView& operator= (const ScalarVectorView& other)\n-84 {\n-85 assert(dataP_);\n-86 assert(other.dataP_);\n-87 *dataP_ = *(other.dataP_);\n-88 return *this;\n-89 }\n-90\n-91 template\n-92 ScalarVectorView& operator= (const ScalarVectorView& other)\n-93 {\n-94 assert(dataP_);\n-95 assert(other.dataP_);\n-96 *dataP_ = *(other.dataP_);\n-97 return *this;\n-98 }\n-99\n-101 template::value, int> = 0>\n-103 inline ScalarVectorView& operator= (const T& k)\n-104 {\n-105 *dataP_ = k;\n-106 return *this;\n-107 }\n-108\n-110 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be ()\n-111 {\n-112 return 1;\n-113 }\n-114\n-116 K& operator[] ([[maybe_unused]] size_type i)\n-117 {\n-118 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n-119 return *dataP_;\n-120 }\n-121\n-123 const K& operator[] ([[maybe_unused]] size_type i) const\n-124 {\n-125 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n-126 return *dataP_;\n-127 }\n-128 }; // class ScalarVectorView\n-129\n-130} // namespace Impl\n-131\n-132\n-133 template< class K>\n-134 struct DenseMatVecTraits< Impl::ScalarVectorView >\n-135 {\n-136 using derived_type = Impl::ScalarVectorView;\n-137 using value_type = std::remove_const_t;\n-138 using size_type = std::size_t;\n-139 };\n-140\n-141 template< class K >\n-142 struct FieldTraits< Impl::ScalarVectorView > : public FieldTraits> {};\n-143\n-144 template\n-145 struct AutonomousValueType>\n-146 {\n-147 using _\bt_\by_\bp_\be = FieldVector,1>;\n-148 };\n-149\n-150namespace Impl {\n-151\n-163 template\n-164 inline std::istream &_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>_\b ( std::istream &in, ScalarVectorView &v\n-)\n-165 {\n-166 K w;\n-167 if(in >> w)\n-168 v = w;\n-169 return in;\n-170 }\n-171\n-172\n-174 template::value, int> = 0>\n-176 auto asVector(T& t)\n-177 {\n-178 return ScalarVectorView{&t};\n-179 }\n-180\n-182 template::value, int> = 0>\n-184 auto asVector(const T& t)\n-185 {\n-186 return ScalarVectorView{&t};\n-187 }\n-188\n-190 template::value, int> = 0>\n-192 T& asVector(T& t)\n-193 {\n-194 return t;\n-195 }\n-196\n-198 template::value, int> = 0>\n-200 const T& asVector(const T& t)\n-201 {\n-202 return t;\n-203 }\n-204\n-205} // end namespace Impl\n-206\n-207} // end namespace Dune\n-208\n-209#endif // DUNE_COMMON_SCALARVECTORVIEW_HH\n-_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-Implements the dense vector interface, with an exchangeable storage class.\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-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\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-_\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__\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+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:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br_\bV_\bi_\be_\bw_\b<_\b _\bK_\b _\b>_\b _\b>_\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br_\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 densevector.hh:259\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:501\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/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: function.hh File Reference\n+dune-common: concept.hh File Reference\n \n \n \n \n \n \n \n@@ -72,75 +72,88 @@\n
  • dune
  • common
  • \n
    \n \n
    \n \n-
    function.hh File Reference
    \n+
    concept.hh File Reference
    \n
    \n
    \n \n-

    Simple base class templates for functions. \n+

    Infrastructure for concepts. \n More...

    \n-
    #include <utility>
    \n-#include <dune/common/deprecated.hh>
    \n-#include "typetraits.hh"
    \n+
    #include <type_traits>
    \n+#include <utility>
    \n+#include <tuple>
    \n+#include <dune/common/typeutilities.hh>
    \n+#include <dune/common/typelist.hh>
    \n+#include <dune/common/tupleutility.hh>
    \n+#include <dune/common/std/type_traits.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::Function< Domain, Range >
     Base class template for function classes. More...
     
    struct  Dune::Function< Domain, Range >::Traits
     Traits class containing raw types. More...
     
    class  Dune::VirtualFunction< DomainType, RangeType >
     Virtual base class template for function classes. More...
    struct  Dune::Concept::Refines< BaseConcepts >
     Base class for refined concepts. More...
     
    \n \n \n \n \n-

    \n Namespaces

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

    \n-Macros

    #define DUNE_FUNCTION_HH
     
    namespace  Dune::Concept
     Namespace for concepts.
     
    \n \n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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 Domain , typename Range , typename F >
    Impl::LambdaVirtualFunction< Domain, Range, std::decay_t< F > > Dune::makeVirtualFunction (F &&f)
     make VirtualFunction out of a function object
     
    template<class C , class... T>
    constexpr auto Dune::models ()
     Check if concept is modeled by given types.
     
    template<class C , class Tuple >
    constexpr auto Dune::Concept::tupleEntriesModel () -> typename Impl::TupleEntriesModelHelper< C, Tuple >::Result
     
    template<bool b, typename std::enable_if< b, int >::type = 0>
    constexpr bool Dune::Concept::requireTrue ()
     
    template<class C , class... T, typename std::enable_if< models< C, T... >(), int >::type = 0>
    constexpr bool Dune::Concept::requireConcept ()
     
    template<class C , class... T, typename std::enable_if< models< C, T... >(), int >::type = 0>
    constexpr bool Dune::Concept::requireConcept (T &&...)
     
    template<class C , class Tuple , typename std::enable_if< tupleEntriesModel< C, Tuple >(), int >::type = 0>
    constexpr bool Dune::Concept::requireConceptForTupleEntries ()
     
    template<class From , class To , typename std::enable_if< std::is_convertible< From, To >::value, int >::type = 0>
    constexpr bool Dune::Concept::requireConvertible ()
     
    template<class To , class From , typename std::enable_if< std::is_convertible< From, To >::value, int >::type = 0>
    constexpr bool Dune::Concept::requireConvertible (const From &)
     
    template<typename T >
    constexpr bool Dune::Concept::requireType ()
     
    template<class Base , class Derived , typename std::enable_if< std::is_base_of< Base, Derived >::value, int >::type = 0>
    constexpr bool Dune::Concept::requireBaseOf ()
     
    template<class Base , class Derived , typename std::enable_if< std::is_base_of< Base, Derived >::value, int >::type = 0>
    constexpr bool Dune::Concept::requireBaseOf (const Derived &)
     
    template<class A , class B , typename std::enable_if< std::is_same< A, B >::value, int >::type = 0>
    constexpr bool Dune::Concept::requireSameType ()
     
    \n

    Detailed Description

    \n-

    Simple base class templates for functions.

    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_FUNCTION_HH

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_FUNCTION_HH
    \n-
    \n-\n-
    \n-
    \n-
    \n+

    Infrastructure for concepts.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,45 +1,79 @@\n dune-common\u00a02.9.0\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-function.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn\n-Simple base class templates for functions. _\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+concept.hh File Reference\n+Infrastructure for concepts. _\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/_\bd_\be_\bp_\br_\be_\bc_\ba_\bt_\be_\bd_\b._\bh_\bh>\n-#include \"_\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/_\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/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\bu_\bp_\bl_\be_\bu_\bt_\bi_\bl_\bi_\bt_\by_\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 _\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_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b _\b>\n-\u00a0 Base class template for function classes. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b _\b>_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs\n-\u00a0 _\bT_\br_\ba_\bi_\bt_\bs class containing raw types. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be_\b,_\b _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b _\b>\n-\u00a0 Virtual base class template for function classes. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bR_\be_\bf_\bi_\bn_\be_\bs_\b<_\b _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b _\b>\n+\u00a0 Base class for refined concepts. _\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__\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bH_\bH\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt\n+\u00a0 Namespace for concepts.\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-Impl::LambdaVirtualFunction< Domain,\n- Range, std::decay_t< F > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn (F &&f)\n-\u00a0 make _\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn out of a function\n- object\n+template\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bo_\bd_\be_\bl_\bs ()\n+\u00a0 Check if concept is modeled by given types.\n+\u00a0\n+template\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bt_\bu_\bp_\bl_\be_\bE_\bn_\bt_\br_\bi_\be_\bs_\bM_\bo_\bd_\be_\bl () -> typename Impl::\n+ TupleEntriesModelHelper< C, Tuple >::Result\n+\u00a0\n+template::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bT_\br_\bu_\be ()\n+\u00a0\n+template(),\n+int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt ()\n+\u00a0\n+template(),\n+int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt (T &&...)\n+\u00a0\n+template(), int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt_\bF_\bo_\br_\bT_\bu_\bp_\bl_\be_\bE_\bn_\bt_\br_\bi_\be_\bs ()\n+\u00a0\n+template::value, int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be ()\n+\u00a0\n+template::value, int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be (const From &)\n+\u00a0\n+template\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bT_\by_\bp_\be ()\n+\u00a0\n+template::value, int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bB_\ba_\bs_\be_\bO_\bf ()\n+\u00a0\n+template::value, int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bB_\ba_\bs_\be_\bO_\bf (const Derived &)\n+\u00a0\n+template::\n+value, int >::type = 0>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bS_\ba_\bm_\be_\bT_\by_\bp_\be ()\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-Simple base class templates for functions.\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_F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bN_\b_H\bHH\bH *\b**\b**\b**\b**\b*\n-#define DUNE_FUNCTION_HH\n+Infrastructure for concepts.\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: function.hh Source File\n+dune-common: concept.hh Source File\n \n \n \n \n \n \n \n@@ -74,143 +74,336 @@\n \n
    \n \n
    \n \n
    \n-
    function.hh
    \n+
    concept.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 (C) 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_FUNCTION_HH_SILENCE_DEPRECATION
    \n-
    6#warning This file is deprecated after Dune 2.7! Use C++ function objects and std::function stuff instead!
    \n-
    7#else // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION
    \n-
    8#undef DUNE_FUNCTION_HH_SILENCE_DEPRECATION
    \n-
    9#endif // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION
    \n-
    10
    \n-
    11#ifndef DUNE_FUNCTION_HH
    \n-
    12#define DUNE_FUNCTION_HH
    \n-
    13
    \n-
    14#include <utility>
    \n-
    15
    \n-\n-
    17#include "typetraits.hh"
    \n-
    18
    \n-
    19namespace Dune {
    \n-
    20
    \n-
    36 template <class Domain, class Range>
    \n-
    \n-
    37 class
    \n-
    38 [[deprecated("Dune::Function is deprecated after Dune 2.7. Use C++ "
    \n-
    39 "function objects instead!")]]
    \n-\n-
    41 {
    \n-
    42 typedef typename std::remove_cv<typename std::remove_reference< Domain >::type >::type RawDomainType;
    \n-
    43 typedef typename std::remove_cv<typename std::remove_reference< Range >::type >::type RawRangeType;
    \n-
    44
    \n-
    45 public:
    \n-
    46
    \n-
    48 typedef RawRangeType RangeType;
    \n-
    49
    \n-
    51 typedef RawDomainType DomainType;
    \n-
    52
    \n-
    \n-
    54 struct Traits
    \n-
    55 {
    \n-
    56 typedef RawDomainType DomainType;
    \n-
    57 typedef RawRangeType RangeType;
    \n-
    58 };
    \n-
    \n-
    59
    \n-
    66 void evaluate(const typename Traits::DomainType& x, typename Traits::RangeType& y) const;
    \n-
    67 }; // end of Function class
    \n-
    \n-
    68
    \n-
    69
    \n-
    70
    \n-\n-
    82 template <class DomainType, class RangeType>
    \n-
    \n-
    83 class
    \n-
    84 [[deprecated("Dune::VirtualFunction is deprecated after Dune 2.7. Use C++ "
    \n-
    85 "function objects and std::function instead!")]]
    \n-\n-
    87 {
    \n-
    88 public:
    \n-\n+
    5#ifndef DUNE_COMMON_CONCEPT_HH
    \n+
    6#define DUNE_COMMON_CONCEPT_HH
    \n+
    7
    \n+
    8#include <type_traits>
    \n+
    9#include <utility>
    \n+
    10#include <tuple>
    \n+
    11
    \n+\n+\n+\n+\n+
    16
    \n+
    23namespace Dune {
    \n+
    24
    \n+
    \n+
    34namespace Concept {
    \n+
    35
    \n+
    36
    \n+
    37
    \n+
    52template<class... BaseConcepts>
    \n+
    \n+
    53struct Refines
    \n+
    54{
    \n+
    55 typedef TypeList<BaseConcepts...> BaseConceptList;
    \n+
    56};
    \n+
    \n+
    57
    \n+
    58
    \n+
    59#ifndef DOXYGEN
    \n+
    60
    \n+
    61namespace Impl {
    \n+
    62
    \n+
    63 // #############################################################################
    \n+
    64 // # All functions following here are implementation details
    \n+
    65 // # for the models() function below.
    \n+
    66 // #############################################################################
    \n+
    67
    \n+
    68 // Forward declaration
    \n+
    69 template<class C, class... T>
    \n+
    70 constexpr bool models();
    \n+
    71
    \n+
    72
    \n+
    73
    \n+
    74 // Here is the implementation of the concept checking.
    \n+
    75 // The first two overloads do the magic for checking
    \n+
    76 // if the requirements of a concept are satisfied.
    \n+
    77 // The rest is just for checking base concepts in case
    \n+
    78 // of refinement.
    \n+
    79
    \n+
    80 // This overload is present if type substitution for
    \n+
    81 // C::require(T...) is successful, i.e., if the T...
    \n+
    82 // matches the requirement of C. In this case this
    \n+
    83 // overload is selected because PriorityTag<1>
    \n+
    84 // is a better match for PrioriryTag<42> than
    \n+
    85 // PriorityTag<0> in the default overload.
    \n+
    86 template<class C, class... T,
    \n+
    87 decltype(std::declval<C>().require(std::declval<T>()...), 0) =0>
    \n+
    88 constexpr std::true_type matchesRequirement(PriorityTag<1>)
    \n+
    89 { return {}; }
    \n
    90
    \n-
    91 virtual ~VirtualFunction() {}
    \n-
    98 virtual void evaluate(const typename Traits::DomainType& x, typename Traits::RangeType& y) const = 0;
    \n-
    99 }; // end of VirtualFunction class
    \n-
    \n-\n-
    101
    \n-
    102 namespace Impl {
    \n-
    103
    \n-\n-
    105 template<typename Domain, typename Range, typename F>
    \n-
    106 class LambdaVirtualFunction final
    \n-
    107 : public VirtualFunction<Domain, Range>
    \n-
    108 {
    \n-
    109 public:
    \n-
    110 LambdaVirtualFunction(F&& f)
    \n-
    111 : f_(std::move(f))
    \n-
    112 {}
    \n+
    91 // If the above overload is ruled out by SFINAE because
    \n+
    92 // the T... does not match the requirements of C, then
    \n+
    93 // this default overload drops in.
    \n+
    94 template<class C, class... T>
    \n+
    95 constexpr std::false_type matchesRequirement(PriorityTag<0>)
    \n+
    96 { return {}; }
    \n+
    97
    \n+
    98
    \n+
    99
    \n+
    100 // An empty list C of concepts is always matched by T...
    \n+
    101 template<class...T>
    \n+
    102 constexpr bool modelsConceptList(TypeList<>)
    \n+
    103 { return true; }
    \n+
    104
    \n+
    105 // A nonempty list C0,..,CN of concepts is modeled
    \n+
    106 // by T... if it models the concept C0
    \n+
    107 // and all concepts in the list C1,..,CN.
    \n+
    108 template<class...T, class C0, class... CC>
    \n+
    109 constexpr bool modelsConceptList(TypeList<C0, CC...>)
    \n+
    110 { return models<C0, T...>() and modelsConceptList<T...>(TypeList<CC...>()); }
    \n+
    111
    \n+
    112
    \n
    113
    \n-
    114 LambdaVirtualFunction(const F& f)
    \n-
    115 : f_(f)
    \n-
    116 {}
    \n-
    117
    \n-
    118 void evaluate(const Domain& x, Range& y) const override
    \n-
    119 {
    \n-
    120 y = f_(x);
    \n-
    121 }
    \n-
    122
    \n-
    123 private:
    \n-
    124 const F f_;
    \n-
    125 };
    \n-\n-
    127
    \n-
    128 } /* namespace Impl */
    \n-
    129
    \n-
    149 template<typename Domain, typename Range, typename F>
    \n-
    150 [[deprecated("Dune::LambdaVirtualFunction is deprecated after Dune 2.7. "
    \n-
    151 "Use std::function instead!")]]
    \n-
    152 Impl::LambdaVirtualFunction< Domain, Range, std::decay_t<F> >
    \n-
    \n-\n-
    154 {
    \n-
    155 return {std::forward<F>(f)};
    \n-
    156 }
    \n-
    \n-
    157
    \n-
    160} // end namespace
    \n-
    161
    \n-
    162#endif
    \n-
    Traits for type conversions and type information.
    \n-
    Definition of the DUNE_NO_DEPRECATED_* macros.
    \n-
    Impl::LambdaVirtualFunction< Domain, Range, std::decay_t< F > > makeVirtualFunction(F &&f)
    make VirtualFunction out of a function object
    Definition function.hh:153
    \n-
    #define DUNE_NO_DEPRECATED_END
    Ignore deprecation warnings (end)
    Definition deprecated.hh:38
    \n-
    #define DUNE_NO_DEPRECATED_BEGIN
    Ignore deprecation warnings (start)
    Definition deprecated.hh:32
    \n+
    114 // If C is an unrefined concept, then T... models C
    \n+
    115 // if it matches the requirement of C.
    \n+
    116 template<class C, class... T>
    \n+
    117 constexpr bool modelsConcept(PriorityTag<0>)
    \n+
    118 { return matchesRequirement<C, T...>(PriorityTag<42>()); }
    \n+
    119
    \n+
    120 // If C is a refined concept, then T... models C
    \n+
    121 // if it matches the requirement of C and of
    \n+
    122 // all base concepts.
    \n+
    123 //
    \n+
    124 // This overload is used if C::BaseConceptList exists
    \n+
    125 // due to its higher priority.
    \n+
    126 template<class C, class... T,
    \n+
    127 decltype(typename C::BaseConceptList(), 0) = 0>
    \n+
    128 constexpr bool modelsConcept(PriorityTag<1>)
    \n+
    129 { return matchesRequirement<C, T...>(PriorityTag<42>()) and modelsConceptList<T...>(typename C::BaseConceptList()); }
    \n+
    130
    \n+
    131 // This is the full concept check. It's defined here in the
    \n+
    132 // implementation namespace with 'constexpr bool' return type
    \n+
    133 // because we need a forward declaration in order to use it
    \n+
    134 // internally above.
    \n+
    135 //
    \n+
    136 // The actual interface function can then call this one and
    \n+
    137 // return the result as std::integral_constant<bool,*> which
    \n+
    138 // does not allow for a forward declaration because the return
    \n+
    139 // type is deduced.
    \n+
    140 template<class C, class... T>
    \n+
    141 constexpr bool models()
    \n+
    142 {
    \n+
    143 return modelsConcept<C, T...>(PriorityTag<42>());
    \n+
    144 }
    \n+
    145
    \n+
    146} // namespace Dune::Concept::Impl
    \n+
    147
    \n+
    148#endif // DOXYGEN
    \n+
    149
    \n+
    150} // namespace Dune::Concept
    \n+
    \n+
    151
    \n+
    152
    \n+
    153
    \n+
    183template<class C, class... T>
    \n+
    \n+
    184constexpr auto models()
    \n+
    185{
    \n+
    186 return Std::bool_constant<Concept::Impl::models<C, T...>()>();
    \n+
    187}
    \n+
    \n+
    188
    \n+
    189
    \n+
    190
    \n+
    191namespace Concept {
    \n+
    192
    \n+
    193#ifndef DOXYGEN
    \n+
    194
    \n+
    195namespace Impl {
    \n+
    196
    \n+
    197 // #############################################################################
    \n+
    198 // # All functions following here are implementation details for the
    \n+
    199 // # for the tupleEntriesModel() function below.
    \n+
    200 // #############################################################################
    \n+
    201
    \n+
    202 template<class C, class Tuple>
    \n+
    203 struct TupleEntriesModelHelper
    \n+
    204 {
    \n+
    205 template<class Accumulated, class T>
    \n+
    206 struct AccumulateFunctor
    \n+
    207 {
    \n+
    208 using type = typename std::integral_constant<bool, Accumulated::value and models<C, T>()>;
    \n+
    209 };
    \n+
    210 using Result = typename ReduceTuple<AccumulateFunctor, Tuple, std::true_type>::type;
    \n+
    211 };
    \n+
    212
    \n+
    213} // namespace Dune::Concept::Impl
    \n+
    214
    \n+
    215#endif // DOXYGEN
    \n+
    216
    \n+
    217
    \n+
    218// #############################################################################
    \n+
    219// # The method tupleEntriesModel() does the actual check if the types in a tuple
    \n+
    220// # model a concept using the implementation details above.
    \n+
    221// #############################################################################
    \n+
    222
    \n+
    223template<class C, class Tuple>
    \n+
    \n+
    224constexpr auto tupleEntriesModel()
    \n+
    225 -> typename Impl::TupleEntriesModelHelper<C, Tuple>::Result
    \n+
    226{
    \n+
    227 return {};
    \n+
    228}
    \n+
    \n+
    229
    \n+
    230// #############################################################################
    \n+
    231// # The following require*() functions are just helpers that allow to
    \n+
    232// # propagate a failed check as substitution failure. This is useful
    \n+
    233// # inside of a concept definition.
    \n+
    234// #############################################################################
    \n+
    235
    \n+
    236// Helper function for use in concept definitions.
    \n+
    237// If the passed value b is not true, the concept will to be satisfied.
    \n+
    238template<bool b, typename std::enable_if<b, int>::type = 0>
    \n+
    \n+
    239constexpr bool requireTrue()
    \n+
    240{
    \n+
    241 return true;
    \n+
    242}
    \n+
    \n+
    243
    \n+
    244// Helper function for use in concept definitions.
    \n+
    245template<class C, class... T, typename std::enable_if<models<C, T...>(), int>::type = 0>
    \n+
    \n+
    246constexpr bool requireConcept()
    \n+
    247{
    \n+
    248 return true;
    \n+
    249}
    \n+
    \n+
    250
    \n+
    251// Helper function for use in concept definitions.
    \n+
    252// This allows to avoid using decltype
    \n+
    253template<class C, class... T, typename std::enable_if<models<C, T...>(), int>::type = 0>
    \n+
    \n+
    254constexpr bool requireConcept(T&&... /*t*/)
    \n+
    255{
    \n+
    256 return true;
    \n+
    257}
    \n+
    \n+
    258
    \n+
    259// Helper function for use in concept definitions.
    \n+
    260// This checks if the concept given as first type is modelled by all types in the tuple passed as argument
    \n+
    261template<class C, class Tuple, typename std::enable_if<tupleEntriesModel<C, Tuple>(), int>::type = 0>
    \n+
    \n+\n+
    263{
    \n+
    264 return true;
    \n+
    265}
    \n+
    \n+
    266
    \n+
    267// Helper function for use in concept definitions.
    \n+
    268// If the first passed type is not convertible to the second, the concept will not be satisfied.
    \n+
    269template<class From, class To,
    \n+
    270 typename std::enable_if< std::is_convertible<From, To>::value, int>::type = 0>
    \n+
    \n+
    271constexpr bool requireConvertible()
    \n+
    272{
    \n+
    273 return true;
    \n+
    274}
    \n+
    \n+
    275
    \n+
    276// Helper function for use in concept definitions.
    \n+
    277// If passed argument is not convertible to the first passed type, the concept will not be satisfied.
    \n+
    278template<class To, class From,
    \n+
    279 typename std::enable_if< std::is_convertible<From, To>::value, int>::type = 0>
    \n+
    \n+
    280constexpr bool requireConvertible(const From&)
    \n+
    281{
    \n+
    282 return true;
    \n+
    283}
    \n+
    \n+
    284
    \n+
    285// Helper function for use in concept definitions.
    \n+
    286// This will always evaluate to true. If just allow
    \n+
    287// to turn a type into an expression. The failure happens
    \n+
    288// already during substitution for the type argument.
    \n+
    289template<typename T>
    \n+
    \n+
    290constexpr bool requireType()
    \n+
    291{
    \n+
    292 return true;
    \n+
    293}
    \n+
    \n+
    294
    \n+
    295// Helper function for use in concept definitions.
    \n+
    296// If first passed type is not a base class of second type, the concept will not be satisfied.
    \n+
    297template<class Base, class Derived,
    \n+
    298 typename std::enable_if< std::is_base_of<Base, Derived>::value, int>::type = 0>
    \n+
    \n+
    299constexpr bool requireBaseOf()
    \n+
    300{
    \n+
    301 return true;
    \n+
    302}
    \n+
    \n+
    303
    \n+
    304// Helper function for use in concept definitions.
    \n+
    305// If first passed type is not a base class of first arguments type, the concept will not be satisfied.
    \n+
    306template<class Base, class Derived,
    \n+
    307 typename std::enable_if< std::is_base_of<Base, Derived>::value, int>::type = 0>
    \n+
    \n+
    308constexpr bool requireBaseOf(const Derived&)
    \n+
    309{
    \n+
    310 return true;
    \n+
    311}
    \n+
    \n+
    312
    \n+
    313// Helper function for use in concept definitions.
    \n+
    314// If the passed types are not the same, the concept will not be satisfied.
    \n+
    315template<class A, class B,
    \n+
    316 typename std::enable_if< std::is_same<A, B>::value, int>::type = 0>
    \n+
    \n+
    317constexpr bool requireSameType()
    \n+
    318{
    \n+
    319 return true;
    \n+
    320}
    \n+
    \n+
    321
    \n+
    322
    \n+
    323
    \n+
    324} // namespace Dune::Concept
    \n+
    325
    \n+
    328} // namespace Dune
    \n+
    329
    \n+
    330
    \n+
    331
    \n+
    332
    \n+
    333#endif // DUNE_COMMON_CONCEPT_HH
    \n+\n+
    Contains utility classes which can be used with std::tuple.
    \n+
    Utilities for type computations, constraining overloads, ...
    \n+\n+
    std::tuple< MetaType< T >... > TypeList
    A simple type list.
    Definition typelist.hh:87
    \n+
    constexpr auto models()
    Check if concept is modeled by given types.
    Definition concept.hh:184
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Base class template for function classes.
    Definition function.hh:41
    \n-
    RawDomainType DomainType
    Raw type of output variable with removed reference and constness.
    Definition function.hh:51
    \n-
    void evaluate(const typename Traits::DomainType &x, typename Traits::RangeType &y) const
    Function evaluation.
    \n-
    RawRangeType RangeType
    Raw type of input variable with removed reference and constness.
    Definition function.hh:48
    \n-
    Traits class containing raw types.
    Definition function.hh:55
    \n-
    RawDomainType DomainType
    Definition function.hh:56
    \n-
    RawRangeType RangeType
    Definition function.hh:57
    \n-
    Virtual base class template for function classes.
    Definition function.hh:87
    \n-
    Function< constDomainType &, RangeType & >::Traits Traits
    Definition function.hh:89
    \n-
    virtual ~VirtualFunction()
    Definition function.hh:91
    \n-
    virtual void evaluate(const typename Traits::DomainType &x, typename Traits::RangeType &y) const =0
    Function evaluation.
    \n+
    constexpr bool requireConcept()
    Definition concept.hh:246
    \n+
    constexpr bool requireTrue()
    Definition concept.hh:239
    \n+
    constexpr bool requireSameType()
    Definition concept.hh:317
    \n+
    constexpr auto tupleEntriesModel() -> typename Impl::TupleEntriesModelHelper< C, Tuple >::Result
    Definition concept.hh:224
    \n+
    constexpr bool requireConceptForTupleEntries()
    Definition concept.hh:262
    \n+
    constexpr bool requireBaseOf()
    Definition concept.hh:299
    \n+
    constexpr bool requireConvertible()
    Definition concept.hh:271
    \n+
    constexpr bool requireType()
    Definition concept.hh:290
    \n+
    Base class for refined concepts.
    Definition concept.hh:54
    \n+
    TypeList< BaseConcepts... > BaseConceptList
    Definition concept.hh:55
    \n+
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,174 +1,360 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-function.hh\n+concept.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 (C) 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_FUNCTION_HH_SILENCE_DEPRECATION\n-6#warning This file is deprecated after Dune 2.7! Use C++ function objects and\n-std::function stuff instead!\n-7#else // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION\n-8#undef DUNE_FUNCTION_HH_SILENCE_DEPRECATION\n-9#endif // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION\n-10\n-11#ifndef DUNE_FUNCTION_HH\n-_\b1_\b2#define DUNE_FUNCTION_HH\n-13\n-14#include \n-15\n-16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bp_\br_\be_\bc_\ba_\bt_\be_\bd_\b._\bh_\bh>\n-17#include \"_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-18\n-19namespace _\bD_\bu_\bn_\be {\n-20\n-36 template \n-_\b3_\b7 class\n-38 [[deprecated(\"Dune::Function is deprecated after Dune 2.7. Use C++ \"\n-39 \"function objects instead!\")]]\n-40 _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-41 {\n-42 typedef typename std::remove_cv::\n-type >::type RawDomainType;\n-43 typedef typename std::remove_cv::\n-type >::type RawRangeType;\n-44\n-45 public:\n-46\n-_\b4_\b8 typedef RawRangeType _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n-49\n-_\b5_\b1 typedef RawDomainType _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n-52\n-_\b5_\b4 struct _\bT_\br_\ba_\bi_\bt_\bs\n-55 {\n-_\b5_\b6 typedef RawDomainType _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n-_\b5_\b7 typedef RawRangeType _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n-58 };\n-59\n-_\b6_\b6 void _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be(const typename _\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x, typename _\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:\n-_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& y) const;\n-67 }; // end of Function class\n-68\n-69\n-70\n-71 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bB_\bE_\bG_\bI_\bN\n-82 template \n-_\b8_\b3 class\n-84 [[deprecated(\"Dune::VirtualFunction is deprecated after Dune 2.7. Use C++ \"\n-85 \"function objects and std::function instead!\")]]\n-86 _\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn : public _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be_\b&_\b,_\b _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b&_\b>\n-87 {\n-88 public:\n-_\b8_\b9 typedef typename _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be_\b&_\b,_\b _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b&_\b>_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs _\bT_\br_\ba_\bi_\bt_\bs;\n+5#ifndef DUNE_COMMON_CONCEPT_HH\n+6#define DUNE_COMMON_CONCEPT_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/_\bt_\by_\bp_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\bu_\bp_\bl_\be_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\n+15#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+16\n+23namespace _\bD_\bu_\bn_\be {\n+24\n+_\b3_\b4namespace Concept {\n+35\n+36\n+37\n+52template\n+_\b5_\b3struct _\bR_\be_\bf_\bi_\bn_\be_\bs\n+54{\n+_\b5_\b5 typedef _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt_\bL_\bi_\bs_\bt;\n+56};\n+57\n+58\n+59#ifndef DOXYGEN\n+60\n+61namespace Impl {\n+62\n+63 /\n+/ #############################################################################\n+64 // # All functions following here are implementation details\n+65 // # for the models() function below.\n+66 /\n+/ #############################################################################\n+67\n+68 // Forward declaration\n+69 template\n+70 constexpr bool _\bm_\bo_\bd_\be_\bl_\bs();\n+71\n+72\n+73\n+74 // Here is the implementation of the concept checking.\n+75 // The first two overloads do the magic for checking\n+76 // if the requirements of a concept are satisfied.\n+77 // The rest is just for checking base concepts in case\n+78 // of refinement.\n+79\n+80 // This overload is present if type substitution for\n+81 // C::require(T...) is successful, i.e., if the T...\n+82 // matches the requirement of C. In this case this\n+83 // overload is selected because PriorityTag<1>\n+84 // is a better match for PrioriryTag<42> than\n+85 // PriorityTag<0> in the default overload.\n+86 template().require(std::declval()...), 0) =0>\n+88 constexpr std::true_type matchesRequirement(_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>)\n+89 { return {}; }\n 90\n-_\b9_\b1 virtual _\b~_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn() {}\n-_\b9_\b8 virtual void _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be(const typename _\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x, typename\n-_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& y) const = 0;\n-99 }; // end of VirtualFunction class\n-100 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bE_\bN_\bD\n-101\n-102 namespace Impl {\n-103\n-104 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bB_\bE_\bG_\bI_\bN\n-105 template\n-106 class LambdaVirtualFunction final\n-107 : public _\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-108 {\n-109 public:\n-110 LambdaVirtualFunction(F&& f)\n-111 : f_(std::move(f))\n-112 {}\n+91 // If the above overload is ruled out by SFINAE because\n+92 // the T... does not match the requirements of C, then\n+93 // this default overload drops in.\n+94 template\n+95 constexpr std::false_type matchesRequirement(_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b0_\b>)\n+96 { return {}; }\n+97\n+98\n+99\n+100 // An empty list C of concepts is always matched by T...\n+101 template\n+102 constexpr bool modelsConceptList(TypeList<>)\n+103 { return true; }\n+104\n+105 // A nonempty list C0,..,CN of concepts is modeled\n+106 // by T... if it models the concept C0\n+107 // and all concepts in the list C1,..,CN.\n+108 template\n+109 constexpr bool modelsConceptList(TypeList)\n+110 { return _\bm_\bo_\bd_\be_\bl_\bs() and modelsConceptList(TypeList());\n+}\n+111\n+112\n 113\n-114 LambdaVirtualFunction(const F& f)\n-115 : f_(f)\n-116 {}\n-117\n-118 void evaluate(const Domain& x, Range& y) const override\n-119 {\n-120 y = f_(x);\n-121 }\n-122\n-123 private:\n-124 const F f_;\n-125 };\n-126 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bE_\bN_\bD\n-127\n-128 } /* namespace Impl */\n-129\n-149 template\n-150 [[deprecated(\"Dune::LambdaVirtualFunction is deprecated after Dune 2.7. \"\n-151 \"Use std::function instead!\")]]\n-152 Impl::LambdaVirtualFunction< Domain, Range, std::decay_t >\n-_\b1_\b5_\b3 _\bm_\ba_\bk_\be_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn(F&& f)\n-154 {\n-155 return {std::forward(f)};\n-156 }\n-157\n-160} // end namespace\n-161\n-162#endif\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\n-_\bd_\be_\bp_\br_\be_\bc_\ba_\bt_\be_\bd_\b._\bh_\bh\n-Definition of the DUNE_NO_DEPRECATED_* macros.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-Impl::LambdaVirtualFunction< Domain, Range, std::decay_t< F > >\n-makeVirtualFunction(F &&f)\n-make VirtualFunction out of a function object\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:153\n-_\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bE_\bN_\bD\n-#define DUNE_NO_DEPRECATED_END\n-Ignore deprecation warnings (end)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn deprecated.hh:38\n-_\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bB_\bE_\bG_\bI_\bN\n-#define DUNE_NO_DEPRECATED_BEGIN\n-Ignore deprecation warnings (start)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn deprecated.hh:32\n+114 // If C is an unrefined concept, then T... models C\n+115 // if it matches the requirement of C.\n+116 template\n+117 constexpr bool modelsConcept(PriorityTag<0>)\n+118 { return matchesRequirement(PriorityTag<42>()); }\n+119\n+120 // If C is a refined concept, then T... models C\n+121 // if it matches the requirement of C and of\n+122 // all base concepts.\n+123 //\n+124 // This overload is used if C::BaseConceptList exists\n+125 // due to its higher priority.\n+126 template\n+128 constexpr bool modelsConcept(PriorityTag<1>)\n+129 { return matchesRequirement(PriorityTag<42>()) and\n+modelsConceptList(typename C::BaseConceptList()); }\n+130\n+131 // This is the full concept check. It's defined here in the\n+132 // implementation namespace with 'constexpr bool' return type\n+133 // because we need a forward declaration in order to use it\n+134 // internally above.\n+135 //\n+136 // The actual interface function can then call this one and\n+137 // return the result as std::integral_constant which\n+138 // does not allow for a forward declaration because the return\n+139 // type is deduced.\n+140 template\n+141 constexpr bool _\bm_\bo_\bd_\be_\bl_\bs()\n+142 {\n+143 return modelsConcept(PriorityTag<42>());\n+144 }\n+145\n+146} // namespace Dune::Concept::Impl\n+147\n+148#endif // DOXYGEN\n+149\n+150} // namespace Dune::Concept\n+151\n+152\n+153\n+183template\n+_\b1_\b8_\b4constexpr auto _\bm_\bo_\bd_\be_\bl_\bs()\n+185{\n+186 return Std::bool_constant()>();\n+187}\n+188\n+189\n+190\n+191namespace Concept {\n+192\n+193#ifndef DOXYGEN\n+194\n+195namespace Impl {\n+196\n+197 /\n+/ #############################################################################\n+198 // # All functions following here are implementation details for the\n+199 // # for the tupleEntriesModel() function below.\n+200 /\n+/ #############################################################################\n+201\n+202 template\n+203 struct TupleEntriesModelHelper\n+204 {\n+205 template\n+206 struct AccumulateFunctor\n+207 {\n+208 using type = typename std::integral_constant()>;\n+209 };\n+210 using Result = typename ReduceTuple::type;\n+211 };\n+212\n+213} // namespace Dune::Concept::Impl\n+214\n+215#endif // DOXYGEN\n+216\n+217\n+218/\n+/ #############################################################################\n+219// # The method tupleEntriesModel() does the actual check if the types in a\n+tuple\n+220// # model a concept using the implementation details above.\n+221/\n+/ #############################################################################\n+222\n+223template\n+_\b2_\b2_\b4constexpr auto _\bt_\bu_\bp_\bl_\be_\bE_\bn_\bt_\br_\bi_\be_\bs_\bM_\bo_\bd_\be_\bl()\n+225 -> typename Impl::TupleEntriesModelHelper::Result\n+226{\n+227 return {};\n+228}\n+229\n+230/\n+/ #############################################################################\n+231// # The following require*() functions are just helpers that allow to\n+232// # propagate a failed check as substitution failure. This is useful\n+233// # inside of a concept definition.\n+234/\n+/ #############################################################################\n+235\n+236// Helper function for use in concept definitions.\n+237// If the passed value b is not true, the concept will to be satisfied.\n+238template::type = 0>\n+_\b2_\b3_\b9constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bT_\br_\bu_\be()\n+240{\n+241 return true;\n+242}\n+243\n+244// Helper function for use in concept definitions.\n+245template(),\n+int>::type = 0>\n+_\b2_\b4_\b6constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt()\n+247{\n+248 return true;\n+249}\n+250\n+251// Helper function for use in concept definitions.\n+252// This allows to avoid using decltype\n+253template(),\n+int>::type = 0>\n+_\b2_\b5_\b4constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt(T&&... /*t*/)\n+255{\n+256 return true;\n+257}\n+258\n+259// Helper function for use in concept definitions.\n+260// This checks if the concept given as first type is modelled by all types\n+in the tuple passed as argument\n+261template(), int>::type = 0>\n+_\b2_\b6_\b2constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt_\bF_\bo_\br_\bT_\bu_\bp_\bl_\be_\bE_\bn_\bt_\br_\bi_\be_\bs()\n+263{\n+264 return true;\n+265}\n+266\n+267// Helper function for use in concept definitions.\n+268// If the first passed type is not convertible to the second, the concept\n+will not be satisfied.\n+269template::value, int>::type =\n+0>\n+_\b2_\b7_\b1constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be()\n+272{\n+273 return true;\n+274}\n+275\n+276// Helper function for use in concept definitions.\n+277// If passed argument is not convertible to the first passed type, the\n+concept will not be satisfied.\n+278template::value, int>::type =\n+0>\n+_\b2_\b8_\b0constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be(const From&)\n+281{\n+282 return true;\n+283}\n+284\n+285// Helper function for use in concept definitions.\n+286// This will always evaluate to true. If just allow\n+287// to turn a type into an expression. The failure happens\n+288// already during substitution for the type argument.\n+289template\n+_\b2_\b9_\b0constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bT_\by_\bp_\be()\n+291{\n+292 return true;\n+293}\n+294\n+295// Helper function for use in concept definitions.\n+296// If first passed type is not a base class of second type, the concept will\n+not be satisfied.\n+297template::value, int>::type\n+= 0>\n+_\b2_\b9_\b9constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bB_\ba_\bs_\be_\bO_\bf()\n+300{\n+301 return true;\n+302}\n+303\n+304// Helper function for use in concept definitions.\n+305// If first passed type is not a base class of first arguments type, the\n+concept will not be satisfied.\n+306template::value, int>::type\n+= 0>\n+_\b3_\b0_\b8constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bB_\ba_\bs_\be_\bO_\bf(const Derived&)\n+309{\n+310 return true;\n+311}\n+312\n+313// Helper function for use in concept definitions.\n+314// If the passed types are not the same, the concept will not be satisfied.\n+315template::value, int>::type = 0>\n+_\b3_\b1_\b7constexpr bool _\br_\be_\bq_\bu_\bi_\br_\be_\bS_\ba_\bm_\be_\bT_\by_\bp_\be()\n+318{\n+319 return true;\n+320}\n+321\n+322\n+323\n+324} // namespace Dune::Concept\n+325\n+328} // namespace Dune\n+329\n+330\n+331\n+332\n+333#endif // DUNE_COMMON_CONCEPT_HH\n+_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+_\bt_\bu_\bp_\bl_\be_\bu_\bt_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh\n+Contains utility classes which can be used with std::tuple.\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+_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt\n+std::tuple< MetaType< T >... > TypeList\n+A simple type list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bo_\bd_\be_\bl_\bs\n+constexpr auto models()\n+Check if concept is modeled by given types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:184\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_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-Base class template for function classes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n-RawDomainType DomainType\n-Raw type of output variable with removed reference and constness.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n-void evaluate(const typename Traits::DomainType &x, typename Traits::RangeType\n-&y) const\n-Function evaluation.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n-RawRangeType RangeType\n-Raw type of input variable with removed reference and constness.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs\n-Traits class containing raw types.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n-RawDomainType DomainType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n-RawRangeType RangeType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-Virtual base class template for function classes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs\n-Function< constDomainType &, RangeType & >::Traits Traits\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\b~_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-virtual ~VirtualFunction()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n-virtual void evaluate(const typename Traits::DomainType &x, typename Traits::\n-RangeType &y) const =0\n-Function evaluation.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt\n+constexpr bool requireConcept()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bT_\br_\bu_\be\n+constexpr bool requireTrue()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bS_\ba_\bm_\be_\bT_\by_\bp_\be\n+constexpr bool requireSameType()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:317\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bt_\bu_\bp_\bl_\be_\bE_\bn_\bt_\br_\bi_\be_\bs_\bM_\bo_\bd_\be_\bl\n+constexpr auto tupleEntriesModel() -> typename Impl::TupleEntriesModelHelper<\n+C, Tuple >::Result\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt_\bF_\bo_\br_\bT_\bu_\bp_\bl_\be_\bE_\bn_\bt_\br_\bi_\be_\bs\n+constexpr bool requireConceptForTupleEntries()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bB_\ba_\bs_\be_\bO_\bf\n+constexpr bool requireBaseOf()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bC_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be\n+constexpr bool requireConvertible()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\br_\be_\bq_\bu_\bi_\br_\be_\bT_\by_\bp_\be\n+constexpr bool requireType()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:290\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bR_\be_\bf_\bi_\bn_\be_\bs\n+Base class for refined concepts.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bn_\bc_\be_\bp_\bt_\b:_\b:_\bR_\be_\bf_\bi_\bn_\be_\bs_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bc_\be_\bp_\bt_\bL_\bi_\bs_\bt\n+TypeList< BaseConcepts... > BaseConceptList\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn concept.hh:55\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 ===============================================================================\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: mpifuture.hh File Reference\n+dune-common: defaults.hh File Reference\n \n \n \n \n \n \n \n@@ -65,51 +65,127 @@\n \n \n \n \n \n \n \n
    \n \n-
    mpifuture.hh File Reference
    \n+ \n
    \n
    \n-
    #include <optional>
    \n-#include <dune/common/parallel/communication.hh>
    \n-#include <dune/common/parallel/future.hh>
    \n-#include <dune/common/parallel/mpidata.hh>
    \n+\n+

    Default implementations for SIMD Implementations. \n+More...

    \n+
    #include <algorithm>
    \n+#include <cstddef>
    \n+#include <type_traits>
    \n+#include <dune/common/rangeutilities.hh>
    \n+#include <dune/common/simd/base.hh>
    \n+#include <dune/common/simd/interface.hh>
    \n+#include <dune/common/typelist.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

    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 \n+\n+\n+\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::impl
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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

    Overloadable and default functions

    This group contains functions that you, as an abstraction developer, must implement. All functions that are deleted must be provided, functions that have a default implementation may be left unimplemented if the default behaviour is satisfactory.

    \n+
    template<class V >
    decltype(auto) Dune::Simd::Overloads::lane (ADLTag< 0 >, std::size_t l, V v)=delete
     implements Simd::lane()
     
    template<class V >
    constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, const V &u)
     implements Simd::implCast<V>(V)
     
    template<class V , class U >
    constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, const U &u)
     implements Simd::implCast<V>(U)
     
    template<class V , class S >
    auto Dune::Simd::Overloads::broadcast (ADLTag< 0 >, MetaType< V >, S s)
     implements Simd::broadcast<V>()
     
    template<class V >
    Dune::Simd::Overloads::cond (ADLTag< 0 >, const Mask< V > &mask, const V &ifTrue, const V &ifFalse)=delete
     implements Simd::cond()
     
    template<class V >
    auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v1, const V &v2)
     implements binary Simd::max()
     
    template<class V >
    auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v1, const V &v2)
     implements binary Simd::min()
     
    template<class Mask >
    bool Dune::Simd::Overloads::anyTrue (ADLTag< 0 >, const Mask &mask)=delete
     implements Simd::anyTrue()
     
    template<class Mask >
    bool Dune::Simd::Overloads::allTrue (ADLTag< 0 >, const Mask &mask)
     implements Simd::allTrue()
     
    template<class Mask >
    bool Dune::Simd::Overloads::anyFalse (ADLTag< 0 >, const Mask &mask)
     implements Simd::anyFalse()
     
    template<class Mask >
    bool Dune::Simd::Overloads::allFalse (ADLTag< 0 >, const Mask &mask)
     implements Simd::allFalse()
     
    template<class V >
    auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v)
     implements Simd::maxValue()
     
    template<class V >
    auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v)
     implements Simd::minValue()
     
    template<class V >
    Mask< V > Dune::Simd::Overloads::mask (ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
     implements Simd::mask()
     
    template<class V >
    auto Dune::Simd::Overloads::mask (ADLTag< 0, !std::is_same< V, Mask< V > >::value >, const V &v)
     implements Simd::mask()
     
    template<class V1 , class V2 >
    auto Dune::Simd::Overloads::maskOr (ADLTag< 0 >, const V1 &v1, const V2 &v2)
     implements Simd::maskOr()
     
    template<class V1 , class V2 >
    auto Dune::Simd::Overloads::maskAnd (ADLTag< 0 >, const V1 &v1, const V2 &v2)
     implements Simd::maskAnd()
     
    \n-
    \n+

    Detailed Description

    \n+

    Default implementations for SIMD Implementations.

    \n+

    This file provides default overloads for SIMD implementation functions, and deleted placeholders where there are no default implementations.

    \n+

    This file should never be included by users of the SIMD abstraction. Include <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,35 +1,126 @@\n dune-common\u00a02.9.0\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 <_\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+ * _\bs_\bi_\bm_\bd\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+defaults.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bA_\bb_\bs_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+Default implementations for SIMD Implementations. _\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/_\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_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\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/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\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:_\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+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd\n+\u00a0 Namespace for vectorization interface functions used by library\n+ developers.\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n+\u00a0 Namespace for the overloads and specializations that make up a SIMD\n+ implementation.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+Overloadable and default functions\n+This group contains functions that you, as an abstraction developer, must\n+implement. All functions that are deleted must be provided, functions that have\n+a default implementation may be left unimplemented if the default behaviour is\n+satisfactory.\n+template\n+decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, std::size_t l, V\n+ v)=delete\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\b(_\b)\n+\u00a0\n+template\n+ constexpr V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be< V >,\n+ const V &u)\n+\u00a0 implements Simd::implCast(V)\n+\u00a0\n+template\n+ constexpr V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be< V >,\n+ const U &u)\n+\u00a0 implements Simd::implCast(U)\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be< V >, S\n+ s)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt_\b<_\bV_\b>_\b(_\b)\n+\u00a0\n+template\n+ V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk< V >\n+ &_\bm_\ba_\bs_\bk, const V &ifTrue, const V &ifFalse)=delete\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd_\b(_\b)\n+\u00a0\n+template\n+ auto\u00a0 _\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_\bx (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v1, const V\n+ &v2)\n+\u00a0 implements binary _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bx_\b(_\b)\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bm_\bi_\bn (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v1, const V\n+ &v2)\n+\u00a0 implements binary _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\bi_\bn_\b(_\b)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk\n+ &_\bm_\ba_\bs_\bk)=delete\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be_\b(_\b)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be_\b(_\b)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be_\b(_\b)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be_\b(_\b)\n+\u00a0\n+template\n+ auto\u00a0 _\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_\bx (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v)\n+\u00a0 implements Simd::maxValue()\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bm_\bi_\bn (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v)\n+\u00a0 implements Simd::minValue()\n+\u00a0\n+template\n+ _\bM_\ba_\bs_\bk< V >\u00a0 _\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 (_\bA_\bD_\bL_\bT_\ba_\bg< 0, std::is_same< V, _\bM_\ba_\bs_\bk<\n+ V > >::value >, const V &v)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\b(_\b)\n+\u00a0\n+template\n+ auto\u00a0 _\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 (_\bA_\bD_\bL_\bT_\ba_\bg< 0, !std::is_same< V, _\bM_\ba_\bs_\bk<\n+ V > >::value >, const V &v)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\b(_\b)\n+\u00a0\n+template\n+ auto\u00a0 _\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_\bO_\br (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V1 &v1, const\n+ V2 &v2)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\bO_\br_\b(_\b)\n+\u00a0\n+template\n+ auto\u00a0 _\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_\bA_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V1 &v1,\n+ const V2 &v2)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\bA_\bn_\bd_\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+Default implementations for SIMD Implementations.\n+This file provides default overloads for SIMD implementation functions, and\n+deleted placeholders where there are no default implementations.\n+This file should never be included by users of the SIMD abstraction. Include\n+<_\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/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: mpifuture.hh Source File\n+dune-common: defaults.hh Source File\n \n \n \n \n \n \n \n@@ -70,290 +70,215 @@\n \n \n \n \n \n \n \n
    \n-
    mpifuture.hh
    \n+
    defaults.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 (C) 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-
    7
    \n-
    8#include <optional>
    \n-
    9
    \n-\n-\n-\n-
    13
    \n-
    14#if HAVE_MPI
    \n-
    15namespace Dune{
    \n-
    16
    \n-
    \n-
    17 namespace impl{
    \n-
    18 template<class T>
    \n-
    \n-
    19 struct Buffer{
    \n-
    \n-
    20 Buffer(bool valid){
    \n-
    21 if(valid)
    \n-
    22 value = std::make_unique<T>();
    \n-
    23 }
    \n-
    \n-
    24 template<class V>
    \n-
    \n-
    25 Buffer(V&& t)
    \n-
    26 : value(std::make_unique<T>(std::forward<V>(t)))
    \n-
    27 {}
    \n-
    \n-
    28 std::unique_ptr<T> value;
    \n-
    \n-
    29 T get(){
    \n-
    30 T tmp = std::move(*value);
    \n-
    31 value.reset();
    \n-
    32 return tmp;
    \n-
    33 }
    \n-
    \n-
    \n-
    34 operator bool () const {
    \n-
    35 return (bool)value;
    \n-
    36 }
    \n-
    \n-
    \n-
    37 T& operator *() const{
    \n-
    38 return *value;
    \n-
    39 }
    \n-
    \n-
    40 };
    \n-
    \n-
    41
    \n-
    42 template<class T>
    \n-
    \n-
    43 struct Buffer<T&>{
    \n-
    \n-
    44 Buffer(bool valid = false)
    \n-
    45 {
    \n-
    46 if(valid)
    \n-
    47 value = T();
    \n-
    48 }
    \n-
    \n-
    49 template<class V>
    \n-
    \n-
    50 Buffer(V&& t)
    \n-
    51 : value(std::forward<V>(t))
    \n-
    52 {}
    \n-
    \n-
    53 std::optional<std::reference_wrapper<T>> value;
    \n-
    \n-
    54 T& get(){
    \n-
    55 T& tmp = *value;
    \n-
    56 value.reset();
    \n-
    57 return tmp;
    \n-
    58 }
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_DEFAULTS_HH
    \n+
    4#define DUNE_COMMON_SIMD_DEFAULTS_HH
    \n+
    5
    \n+
    17#include <algorithm>
    \n+
    18#include <cstddef>
    \n+
    19#include <type_traits>
    \n+
    20
    \n+\n+\n+\n+\n+\n+
    26
    \n+
    27namespace Dune {
    \n+
    28 namespace Simd {
    \n+
    29 namespace Overloads {
    \n+
    30
    \n+
    47 template<class V>
    \n+
    48 decltype(auto) lane(ADLTag<0>, std::size_t l, V v) = delete;
    \n+
    49
    \n+
    51 template<class V>
    \n+
    \n+
    52 constexpr V implCast(ADLTag<0>, MetaType<V>, const V &u)
    \n+
    53 {
    \n+
    54 return u;
    \n+
    55 }
    \n
    \n+
    56
    \n+
    58 template<class V, class U>
    \n
    \n-
    59 operator bool () const{
    \n-
    60 return (bool)value;
    \n-
    61 }
    \n-
    \n-
    \n-
    62 T& operator *() const{
    \n-
    63 return *value;
    \n-
    64 }
    \n-
    \n-
    65 };
    \n+
    59 constexpr V implCast(ADLTag<0>, MetaType<V>, const U &u)
    \n+
    60 {
    \n+
    61 V result(Simd::Scalar<V>(0));
    \n+
    62 for(auto l : range(Simd::lanes(u)))
    \n+
    63 Simd::lane(l, result) = Simd::lane(l, u);
    \n+
    64 return result;
    \n+
    65 }
    \n
    \n
    66
    \n-
    67 template<>
    \n-
    \n-
    68 struct Buffer<void>{
    \n-
    69 bool valid_;
    \n-
    \n-
    70 Buffer(bool valid = false)
    \n-
    71 : valid_(valid)
    \n-
    72 {}
    \n-
    \n-
    \n-
    73 operator bool () const{
    \n-
    74 return valid_;
    \n-
    75 }
    \n-
    \n-
    76 void get(){}
    \n-
    77 };
    \n-
    \n-
    78 }
    \n-
    \n-
    79
    \n-
    84 template<class R, class S = void>
    \n-
    \n-
    85 class MPIFuture{
    \n-
    86 mutable MPI_Request req_;
    \n-
    87 mutable MPI_Status status_;
    \n-
    88 impl::Buffer<R> data_;
    \n-
    89 impl::Buffer<S> send_data_;
    \n-
    90 friend class Communication<MPI_Comm>;
    \n-
    91 public:
    \n-
    \n-
    92 MPIFuture(bool valid = false)
    \n-
    93 : req_(MPI_REQUEST_NULL)
    \n-
    94 , data_(valid)
    \n-
    95 {}
    \n-
    \n-
    96
    \n-
    97 // Hide this constructor if R or S is void
    \n-
    98 template<class V = R, class U = S>
    \n-
    \n-
    99 MPIFuture(V&& recv_data, U&& send_data, typename std::enable_if_t<!std::is_void<V>::value && !std::is_void<U>::value>* = 0) :
    \n-
    100 req_(MPI_REQUEST_NULL)
    \n-
    101 , data_(std::forward<R>(recv_data))
    \n-
    102 , send_data_(std::forward<S>(send_data))
    \n-
    103 {}
    \n-
    \n-
    104
    \n-
    105 // hide this constructor if R is void
    \n-
    106 template<class V = R>
    \n-
    \n-
    107 MPIFuture(V&& recv_data, typename std::enable_if_t<!std::is_void<V>::value>* = 0)
    \n-
    108 : req_(MPI_REQUEST_NULL)
    \n-
    109 , data_(std::forward<V>(recv_data))
    \n-
    110 {}
    \n-
    \n-
    111
    \n-
    \n-\n-
    113 if(req_ != MPI_REQUEST_NULL){
    \n-
    114 try{ // might fail when it is a collective communication
    \n-
    115 MPI_Cancel(&req_);
    \n-
    116 MPI_Request_free(&req_);
    \n-
    117 }catch(...){
    \n-
    118 }
    \n-
    119 }
    \n-
    120 }
    \n-
    \n-
    121
    \n-
    \n-\n-
    123 : req_(MPI_REQUEST_NULL)
    \n-
    124 , data_(std::move(f.data_))
    \n-
    125 , send_data_(std::move(f.send_data_))
    \n-
    126 {
    \n-
    127 std::swap(req_, f.req_);
    \n-
    128 std::swap(status_, f.status_);
    \n-
    129 }
    \n+
    68 template<class V, class S>
    \n+
    \n+\n+
    70 {
    \n+
    71 return V(Simd::Scalar<V>(s));
    \n+
    72 }
    \n+
    \n+
    73
    \n+
    75 template<class V>
    \n+\n+
    77 const V &ifTrue, const V &ifFalse) = delete;
    \n+
    78
    \n+
    80 template<class V>
    \n+
    \n+
    81 auto max(ADLTag<0>, const V &v1, const V &v2)
    \n+
    82 {
    \n+
    83 using std::max;
    \n+
    84 return max(v1, v2);
    \n+
    85 }
    \n+
    \n+
    86
    \n+
    88 template<class V>
    \n+
    \n+
    89 auto min(ADLTag<0>, const V &v1, const V &v2)
    \n+
    90 {
    \n+
    91 using std::min;
    \n+
    92 return min(v1, v2);
    \n+
    93 }
    \n+
    \n+
    94
    \n+
    96 template<class Mask>
    \n+
    97 bool anyTrue(ADLTag<0>, const Mask &mask) = delete;
    \n+
    98
    \n+
    100
    \n+
    103 template<class Mask>
    \n+
    \n+\n+
    105 {
    \n+
    106 return !Dune::Simd::anyTrue(!mask);
    \n+
    107 }
    \n+
    \n+
    108
    \n+
    110
    \n+
    113 template<class Mask>
    \n+
    \n+\n+
    115 {
    \n+
    116 return Dune::Simd::anyTrue(!mask);
    \n+
    117 }
    \n+
    \n+
    118
    \n+
    120
    \n+
    123 template<class Mask>
    \n+
    \n+\n+
    125 {
    \n+
    126 return !Dune::Simd::anyTrue(mask);
    \n+
    127 }
    \n
    \n-
    130
    \n+
    128
    \n+
    130 template<class V>
    \n
    \n-\n-
    132 std::swap(req_, f.req_);
    \n-
    133 std::swap(status_, f.status_);
    \n-
    134 std::swap(data_, f.data_);
    \n-
    135 std::swap(send_data_, f.send_data_);
    \n-
    136 return *this;
    \n-
    137 }
    \n-
    \n-
    138
    \n-
    \n-
    139 bool valid() const{
    \n-
    140 return (bool)data_;
    \n-
    141 }
    \n-
    \n-
    142
    \n-
    \n-
    143 void wait(){
    \n-
    144 if(!valid())
    \n-
    145 DUNE_THROW(InvalidFutureException, "The MPIFuture is not valid!");
    \n-
    146 MPI_Wait(&req_, &status_);
    \n-
    147 }
    \n-
    \n-
    148
    \n-
    \n-
    149 bool ready() const{
    \n-
    150 int flag = -1;
    \n-
    151 MPI_Test(&req_, &flag, &status_);
    \n-
    152 return flag;
    \n-
    153 }
    \n-
    \n-
    154
    \n-
    \n-
    155 R get() {
    \n-
    156 wait();
    \n-
    157 return data_.get();
    \n-
    158 }
    \n-
    \n-
    159
    \n-
    \n-\n-
    161 wait();
    \n-
    162 return send_data_.get();
    \n-
    163 }
    \n-
    \n-
    164
    \n-
    \n-\n-
    166 return getMPIData(*data_);
    \n-
    167 }
    \n-
    \n-
    168
    \n-
    \n-\n-
    170 return getMPIData(*send_data_);
    \n-
    171 }
    \n-
    \n-
    172 };
    \n-
    \n-
    173
    \n-
    174}
    \n-
    175#endif
    \n-
    176#endif
    \n-
    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
    \n-\n-
    Implements an utility class that provides collective communication methods for sequential programs.
    \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+
    131 auto max(ADLTag<0>, const V &v)
    \n+
    132 {
    \n+
    133 Scalar<V> m = Simd::lane(0, v);
    \n+
    134 for(std::size_t l = 1; l < Simd::lanes(v); ++l)
    \n+
    135 if(m < Simd::lane(l, v))
    \n+
    136 m = Simd::lane(l, v);
    \n+
    137 return m;
    \n+
    138 }
    \n+
    \n+
    139
    \n+
    141 template<class V>
    \n+
    \n+
    142 auto min(ADLTag<0>, const V &v)
    \n+
    143 {
    \n+
    144 Scalar<V> m = Simd::lane(0, v);
    \n+
    145 for(std::size_t l = 1; l < Simd::lanes(v); ++l)
    \n+
    146 if(Simd::lane(l, v) < m)
    \n+
    147 m = Simd::lane(l, v);
    \n+
    148 return m;
    \n+
    149 }
    \n+
    \n+
    150
    \n+
    152 template<class V>
    \n+
    \n+
    153 Mask<V> mask(ADLTag<0, std::is_same<V, Mask<V> >::value>,
    \n+
    154 const V &v)
    \n+
    155 {
    \n+
    156 return v;
    \n+
    157 }
    \n+
    \n+
    158
    \n+
    160 template<class V>
    \n+
    \n+
    161 auto mask(ADLTag<0, !std::is_same<V, Mask<V> >::value>,
    \n+
    162 const V &v)
    \n+
    163 {
    \n+
    164 using Copy = AutonomousValue<V>; // just in case we are handed a proxy
    \n+
    165 return v != Copy(Scalar<Copy>(0));
    \n+
    166 }
    \n+
    \n+
    167
    \n+
    169 template<class V1, class V2>
    \n+
    \n+
    170 auto maskOr(ADLTag<0>, const V1 &v1, const V2 &v2)
    \n+
    171 {
    \n+
    172 return Simd::mask(v1) || Simd::mask(v2);
    \n+
    173 }
    \n+
    \n+
    174
    \n+
    176 template<class V1, class V2>
    \n+
    \n+
    177 auto maskAnd(ADLTag<0>, const V1 &v1, const V2 &v2)
    \n+
    178 {
    \n+
    179 return Simd::mask(v1) && Simd::mask(v2);
    \n+
    180 }
    \n+
    \n+
    181
    \n+
    184 } // namespace Overloads
    \n+
    185 } // namespace Simd
    \n+
    186} // namespace Dune
    \n+
    187
    \n+
    188#endif // DUNE_COMMON_SIMD_DEFAULTS_HH
    \n+
    Basic definitions for SIMD Implementations.
    \n+
    Traits for type conversions and type information.
    \n+
    Utilities for reduction like operations on ranges.
    \n+\n+
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n+
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:558
    \n+
    bool anyTrue(const Mask &mask)
    Whether any entry is true
    Definition simd/interface.hh:429
    \n+
    auto mask(const V &v)
    Convert to mask, analogue of bool(s) for scalars.
    Definition simd/interface.hh:489
    \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+
    Rebind< bool, V > Mask
    Mask type type of some SIMD type.
    Definition simd/interface.hh:289
    \n+
    typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
    Element type of some SIMD type.
    Definition simd/interface.hh:235
    \n+
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n+
    constexpr V implCast(ADLTag< 0 >, MetaType< V >, const V &u)
    implements Simd::implCast<V>(V)
    Definition defaults.hh:52
    \n+
    bool allFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::allFalse()
    Definition defaults.hh:124
    \n+
    bool allTrue(ADLTag< 0 >, const Mask &mask)
    implements Simd::allTrue()
    Definition defaults.hh:104
    \n+
    auto maskAnd(ADLTag< 0 >, const V1 &v1, const V2 &v2)
    implements Simd::maskAnd()
    Definition defaults.hh:177
    \n+
    auto maskOr(ADLTag< 0 >, const V1 &v1, const V2 &v2)
    implements Simd::maskOr()
    Definition defaults.hh:170
    \n+
    bool anyFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::anyFalse()
    Definition defaults.hh:114
    \n+
    auto min(ADLTag< 0 >, const V &v1, const V &v2)
    implements binary Simd::min()
    Definition defaults.hh:89
    \n+
    auto broadcast(ADLTag< 0 >, MetaType< V >, S s)
    implements Simd::broadcast<V>()
    Definition defaults.hh:69
    \n+
    auto max(ADLTag< 0 >, const V &v1, const V &v2)
    implements binary Simd::max()
    Definition defaults.hh:81
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    auto getMPIData(T &t)
    Definition mpidata.hh:43
    \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:18
    \n-
    Definition mpifuture.hh:19
    \n-
    std::unique_ptr< T > value
    Definition mpifuture.hh:28
    \n-
    T & operator*() const
    Definition mpifuture.hh:37
    \n-
    Buffer(V &&t)
    Definition mpifuture.hh:25
    \n-
    T get()
    Definition mpifuture.hh:29
    \n-
    Buffer(bool valid)
    Definition mpifuture.hh:20
    \n-
    std::optional< std::reference_wrapper< T > > value
    Definition mpifuture.hh:53
    \n-
    Buffer(bool valid=false)
    Definition mpifuture.hh:44
    \n-
    T & get()
    Definition mpifuture.hh:54
    \n-
    Buffer(V &&t)
    Definition mpifuture.hh:50
    \n-
    bool valid_
    Definition mpifuture.hh:69
    \n-
    void get()
    Definition mpifuture.hh:76
    \n-
    Buffer(bool valid=false)
    Definition mpifuture.hh:70
    \n-
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:85
    \n-
    MPIFuture(V &&recv_data, typename std::enable_if_t<!std::is_void< V >::value > *=0)
    Definition mpifuture.hh:107
    \n-
    bool ready() const
    Definition mpifuture.hh:149
    \n-
    bool valid() const
    Definition mpifuture.hh:139
    \n-
    ~MPIFuture()
    Definition mpifuture.hh:112
    \n-
    MPIFuture(bool valid=false)
    Definition mpifuture.hh:92
    \n-
    MPIFuture & operator=(MPIFuture &&f)
    Definition mpifuture.hh:131
    \n-
    auto get_send_mpidata()
    Definition mpifuture.hh:169
    \n-
    void wait()
    Definition mpifuture.hh:143
    \n-
    auto get_mpidata()
    Definition mpifuture.hh:165
    \n-
    R get()
    Definition mpifuture.hh:155
    \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:99
    \n-
    S get_send_data()
    Definition mpifuture.hh:160
    \n-
    MPIFuture(MPIFuture &&f)
    Definition mpifuture.hh:122
    \n+
    bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
    Definition debugalign.hh:543
    \n+
    const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
    Definition debugalign.hh:535
    \n+
    T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
    Definition debugalign.hh:520
    \n+
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n+
    A type that refers to another type.
    Definition typelist.hh:33
    \n+
    User interface of the SIMD abstraction.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,297 +1,250 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\bd\n+defaults.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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-7\n-8#include \n-9\n-10#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-11#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-12#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-13\n-14#if HAVE_MPI\n-15namespace _\bD_\bu_\bn_\be{\n-16\n-_\b1_\b7 namespace impl{\n-18 template\n-_\b1_\b9 struct _\bB_\bu_\bf_\bf_\be_\br{\n-_\b2_\b0 _\bB_\bu_\bf_\bf_\be_\br(bool valid){\n-21 if(valid)\n-22 _\bv_\ba_\bl_\bu_\be = std::make_unique();\n-23 }\n-24 template\n-_\b2_\b5 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n-26 : _\bv_\ba_\bl_\bu_\be(_\bs_\bt_\bd::make_unique(_\bs_\bt_\bd::forward(t)))\n-27 {}\n-_\b2_\b8 std::unique_ptr _\bv_\ba_\bl_\bu_\be;\n-_\b2_\b9 T _\bg_\be_\bt(){\n-30 T tmp = std::move(*_\bv_\ba_\bl_\bu_\be);\n-31 _\bv_\ba_\bl_\bu_\be.reset();\n-32 return tmp;\n-33 }\n-_\b3_\b4 operator bool () const {\n-35 return (bool)_\bv_\ba_\bl_\bu_\be;\n-36 }\n-_\b3_\b7 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n-38 return *_\bv_\ba_\bl_\bu_\be;\n-39 }\n-40 };\n-41\n-42 template\n-_\b4_\b3 struct _\bB_\bu_\bf_\bf_\be_\br{\n-_\b4_\b4 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n-45 {\n-46 if(valid)\n-47 value = T();\n-48 }\n-49 template\n-_\b5_\b0 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n-51 : value(_\bs_\bt_\bd::forward(t))\n-52 {}\n-_\b5_\b3 std::optional> _\bv_\ba_\bl_\bu_\be;\n-_\b5_\b4 T& _\bg_\be_\bt(){\n-55 T& tmp = *value;\n-56 value.reset();\n-57 return tmp;\n-58 }\n-_\b5_\b9 operator bool () const{\n-60 return (bool)value;\n-61 }\n-_\b6_\b2 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n-63 return *value;\n-64 }\n-65 };\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3#ifndef DUNE_COMMON_SIMD_DEFAULTS_HH\n+4#define DUNE_COMMON_SIMD_DEFAULTS_HH\n+5\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/_\br_\ba_\bn_\bg_\be_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n+23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+25#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+26\n+27namespace _\bD_\bu_\bn_\be {\n+28 namespace Simd {\n+29 namespace Overloads {\n+30\n+47 template\n+_\b4_\b8 decltype(auto) _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, std::size_t l, V v) = delete;\n+49\n+51 template\n+_\b5_\b2 constexpr V _\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b<_\bV_\b>, const V &u)\n+53 {\n+54 return u;\n+55 }\n+56\n+58 template\n+_\b5_\b9 constexpr V _\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b<_\bV_\b>, const U &u)\n+60 {\n+61 V result(_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b>(0));\n+62 for(auto l : _\br_\ba_\bn_\bg_\be(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(u)))\n+63 _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, result) = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, u);\n+64 return result;\n+65 }\n 66\n-67 template<>\n-_\b6_\b8 struct _\bB_\bu_\bf_\bf_\be_\br{\n-_\b6_\b9 bool _\bv_\ba_\bl_\bi_\bd_\b_;\n-_\b7_\b0 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n-71 : valid_(valid)\n-72 {}\n-_\b7_\b3 operator bool () const{\n-74 return valid_;\n-75 }\n-_\b7_\b6 void _\bg_\be_\bt(){}\n-77 };\n-78 }\n-79\n-84 template\n-_\b8_\b5 class _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be{\n-86 mutable MPI_Request req_;\n-87 mutable MPI_Status status_;\n-88 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bR_\b> data_;\n-_\b8_\b9 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bS_\b> send_data_;\n-90 friend class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n-91 public:\n-_\b9_\b2 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false)\n-93 : req_(MPI_REQUEST_NULL)\n-94 , data_(_\bv_\ba_\bl_\bi_\bd)\n-95 {}\n-96\n-97 // Hide this constructor if R or S is void\n-98 template\n-_\b9_\b9 _\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-100 req_(MPI_REQUEST_NULL)\n-101 , data_(_\bs_\bt_\bd::forward(recv_data))\n-102 , send_data_(_\bs_\bt_\bd::forward(send_data))\n-103 {}\n-104\n-105 // hide this constructor if R is void\n-106 template\n-_\b1_\b0_\b7 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(V&& recv_data, typename std::enable_if_t::\n-value>* = 0)\n-108 : req_(MPI_REQUEST_NULL)\n-109 , data_(_\bs_\bt_\bd::forward(recv_data))\n-110 {}\n-111\n-_\b1_\b1_\b2 _\b~_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be() {\n-113 if(req_ != MPI_REQUEST_NULL){\n-114 try{ // might fail when it is a collective communication\n-115 MPI_Cancel(&req_);\n-116 MPI_Request_free(&req_);\n-117 }catch(...){\n-118 }\n-119 }\n-120 }\n-121\n-_\b1_\b2_\b2 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be&& f)\n-123 : req_(MPI_REQUEST_NULL)\n-124 , data_(_\bs_\bt_\bd::move(f.data_))\n-125 , send_data_(_\bs_\bt_\bd::move(f.send_data_))\n-126 {\n-127 std::swap(req_, f.req_);\n-128 std::swap(status_, f.status_);\n-129 }\n-130\n-_\b1_\b3_\b1 _\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-132 std::swap(req_, f.req_);\n-133 std::swap(status_, f.status_);\n-134 std::swap(data_, f.data_);\n-135 std::swap(send_data_, f.send_data_);\n-136 return *this;\n-137 }\n-138\n-_\b1_\b3_\b9 bool _\bv_\ba_\bl_\bi_\bd() const{\n-140 return (bool)data_;\n-141 }\n-142\n-_\b1_\b4_\b3 void _\bw_\ba_\bi_\bt(){\n-144 if(!_\bv_\ba_\bl_\bi_\bd())\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 MPIFuture is not valid!\");\n-146 MPI_Wait(&req_, &status_);\n-147 }\n-148\n-_\b1_\b4_\b9 bool _\br_\be_\ba_\bd_\by() const{\n-150 int flag = -1;\n-151 MPI_Test(&req_, &flag, &status_);\n-152 return flag;\n-153 }\n-154\n-_\b1_\b5_\b5 R _\bg_\be_\bt() {\n-156 _\bw_\ba_\bi_\bt();\n-157 return data_.get();\n-158 }\n-159\n-_\b1_\b6_\b0 S _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bd_\ba_\bt_\ba(){\n-161 _\bw_\ba_\bi_\bt();\n-162 return send_data_._\bg_\be_\bt();\n-163 }\n-164\n-_\b1_\b6_\b5 auto _\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n-166 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*data_);\n-167 }\n-168\n-_\b1_\b6_\b9 auto _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n-170 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*send_data_);\n-171 }\n-172 };\n-173\n-174}\n-175#endif\n-176#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-_\bf_\bu_\bt_\bu_\br_\be_\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-_\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+68 template\n+_\b6_\b9 auto _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b<_\bV_\b>, S s)\n+70 {\n+71 return V(_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b>(s));\n+72 }\n+73\n+75 template\n+_\b7_\b6 V _\bc_\bo_\bn_\bd(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk_\b<_\bV_\b> &_\bm_\ba_\bs_\bk,\n+77 const V &ifTrue, const V &ifFalse) = delete;\n+78\n+80 template\n+_\b8_\b1 auto _\bm_\ba_\bx(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v1, const V &v2)\n+82 {\n+83 using std::max;\n+84 return _\bm_\ba_\bx(v1, v2);\n+85 }\n+86\n+88 template\n+_\b8_\b9 auto _\bm_\bi_\bn(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v1, const V &v2)\n+90 {\n+91 using std::min;\n+92 return _\bm_\bi_\bn(v1, v2);\n+93 }\n+94\n+96 template\n+_\b9_\b7 bool _\ba_\bn_\by_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk) = delete;\n+98\n+100\n+103 template\n+_\b1_\b0_\b4 bool _\ba_\bl_\bl_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n+105 {\n+106 return !_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(!_\bm_\ba_\bs_\bk);\n+107 }\n+108\n+110\n+113 template\n+_\b1_\b1_\b4 bool _\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n+115 {\n+116 return _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(!_\bm_\ba_\bs_\bk);\n+117 }\n+118\n+120\n+123 template\n+_\b1_\b2_\b4 bool _\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n+125 {\n+126 return !_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(_\bm_\ba_\bs_\bk);\n+127 }\n+128\n+130 template\n+_\b1_\b3_\b1 auto _\bm_\ba_\bx(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v)\n+132 {\n+133 _\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b> m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(0, v);\n+134 for(std::size_t l = 1; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(v); ++l)\n+135 if(m < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v))\n+136 m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v);\n+137 return m;\n+138 }\n+139\n+141 template\n+_\b1_\b4_\b2 auto _\bm_\bi_\bn(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v)\n+143 {\n+144 _\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b> m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(0, v);\n+145 for(std::size_t l = 1; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(v); ++l)\n+146 if(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v) < m)\n+147 m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v);\n+148 return m;\n+149 }\n+150\n+152 template\n+_\b1_\b5_\b3 _\bM_\ba_\bs_\bk_\b<_\bV_\b> _\bm_\ba_\bs_\bk(_\bA_\bD_\bL_\bT_\ba_\bg<0, std::is_same >::value>,\n+154 const V &v)\n+155 {\n+156 return v;\n+157 }\n+158\n+160 template\n+_\b1_\b6_\b1 auto _\bm_\ba_\bs_\bk(_\bA_\bD_\bL_\bT_\ba_\bg<0, !std::is_same >::value>,\n+162 const V &v)\n+163 {\n+164 using Copy = _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\bV_\b>; // just in case we are handed a proxy\n+165 return v != Copy(_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bC_\bo_\bp_\by_\b>(0));\n+166 }\n+167\n+169 template\n+_\b1_\b7_\b0 auto _\bm_\ba_\bs_\bk_\bO_\br(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V1 &v1, const V2 &v2)\n+171 {\n+172 return _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v1) || _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v2);\n+173 }\n+174\n+176 template\n+_\b1_\b7_\b7 auto _\bm_\ba_\bs_\bk_\bA_\bn_\bd(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V1 &v1, const V2 &v2)\n+178 {\n+179 return _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v1) && _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v2);\n+180 }\n+181\n+184 } // namespace Overloads\n+185 } // namespace Simd\n+186} // namespace Dune\n+187\n+188#endif // DUNE_COMMON_SIMD_DEFAULTS_HH\n+_\bb_\ba_\bs_\be_\b._\bh_\bh\n+Basic definitions for SIMD Implementations.\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\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_\bl_\bi_\bs_\bt_\b._\bh_\bh\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:300\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:558\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:_\bm_\ba_\bs_\bk\n+auto mask(const V &v)\n+Convert to mask, analogue of bool(s) for scalars.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:489\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:_\bM_\ba_\bs_\bk\n+Rebind< bool, V > Mask\n+Mask type type of some SIMD type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br\n+typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n+Element type of some SIMD type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\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+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt\n+constexpr V implCast(ADLTag< 0 >, MetaType< V >, const V &u)\n+implements Simd::implCast(V)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n+bool allFalse(ADLTag< 0 >, const Mask &mask)\n+implements Simd::allFalse()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be\n+bool allTrue(ADLTag< 0 >, const Mask &mask)\n+implements Simd::allTrue()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:104\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_\bA_\bn_\bd\n+auto maskAnd(ADLTag< 0 >, const V1 &v1, const V2 &v2)\n+implements Simd::maskAnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:177\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_\bO_\br\n+auto maskOr(ADLTag< 0 >, const V1 &v1, const V2 &v2)\n+implements Simd::maskOr()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:170\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n+bool anyFalse(ADLTag< 0 >, const Mask &mask)\n+implements Simd::anyFalse()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:114\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_\bi_\bn\n+auto min(ADLTag< 0 >, const V &v1, const V &v2)\n+implements binary Simd::min()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n+auto broadcast(ADLTag< 0 >, MetaType< V >, S s)\n+implements Simd::broadcast()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:69\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_\bx\n+auto max(ADLTag< 0 >, const V &v1, const V &v2)\n+implements binary Simd::max()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:81\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:43\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:18\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:19\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:28\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: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(V &&t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:25\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:29\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:20\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:53\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:44\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:54\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:50\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:69\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:76\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:70\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:85\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:107\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:149\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:139\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:112\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:92\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:131\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:169\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:143\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:165\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:155\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:99\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:160\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:122\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n+bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:543\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd\n+const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align\n+> mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align\n+> &ifFalse)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be\n+T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:520\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n+Tag used to force late-binding lookup in Dune::Simd::Overloads.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\ba_\bT_\by_\bp_\be\n+A type that refers to another type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:33\n+_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n+User interface of the SIMD abstraction.\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: localindex.hh File Reference\n+dune-common: standard.hh File Reference\n \n \n \n \n \n \n \n@@ -65,55 +65,86 @@\n
    \n
    \n \n \n \n \n \n \n+ \n \n
    \n \n-

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

    SIMD abstractions for the standard built-in types. \n More...

    \n
    #include <cstddef>
    \n+#include <type_traits>
    \n+#include <utility>
    \n+#include <dune/common/indices.hh>
    \n+#include <dune/common/simd/base.hh>
    \n+#include <dune/common/simd/defaults.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::LocalIndex
     An index present on the local process. More...
    struct  Dune::Simd::Overloads::ScalarType< V, class >
     should have a member type type More...
     
    struct  Dune::Simd::Overloads::RebindType< S, class, class >
     should have a member type type More...
     
    struct  Dune::Simd::Overloads::LaneCount< class, class >
     should be derived from a Dune::index_constant More...
     
    \n \n \n \n \n+\n+\n+\n+\n+\n+\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    \n-\n-\n-\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::LocalIndexState { Dune::VALID\n-, Dune::DELETED\n- }
     The states available for the local indices. More...
     

    \n+Functions

    Specialized classes and overloaded functions
    template<class V >
    Dune::Simd::Overloads::lane (ADLTag< 2 >, std::size_t, V v)
     implements Simd::lane()
     
    template<class V >
    V & Dune::Simd::Overloads::lane (ADLTag< 3 >, std::size_t, V &v)
     
    bool Dune::Simd::Overloads::anyTrue (ADLTag< 2 >, bool mask)
     implements Simd::anyTrue()
     
    bool Dune::Simd::Overloads::allTrue (ADLTag< 2 >, bool mask)
     implements Simd::allTrue()
     
    bool Dune::Simd::Overloads::anyFalse (ADLTag< 2 >, bool mask)
     implements Simd::anyFalse()
     
    bool Dune::Simd::Overloads::allFalse (ADLTag< 2 >, bool mask)
     implements Simd::allFalse()
     
    \n

    Detailed Description

    \n-

    Provides classes for use as the local index in ParallelIndexSet.

    \n-
    Author
    Markus Blatt
    \n+

    SIMD abstractions for the standard built-in types.

    \n+

    This file should not normally be included by users of the SIMD abstraction (i.e. other Dune headers). Neither should it be included by the translation units passing built-in types to Dune headers that in turn support SIMD types through the SIMD abstraction. Dune-functionality always supports built-in types. Either because that functionality does not support SIMD types and so only supports built-in types, or if it does support SIMD types it must include <dune/common/simd/simd.hh>, which in turn includes this header.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,31 +1,73 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\bd\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+standard.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bA_\bp_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be \u00bb _\bS_\bI_\bM_\bD_\b _\bA_\bb_\bs_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn\n+_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bf_\bo_\br_\b _\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd_\b _\bt_\by_\bp_\be_\bs\n+SIMD abstractions for the standard built-in types. _\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_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\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_\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b<_\b _\bV_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+\u00a0 should have a member type type _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be_\b<_\b _\bS_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+\u00a0 should have a member type type _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+\u00a0 should be derived from a _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt _\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:_\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+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd\n+\u00a0 Namespace for vectorization interface functions used by library\n+ developers.\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n+\u00a0 Namespace for the overloads and specializations that make up a SIMD\n+ implementation.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+Specialized classes and overloaded functions\n+template\n+ V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, std::size_t, V v)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\b(_\b)\n+\u00a0\n+template\n+ V &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 3 >, std::size_t, V &v)\n+\u00a0\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be_\b(_\b)\n+\u00a0\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be_\b(_\b)\n+\u00a0\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be_\b(_\b)\n+\u00a0\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n+\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be_\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-Provides classes for use as the local index in ParallelIndexSet.\n- Author\n- Markus Blatt\n+SIMD abstractions for the standard built-in types.\n+This file should not normally be included by users of the SIMD abstraction\n+(i.e. other _\bD_\bu_\bn_\be headers). Neither should it be included by the translation\n+units passing built-in types to _\bD_\bu_\bn_\be headers that in turn support SIMD types\n+through the SIMD abstraction. Dune-functionality always supports built-in\n+types. Either because that functionality does not support SIMD types and so\n+only supports built-in types, or if it does support SIMD types it must include\n+<_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>, which in turn includes this header.\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: localindex.hh Source File\n+dune-common: standard.hh Source File\n \n \n \n \n \n \n \n@@ -70,117 +70,102 @@\n
    \n \n \n \n \n \n \n
    \n-
    localindex.hh
    \n+
    standard.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 (C) 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 (C) 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_STANDARD_HH
    \n+
    4#define DUNE_COMMON_SIMD_STANDARD_HH
    \n
    5
    \n-
    6#ifndef DUNE_COMMON_LOCALINDEX_HH
    \n-
    7#define DUNE_COMMON_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-
    49 LocalIndex(std::size_t index) :
    \n-
    50 localIndex_(index), state_(VALID){}
    \n-
    \n-
    55 inline const std::size_t& local() const;
    \n+
    20#include <cstddef>
    \n+
    21#include <type_traits>
    \n+
    22#include <utility>
    \n+
    23
    \n+\n+\n+\n+
    27
    \n+
    45namespace Dune {
    \n+
    46 namespace Simd {
    \n+
    47
    \n+
    48 namespace Overloads {
    \n+
    49
    \n
    56
    \n-
    60 inline operator std::size_t() const;
    \n+
    59 template<class V, class>
    \n+
    60 struct ScalarType { using type = V; };
    \n
    61
    \n-
    67 inline LocalIndex& operator=(std::size_t index);
    \n+
    63
    \n+
    66 template<class S, class, class>
    \n+
    67 struct RebindType { using type = S; };
    \n
    68
    \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+
    70
    \n+
    73 template<class, class>
    \n+
    74 struct LaneCount : public index_constant<1> { };
    \n+
    75
    \n+
    77
    \n+
    86 template<class V>
    \n+
    \n+
    87 V lane(ADLTag<2>, std::size_t, V v)
    \n+
    88 {
    \n+
    89 return v;
    \n+
    90 }
    \n+
    \n+
    91
    \n+
    92 template<class V>
    \n+
    \n+
    93 V &lane(ADLTag<3>, std::size_t, V &v)
    \n+
    94 {
    \n+
    95 return v;
    \n+
    96 }
    \n+
    \n+
    97
    \n+
    98 // No Simd::cond() implementation, the overload for bool masks in the
    \n+
    99 // interface is sufficient
    \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+
    102 inline bool anyTrue(ADLTag<2>, bool mask) { return mask; }
    \n+
    103
    \n+
    105 inline bool allTrue(ADLTag<2>, bool mask) { return mask; }
    \n+
    106
    \n+
    108 inline bool anyFalse(ADLTag<2>, bool mask) { return !mask; }
    \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
    \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+
    111 inline bool allFalse(ADLTag<2>, bool mask) { return !mask; }
    \n+
    112
    \n+
    114
    \n+
    115 } // namespace Overloads
    \n+
    116 } // namespace Simd
    \n+
    117} // namespace Dune
    \n+
    118
    \n+
    119#endif // DUNE_COMMON_SIMD_STANDARD_HH
    \n+
    Default implementations for SIMD Implementations.
    \n+
    Basic definitions for SIMD Implementations.
    \n+\n+
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:30
    \n+
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n+
    bool allFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::allFalse()
    Definition defaults.hh:124
    \n+
    bool allTrue(ADLTag< 0 >, const Mask &mask)
    implements Simd::allTrue()
    Definition defaults.hh:104
    \n+
    bool anyFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::anyFalse()
    Definition defaults.hh:114
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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+
    bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
    Definition debugalign.hh:543
    \n+
    T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
    Definition debugalign.hh:520
    \n+
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n+
    should have a member type type
    Definition standard.hh:60
    \n+
    V type
    Definition standard.hh:60
    \n+
    should have a member type type
    Definition standard.hh:67
    \n+
    S type
    Definition standard.hh:67
    \n+
    should be derived from a Dune::index_constant
    Definition standard.hh:74
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,121 +1,124 @@\n dune-common\u00a02.9.0\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-localindex.hh\n+ * _\bs_\bi_\bm_\bd\n+standard.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_STANDARD_HH\n+4#define DUNE_COMMON_SIMD_STANDARD_HH\n 5\n-6#ifndef DUNE_COMMON_LOCALINDEX_HH\n-7#define DUNE_COMMON_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_\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+20#include \n+21#include \n+22#include \n+23\n+24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n+26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs_\b._\bh_\bh>\n+27\n+45namespace _\bD_\bu_\bn_\be {\n+46 namespace Simd {\n+47\n+48 namespace Overloads {\n+49\n 56\n-60 inline operator std::size_t() const;\n+59 template\n+_\b6_\b0 struct _\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be { using _\bt_\by_\bp_\be = V; };\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+63\n+66 template\n+_\b6_\b7 struct _\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be { using _\bt_\by_\bp_\be = S; };\n 68\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+70\n+73 template\n+_\b7_\b4 struct _\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt : public _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt<1> { };\n+75\n+77\n+86 template\n+_\b8_\b7 V _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, std::size_t, V v)\n+88 {\n+89 return v;\n+90 }\n+91\n+92 template\n+_\b9_\b3 V &_\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b3_\b>, std::size_t, V &v)\n+94 {\n+95 return v;\n+96 }\n+97\n+98 // No Simd::cond() implementation, the overload for bool masks in the\n+99 // interface is sufficient\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+_\b1_\b0_\b2 inline bool _\ba_\bn_\by_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return _\bm_\ba_\bs_\bk; }\n+103\n+_\b1_\b0_\b5 inline bool _\ba_\bl_\bl_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return _\bm_\ba_\bs_\bk; }\n+106\n+_\b1_\b0_\b8 inline bool _\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return !_\bm_\ba_\bs_\bk; }\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\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+_\b1_\b1_\b1 inline bool _\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return !_\bm_\ba_\bs_\bk; }\n+112\n+114\n+115 } // namespace Overloads\n+116 } // namespace Simd\n+117} // namespace Dune\n+118\n+119#endif // DUNE_COMMON_SIMD_STANDARD_HH\n+_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs_\b._\bh_\bh\n+Default implementations for SIMD Implementations.\n+_\bb_\ba_\bs_\be_\b._\bh_\bh\n+Basic definitions for SIMD Implementations.\n+_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n+std::integral_constant< std::size_t, i > index_constant\n+An index constant with value i.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:30\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+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n+bool allFalse(ADLTag< 0 >, const Mask &mask)\n+implements Simd::allFalse()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be\n+bool allTrue(ADLTag< 0 >, const Mask &mask)\n+implements Simd::allTrue()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:104\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n+bool anyFalse(ADLTag< 0 >, const Mask &mask)\n+implements Simd::anyFalse()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:114\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:_\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+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n+bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:543\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be\n+T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:520\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n+Tag used to force late-binding lookup in Dune::Simd::Overloads.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be\n+should have a member type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n+V type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be\n+should have a member type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n+S type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt\n+should be derived from a Dune::index_constant\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.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/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: mpitraits.hh File Reference\n+dune-common: test.cc File Reference\n \n \n \n \n \n \n \n@@ -65,51 +65,25 @@\n
    \n \n \n \n \n \n \n
    \n- \n-
    mpitraits.hh File Reference
    \n+
    test.cc File Reference
    \n
    \n
    \n-\n-

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

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

    Go to the source code of this file.

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

    \n-Classes

    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-

    Traits classes for mapping types onto MPI_Datatype.

    \n-
    Author
    Markus Blatt
    \n+
    #include <config.h>
    \n+#include <ostream>
    \n+#include <string>
    \n+#include <dune/common/simd/test.hh>
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,14 @@\n dune-common\u00a02.9.0\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-_\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-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-Traits classes for mapping types onto MPI_Datatype.\n- Author\n- Markus Blatt\n+ * _\bs_\bi_\bm_\bd\n+test.cc File Reference\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bt_\be_\bs_\bt_\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/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: mpicollectivecommunication.hh File Reference\n+dune-common: base.hh File Reference\n \n \n \n \n \n \n \n@@ -65,24 +65,53 @@\n
    \n \n \n \n \n \n \n
    \n-
    mpicollectivecommunication.hh File Reference
    \n+ \n+ \n
    \n
    \n-\n+\n+

    Basic definitions for SIMD Implementations. \n+More...

    \n+\n

    Go to the source code of this file.

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

    \n+Classes

    struct  Dune::Simd::Overloads::ADLTag< i >
     
    struct  Dune::Simd::Overloads::ADLTag< 0 >
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    \n+

    Detailed Description

    \n+

    Basic definitions for SIMD Implementations.

    \n+

    This file provides basic definitions and template declarations that are used to write SIMD abstraction layers.

    \n+

    This file should never be included by users of the SIMD abstraction. Include <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,12 +1,37 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\bd\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+base.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bA_\bb_\bs_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+Basic definitions for SIMD Implementations. _\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_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b _\bi_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b _\b0_\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_\bi_\bm_\bd\n+\u00a0 Namespace for vectorization interface functions used by library\n+ developers.\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n+\u00a0 Namespace for the overloads and specializations that make up a SIMD\n+ implementation.\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+Basic definitions for SIMD Implementations.\n+This file provides basic definitions and template declarations that are used to\n+write SIMD abstraction layers.\n+This file should never be included by users of the SIMD abstraction. Include\n+<_\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/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: mpicollectivecommunication.hh Source File\n+dune-common: base.hh Source File\n \n \n \n \n \n \n \n@@ -70,27 +70,66 @@\n \n \n \n \n \n \n \n
    \n-
    mpicollectivecommunication.hh
    \n+
    base.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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+
    3#ifndef DUNE_COMMON_SIMD_BASE_HH
    \n+
    4#define DUNE_COMMON_SIMD_BASE_HH
    \n+
    5
    \n+
    92namespace Dune {
    \n+
    93 namespace Simd {
    \n+
    94
    \n+
    97
    \n+
    112 namespace Overloads {
    \n+
    113
    \n+
    116
    \n+
    118
    \n+
    181 template<unsigned i, bool = true>
    \n+
    182 struct ADLTag;
    \n+
    183
    \n+
    184 template<unsigned i>
    \n+
    185 struct ADLTag<i> : ADLTag<i-1> {};
    \n+
    186
    \n+
    187 template<>
    \n+
    188 struct ADLTag<0> {};
    \n+
    189
    \n+
    191
    \n+
    195 template<class V, class SFINAETag = void>
    \n+
    196 struct ScalarType;
    \n+
    197
    \n+
    199
    \n+
    203 template<class S, class V, class SFINAETag = void>
    \n+
    204 struct RebindType;
    \n+
    205
    \n+
    207
    \n+
    211 template<class V, class SFINAETag = void>
    \n+
    212 struct LaneCount;
    \n+
    213
    \n+
    215
    \n+
    216 } // namespace Overloads
    \n+
    217 } // namespace Simd
    \n+
    218} // namespace Dune
    \n+
    219
    \n+
    220#endif // DUNE_COMMON_SIMD_BASE_HH
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n+
    should have a member type type
    Definition standard.hh:60
    \n+
    should have a member type type
    Definition standard.hh:67
    \n+
    should be derived from a Dune::index_constant
    Definition standard.hh:74
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,21 +1,67 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\bd\n+base.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 (C) 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+3#ifndef DUNE_COMMON_SIMD_BASE_HH\n+4#define DUNE_COMMON_SIMD_BASE_HH\n+5\n+92namespace _\bD_\bu_\bn_\be {\n+93 namespace Simd {\n+94\n+97\n+112 namespace Overloads {\n+113\n+116\n+118\n+181 template\n+_\b1_\b8_\b2 struct _\bA_\bD_\bL_\bT_\ba_\bg;\n+183\n+184 template\n+_\b1_\b8_\b5 struct _\bA_\bD_\bL_\bT_\ba_\bg : _\bA_\bD_\bL_\bT_\ba_\bg {};\n+186\n+187 template<>\n+_\b1_\b8_\b8 struct _\bA_\bD_\bL_\bT_\ba_\bg<0> {};\n+189\n+191\n+195 template\n+196 struct _\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be;\n+197\n+199\n+203 template\n+204 struct _\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be;\n+205\n+207\n+211 template\n+212 struct _\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt;\n+213\n+215\n+216 } // namespace Overloads\n+217 } // namespace Simd\n+218} // namespace Dune\n+219\n+220#endif // DUNE_COMMON_SIMD_BASE_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:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n+Tag used to force late-binding lookup in Dune::Simd::Overloads.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be\n+should have a member type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be\n+should have a member type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt\n+should be derived from a Dune::index_constant\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.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/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: mpi_collective_benchmark.cc File Reference\n+dune-common: loop.hh File Reference\n \n \n \n \n \n \n \n@@ -65,328 +65,679 @@\n \n \n \n \n \n \n \n
    \n \n-
    mpi_collective_benchmark.cc File Reference
    \n+Classes |\n+Namespaces |\n+Macros |\n+Functions
    \n+
    loop.hh File Reference
    \n \n
    \n-
    #include <config.h>
    \n-#include <iostream>
    \n-#include <iomanip>
    \n-#include <thread>
    \n-#include <dune/common/parallel/mpihelper.hh>
    \n-#include <dune/common/timer.hh>
    \n-#include <dune/common/parametertree.hh>
    \n-#include <dune/common/parametertreeparser.hh>
    \n-
    \n+
    #include <array>
    \n+#include <cmath>
    \n+#include <cstddef>
    \n+#include <cstdlib>
    \n+#include <cstdint>
    \n+#include <ostream>
    \n+#include <dune/common/math.hh>
    \n+#include <dune/common/simd/simd.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+Classes

    class  Dune::LoopSIMD< T, S, A >
     
    struct  Dune::Simd::Overloads::ScalarType< LoopSIMD< T, S, A > >
     
    struct  Dune::Simd::Overloads::RebindType< U, LoopSIMD< T, S, A > >
     
    struct  Dune::Simd::Overloads::LaneCount< LoopSIMD< T, S, A > >
     
    struct  Dune::IsNumber< LoopSIMD< T, S, A > >
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    namespace  Dune::MathOverloads
     namespace for customization of math functions with Dune-Semantics
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Macros

    #define DUNE_PRAGMA_OMP_SIMD
     
    #define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_UNARY_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_POSTFIX_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr)
     
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType)
     
    #define DUNE_SIMD_LOOP_STD_UNARY_OP(expr)
     
    #define DUNE_SIMD_LOOP_STD_BINARY_OP(expr)
     
    \n \n-\n-\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+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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

    Dune::ParameterTree options
     Benchmark for measure the possible overlap of computation and communication at MPI collective communications.
     
    std::vector< std::string > all_methods
     
     Dune::DUNE_SIMD_LOOP_BINARY_OP (+)
     
     Dune::DUNE_SIMD_LOOP_BINARY_OP (-)
     
    DUNE_SIMD_LOOP_BINARY_OP * Dune::DUNE_SIMD_LOOP_BINARY_OP (/);DUNE_SIMD_LOOP_BINARY_OP(%
     
    DUNE_SIMD_LOOP_BINARY_OP & Dune::DUNE_SIMD_LOOP_BINARY_OP (|);DUNE_SIMD_LOOP_BINARY_OP(^
     
     Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (<<)
     
     Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (> >)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<=)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (>=)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (!=)
     
    DUNE_SIMD_LOOP_BOOLEAN_OP && Dune::DUNE_SIMD_LOOP_BOOLEAN_OP (||);template< class T, std::size_t S, std::size_t A > std::ostream &operator<<(std::ostream &os, const LoopSIMD< T, S, A > &v
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, LoopSIMD< T, S, A > &&v) -> decltype(std::move(Simd::lane(l%lanes< T >(), v[l/lanes< T >()])))
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, const LoopSIMD< T, S, A > &v) -> decltype(Simd::lane(l%lanes< T >(), v[l/lanes< T >()]))
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, LoopSIMD< T, S, A > &v) -> decltype(Simd::lane(l%lanes< T >(), v[l/lanes< T >()]))
     
    template<class T , std::size_t S, std::size_t AM, std::size_t AD>
    auto Dune::Simd::Overloads::cond (ADLTag< 5 >, Simd::Mask< LoopSIMD< T, S, AM > > mask, LoopSIMD< T, S, AD > ifTrue, LoopSIMD< T, S, AD > ifFalse)
     
    template<class M , class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::cond (ADLTag< 5, std::is_same< bool, Simd::Scalar< M > >::value &&Simd::lanes< M >()==Simd::lanes< LoopSIMD< T, S, A > >()>, M mask, LoopSIMD< T, S, A > ifTrue, LoopSIMD< T, S, A > ifFalse)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::allTrue (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::anyFalse (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::allFalse (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cos)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sin)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tan)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acos)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asin)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atan)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cosh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sinh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tanh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acosh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asinh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atanh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log10)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp2)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (expm1)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (ilogb, int)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log1p)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log2)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (logb)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sqrt)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cbrt)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erf)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erfc)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tgamma)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (lgamma)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (ceil)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (floor)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (trunc)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (round)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (lround, long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (llround, long long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (rint)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (lrint, long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (llrint, long long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (nearbyint)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (fabs)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (abs)
     
     Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (real)
     
     Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (imag)
     
     Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (max)
     
     Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (min)
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::MathOverloads::isNaN (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::MathOverloads::isInf (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::MathOverloads::isFinite (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
     
    \n-

    Function Documentation

    \n-\n-

    ◆ communicate()

    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_PRAGMA_OMP_SIMD

    \n \n
    \n
    \n-
    \n-template<class CC >
    \n \n \n- \n- \n- \n- \n- \n+ \n \n
    void communicate (CC & cc)#define DUNE_PRAGMA_OMP_SIMD
    \n
    \n \n
    \n
    \n-\n-

    ◆ determineOverlap()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_ASSIGNMENT_OP

    \n \n
    \n
    \n \n \n- \n+ \n \n- \n- \n+ \n+ \n \n \n
    std::tuple< double, double > determineOverlap #define DUNE_SIMD_LOOP_ASSIGNMENT_OP(std::function< std::tuple< double, double >(std::chrono::duration< double >)> fun) SYMBOL)
    \n
    \n-\n+Value:
    auto operator SYMBOL(const Simd::Scalar<T> s) { \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    (*this)[i] SYMBOL s; \\
    \n+
    } \\
    \n+
    return *this; \\
    \n+
    } \\
    \n+
    \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v) { \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    (*this)[i] SYMBOL v[i]; \\
    \n+
    } \\
    \n+
    return *this; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ main()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_BINARY_OP

    \n \n
    \n
    \n \n \n- \n+ \n \n- \n- \n- \n- \n- \n+ \n+ \n \n- \n- \n- \n- \n- \n- \n- \n \n
    int main #define DUNE_SIMD_LOOP_BINARY_OP(int argc,
     SYMBOL)char ** argv 
    )
    \n
    \n-\n+Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL s; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = s SYMBOL v[i]; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n+
    const LoopSIMD<T,S,A> &w) { \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL w[i]; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ printHeader()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_BITSHIFT_OP

    \n \n
    \n
    \n \n \n- \n+ \n \n- \n+ \n+ \n \n \n
    void printHeader #define DUNE_SIMD_LOOP_BITSHIFT_OP() SYMBOL)
    \n
    \n-\n+Value:
    template<class T, std::size_t S, std::size_t A, class U> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL s; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    template<class T, std::size_t S, std::size_t A, class U, std::size_t AU> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n+
    const LoopSIMD<U,S,AU> &w) { \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL w[i]; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ run()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_BOOLEAN_OP

    \n \n
    \n
    \n \n \n- \n+ \n \n- \n- \n+ \n+ \n \n \n
    void run #define DUNE_SIMD_LOOP_BOOLEAN_OP(int s) SYMBOL)
    \n
    \n-\n+Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \\
    \n+
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL s; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const Simd::Mask<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n+
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = s SYMBOL v[i]; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n+
    const LoopSIMD<T,S,A> &w) { \\
    \n+
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL w[i]; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ runBlocking()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_CMATH_UNARY_OP

    \n \n
    \n
    \n-
    \n-template<class CC >
    \n \n \n- \n+ \n \n- \n- \n+ \n+ \n \n \n
    double runBlocking #define DUNE_SIMD_LOOP_CMATH_UNARY_OP(CC & cc) expr)
    \n
    \n-\n+Value:
    template<class T, std::size_t S, std::size_t A, typename Sfinae = \\
    \n+
    typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \\
    \n+
    auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n+
    using std::expr; \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    for(std::size_t i=0; i<S; i++) { \\
    \n+
    out[i] = expr(v[i]); \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ runNonblockingActive()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN

    \n \n
    \n
    \n \n \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 #define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(decltype(Dune::MPIHelper::getCommunication())& cc,  expr,
    std::chrono::duration< double > wait_time  returnType 
    )
    \n
    \n-\n+Value:
    template<class T, std::size_t S, std::size_t A, typename Sfinae = \\
    \n+
    typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \\
    \n+
    auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n+
    using std::expr; \\
    \n+
    LoopSIMD<returnType,S> out; \\
    \n+
    for(std::size_t i=0; i<S; i++) { \\
    \n+
    out[i] = expr(v[i]); \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ runNonblockingSleep()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_COMPARISON_OP

    \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 #define DUNE_SIMD_LOOP_COMPARISON_OP(decltype(Dune::MPIHelper::getCommunication())& cc,
     SYMBOL)std::chrono::duration< double > wait_time 
    \n+
    \n+Value:
    template<class T, std::size_t S, std::size_t A, class U> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \\
    \n+
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL s; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n+
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = s SYMBOL v[i]; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n+
    const LoopSIMD<T,S,A> &w) { \\
    \n+
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = v[i] SYMBOL w[i]; \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_LOOP_POSTFIX_OP

    \n+\n+
    \n+
    \n+ \n \n+ \n+ \n+ \n+ \n \n- \n- \n \n
    #define DUNE_SIMD_LOOP_POSTFIX_OP( SYMBOL))
    \n
    \n-\n+Value:
    auto operator SYMBOL(int){ \\
    \n+
    LoopSIMD<T,S,A> out = *this; \\
    \n+
    SYMBOL(*this); \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ runNonblockingWait()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_PREFIX_OP

    \n \n
    \n
    \n-
    \n-template<class CC >
    \n \n \n- \n+ \n \n- \n- \n+ \n+ \n \n \n
    double runNonblockingWait #define DUNE_SIMD_LOOP_PREFIX_OP(CC & cc) SYMBOL)
    \n
    \n-\n+Value:
    auto operator SYMBOL() { \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    SYMBOL(*this)[i]; \\
    \n+
    } \\
    \n+
    return *this; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-\n-

    ◆ startCommunication()

    \n+\n+

    ◆ DUNE_SIMD_LOOP_STD_BINARY_OP

    \n \n
    \n
    \n-
    \n-template<class CC >
    \n \n \n- \n+ \n \n- \n- \n+ \n+ \n \n \n
    Dune::Future< void > startCommunication #define DUNE_SIMD_LOOP_STD_BINARY_OP(CC & cc) expr)
    \n
    \n-\n+Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto expr(const LoopSIMD<T,S,A> &v, const LoopSIMD<T,S,A> &w) { \\
    \n+
    using std::expr; \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    for(std::size_t i=0; i<S; i++) { \\
    \n+
    out[i] = expr(v[i],w[i]); \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n-

    Variable Documentation

    \n-\n-

    ◆ all_methods

    \n+\n+

    ◆ DUNE_SIMD_LOOP_STD_UNARY_OP

    \n \n
    \n
    \n \n \n- \n+ \n+ \n+ \n+ \n+ \n \n
    std::vector<std::string> all_methods#define DUNE_SIMD_LOOP_STD_UNARY_OP( expr)
    \n
    \n-Initial value:
    = {"allreduce",
    \n-
    "barrier",
    \n-
    "broadcast",
    \n-
    "gather",
    \n-
    "allgather",
    \n-
    "scatter"}
    \n+Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n+
    using std::expr; \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    for(std::size_t i=0; i<S; i++) { \\
    \n+
    out[i] = expr(v[i]); \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    \\
    \n+
    template<class T, std::size_t S, std::size_t A> \\
    \n+
    auto expr(const LoopSIMD<std::complex<T>,S,A> &v) { \\
    \n+
    using std::expr; \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    for(std::size_t i=0; i<S; i++) { \\
    \n+
    out[i] = expr(v[i]); \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n
    \n
    \n
    \n-\n-

    ◆ options

    \n+\n+

    ◆ DUNE_SIMD_LOOP_UNARY_OP

    \n \n
    \n
    \n \n \n- \n+ \n+ \n+ \n+ \n+ \n \n
    Dune::ParameterTree options#define DUNE_SIMD_LOOP_UNARY_OP( SYMBOL)
    \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+Value:
    auto operator SYMBOL() const { \\
    \n+
    LoopSIMD<T,S,A> out; \\
    \n+
    DUNE_PRAGMA_OMP_SIMD \\
    \n+
    for(std::size_t i=0; i<S; i++){ \\
    \n+
    out[i] = SYMBOL((*this)[i]); \\
    \n+
    } \\
    \n+
    return out; \\
    \n+
    } \\
    \n+
    static_assert(true, "expecting ;")
    \n+
    \n
    \n
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,145 +1,489 @@\n dune-common\u00a02.9.0\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-#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_\bh_\be_\bl_\bp_\be_\br_\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+ * _\bs_\bi_\bm_\bd\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+loop.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/_\bm_\ba_\bt_\bh_\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+_\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_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b<_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be_\b<_\b _\bU_\b,_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt_\b<_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\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+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd\n+\u00a0 Namespace for vectorization interface functions used by library\n+ developers.\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n+\u00a0 Namespace for the overloads and specializations that make up a SIMD\n+ implementation.\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+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bP_\bR_\bA_\bG_\bM_\bA_\b__\bO_\bM_\bP_\b__\bS_\bI_\bM_\bD\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bT_\bS_\bH_\bI_\bF_\bT_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bO_\bO_\bL_\bE_\bA_\bN_\b__\bO_\bP(SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP(expr)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN(expr, returnType)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP(expr)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(expr)\n+\u00a0\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 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (+)\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 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (-)\n \u00a0\n-template\n- double\u00a0 _\br_\bu_\bn_\bB_\bl_\bo_\bc_\bk_\bi_\bn_\bg (CC &cc)\n+ DUNE_SIMD_LOOP_BINARY_OP *\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (/\n+ );DUNE_SIMD_LOOP_BINARY_OP(%\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+ DUNE_SIMD_LOOP_BINARY_OP &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP\n+ (|);DUNE_SIMD_LOOP_BINARY_OP(^\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bT_\bS_\bH_\bI_\bF_\bT_\b__\bO_\bP (<<)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bT_\bS_\bH_\bI_\bF_\bT_\b__\bO_\bP (> >)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (<)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (<=)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (>=)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (!=)\n+\u00a0\n+DUNE_SIMD_LOOP_BOOLEAN_OP &&\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bO_\bO_\bL_\bE_\bA_\bN_\b__\bO_\bP (||);template<\n+ class T, std::size_t S, std::size_t A > std::\n+ ostream &operator<<(std::ostream &os, const\n+ _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &v\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, std::\n+ size_t l, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &&v) -> decltype\n+ (std::move(Simd::lane(l%_\bl_\ba_\bn_\be_\bs< T >(), v[l/_\bl_\ba_\bn_\be_\bs<\n+ T >()])))\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, std::\n+ size_t l, const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &v) -\n+ > decltype(Simd::lane(l%_\bl_\ba_\bn_\be_\bs< T >(), v[l/_\bl_\ba_\bn_\be_\bs<\n+ T >()]))\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, std::\n+ size_t l, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &v) -> decltype\n+ (Simd::lane(l%_\bl_\ba_\bn_\be_\bs< T >(), v[l/_\bl_\ba_\bn_\be_\bs< T >()]))\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, _\bS_\bi_\bm_\bd_\b:_\b:\n+ _\bM_\ba_\bs_\bk< _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, AM > > _\bm_\ba_\bs_\bk, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T,\n+ S, AD > ifTrue, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, AD > ifFalse)\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 5, std::\n+ is_same< bool, _\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br< M > >::value\n+ &&_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs< M >()==_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs< _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T,\n+ S, A > >()>, M _\bm_\ba_\bs_\bk, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > ifTrue,\n+ _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > ifFalse)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n+ _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n+ _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n+ _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n+ _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (cos)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (sin)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (tan)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (acos)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (asin)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (atan)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (cosh)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (sinh)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (tanh)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (acosh)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (asinh)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (atanh)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (exp)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log10)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (exp2)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (expm1)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n+ (ilogb, int)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log1p)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log2)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (logb)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (sqrt)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (cbrt)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (erf)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (erfc)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (tgamma)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (lgamma)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (ceil)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (floor)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (trunc)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (round)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n+ (lround, long)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n+ (llround, long long)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (rint)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n+ (lrint, long)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n+ (llrint, long long)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (nearbyint)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (fabs)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (abs)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (real)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (imag)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (max)\n+\u00a0\n+ \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (min)\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_\bN_\ba_\bN (const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S,\n+ A > &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 3 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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_\bI_\bn_\bf (const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S,\n+ A > &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 3 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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_\bF_\bi_\bn_\bi_\bt_\be (const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T,\n+ S, A > &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 3 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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_P\bPR\bRA\bAG\bGM\bMA\bA_\b_O\bOM\bMP\bP_\b_S\bSI\bIM\bMD\bD *\b**\b**\b**\b**\b*\n+#define DUNE_PRAGMA_OMP_SIMD\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_L\bLO\bOO\bOP\bP_\b_A\bAS\bSS\bSI\bIG\bGN\bNM\bME\bEN\bNT\bT_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_LOOP_ASSIGNMENT_OP ( \u00a0 SYMBOL )\n+V\bVa\bal\blu\bue\be:\b:\n+auto operator SYMBOL(const Simd::Scalar s) { \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i &v) { \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \\\n+LoopSIMD out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \\\n+LoopSIMD out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, \\\n+const LoopSIMD &w) { \\\n+LoopSIMD out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, const U s) { \\\n+LoopSIMD out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, \\\n+const LoopSIMD &w) { \\\n+LoopSIMD out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \\\n+Simd::Mask> out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const Simd::Mask s, const LoopSIMD &v) { \\\n+Simd::Mask> out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, \\\n+const LoopSIMD &w) { \\\n+Simd::Mask> out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i>::value> > \\\n+auto expr(const LoopSIMD &v) { \\\n+using std::expr; \\\n+LoopSIMD out; \\\n+for(std::size_t i=0; i>::value> > \\\n+auto expr(const LoopSIMD &v) { \\\n+using std::expr; \\\n+LoopSIMD out; \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, const U s) { \\\n+Simd::Mask> out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \\\n+Simd::Mask> out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto operator SYMBOL(const LoopSIMD &v, \\\n+const LoopSIMD &w) { \\\n+Simd::Mask> out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i out = *this; \\\n+SYMBOL(*this); \\\n+return out; \\\n+} \\\n+static_assert(true, \"expecting ;\")\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_L\bLO\bOO\bOP\bP_\b_P\bPR\bRE\bEF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_LOOP_PREFIX_OP ( \u00a0 SYMBOL )\n+V\bVa\bal\blu\bue\be:\b:\n+auto operator SYMBOL() { \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i \\\n+auto expr(const LoopSIMD &v, const LoopSIMD &w) { \\\n+using std::expr; \\\n+LoopSIMD out; \\\n+for(std::size_t i=0; i \\\n+auto expr(const LoopSIMD &v) { \\\n+using std::expr; \\\n+LoopSIMD out; \\\n+for(std::size_t i=0; i \\\n+auto expr(const LoopSIMD,S,A> &v) { \\\n+using std::expr; \\\n+LoopSIMD out; \\\n+for(std::size_t i=0; i out; \\\n+DUNE_PRAGMA_OMP_SIMD \\\n+for(std::size_t i=0; i\n \n \n \n \n \n \n-dune-common: mpipack.hh File Reference\n+dune-common: simd.hh File Reference\n \n \n \n \n \n \n \n@@ -65,51 +65,101 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    mpipack.hh File Reference
    \n+Namespaces |\n+Typedefs |\n+Functions
    \n+
    simd.hh File Reference
    \n \n
    \n \n-

    See MPI_Pack. \n+

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

    \n-
    #include <vector>
    \n-#include <mpi.h>
    \n-#include <dune/common/parallel/mpicommunication.hh>
    \n-#include <dune/common/parallel/mpidata.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 Classes

    class  Dune::MPIPack
    struct  Dune::SimdScalarTypeTraits< T >
     
    struct  Dune::MPIData< P, std::enable_if_t< std::is_same< std::remove_const_t< P >, MPIPack >::value > >
    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+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-

    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+

    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,35 +1,79 @@\n dune-common\u00a02.9.0\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-#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+_\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- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bP_\bI_\bP_\ba_\bc_\bk\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:_\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+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-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+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/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: mpipack.hh Source File\n+dune-common: simd.hh Source File\n \n \n \n \n \n \n \n@@ -70,283 +70,522 @@\n
    \n
    \n \n \n \n \n \n
    \n-
    mpipack.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 (C) DUNE Project contributors, see file LICENSE.md in module root
    \n-
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH
    \n-
    21#define DUNE_COMMON_PARALLEL_MPIPACK_HH
    \n-
    22
    \n-
    23#include <vector>
    \n-
    24#if HAVE_MPI
    \n-
    25#include <mpi.h>
    \n-\n-\n-
    28
    \n-
    29
    \n-
    30namespace Dune {
    \n-
    31
    \n-
    \n-
    32 class MPIPack {
    \n-
    33 std::vector<char> _buffer;
    \n-
    34 int _position;
    \n-
    35 MPI_Comm _comm;
    \n-
    36
    \n-
    37 friend struct MPIData<MPIPack>;
    \n-
    38 friend struct MPIData<const MPIPack>;
    \n-
    39 public:
    \n-
    \n-
    40 MPIPack(Communication<MPI_Comm> comm, std::size_t size = 0)
    \n-
    41 : _buffer(size)
    \n-
    42 , _position(0)
    \n-
    43 , _comm(comm)
    \n-
    44 {}
    \n-
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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-
    46 // Its not valid to copy a MPIPack but you can move it
    \n-
    47 MPIPack(const MPIPack&) = delete;
    \n-
    48 MPIPack& operator = (const MPIPack& other) = delete;
    \n-
    49 MPIPack(MPIPack&&) = default;
    \n-
    50 MPIPack& operator = (MPIPack&& other) = default;
    \n-
    51
    \n-
    57 template<class T>
    \n-
    \n-
    58 void pack(const T& data){
    \n-
    59 auto mpidata = getMPIData(data);
    \n-
    60 int size = getPackSize(mpidata.size(), _comm, mpidata.type());
    \n-
    61 constexpr bool has_static_size = decltype(getMPIData(std::declval<T&>()))::static_size;
    \n-
    62 if(!has_static_size)
    \n-
    63 size += getPackSize(1, _comm, MPI_INT);
    \n-
    64 if (_position + size > 0 && size_t(_position + size) > _buffer.size()) // resize buffer if necessary
    \n-
    65 _buffer.resize(_position + size);
    \n-
    66 if(!has_static_size){
    \n-
    67 int size = mpidata.size();
    \n-
    68 MPI_Pack(&size, 1, MPI_INT, _buffer.data(), _buffer.size(),
    \n-
    69 &_position, _comm);
    \n-
    70 }
    \n-
    71 MPI_Pack(mpidata.ptr(), mpidata.size(),
    \n-
    72 mpidata.type(), _buffer.data(), _buffer.size(),
    \n-
    73 &_position, _comm);
    \n-
    74 }
    \n-
    \n-
    75
    \n-
    80 template<class T>
    \n-
    \n-
    81 auto /*void*/ unpack(T& data)
    \n-
    82 -> std::enable_if_t<decltype(getMPIData(data))::static_size, void>
    \n-
    83 {
    \n-
    84 auto mpidata = getMPIData(data);
    \n-
    85 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n-
    86 mpidata.ptr(), mpidata.size(),
    \n-
    87 mpidata.type(), _comm);
    \n-
    88 }
    \n-
    \n-
    89
    \n-
    94 template<class T>
    \n-
    \n-
    95 auto /*void*/ unpack(T& data)
    \n-
    96 -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void>
    \n-
    97 {
    \n-
    98 auto mpidata = getMPIData(data);
    \n-
    99 int size = 0;
    \n-
    100 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n-
    101 &size, 1,
    \n-
    102 MPI_INT, _comm);
    \n-
    103 mpidata.resize(size);
    \n-
    104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n-
    105 mpidata.ptr(), mpidata.size(),
    \n-
    106 mpidata.type(), _comm);
    \n-
    107 }
    \n-
    \n-
    108
    \n-
    109
    \n-
    111 template<typename T>
    \n-
    \n-
    112 friend MPIPack& operator << (MPIPack& p, const T& t){
    \n-
    113 p.pack(t);
    \n-
    114 return p;
    \n-
    115 }
    \n-
    \n-
    116
    \n-
    118 template<typename T>
    \n-
    \n-
    119 friend MPIPack& operator >> (MPIPack& p, T& t){
    \n-
    120 p.unpack(t);
    \n-
    121 return p;
    \n-
    122 }
    \n-
    \n-
    123
    \n-
    125 template<typename T>
    \n-
    \n-
    126 MPIPack& read(T& t){
    \n-
    127 unpack(t);
    \n-
    128 return *this;
    \n-
    129 }
    \n-
    \n-
    130
    \n-
    132 template<typename T>
    \n-
    \n-
    133 MPIPack& write(const T& t){
    \n-
    134 pack(t);
    \n-
    135 return *this;
    \n-
    136 }
    \n-
    \n-
    137
    \n-
    \n-
    141 void resize(size_t size){
    \n-
    142 _buffer.resize(size);
    \n-
    143 }
    \n-
    \n-
    144
    \n-
    \n-
    147 void enlarge(int s) {
    \n-
    148 _buffer.resize(_buffer.size() + s);
    \n-
    149 }
    \n-
    \n-
    150
    \n-
    \n-
    153 size_t size() const {
    \n-
    154 return _buffer.size();
    \n-
    155 }
    \n-
    \n-
    156
    \n-
    \n-
    160 void seek(int p){
    \n-
    161 _position = p;
    \n-
    162 }
    \n-
    \n-
    163
    \n-
    \n-
    167 int tell() const{
    \n-
    168 return _position;
    \n-
    169 }
    \n-
    \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-
    \n-
    173 bool eof() const{
    \n-
    174 return std::size_t(_position)==_buffer.size();
    \n-
    175 }
    \n-
    \n-
    176
    \n-
    \n-
    180 static int getPackSize(int len, const MPI_Comm& comm, const MPI_Datatype& dt){
    \n-
    181 int size;
    \n-
    182 MPI_Pack_size(len, dt, comm, &size);
    \n-
    183 return size;
    \n-
    184 }
    \n-
    \n-
    185
    \n-
    \n-
    186 friend bool operator==(const MPIPack& a, const MPIPack& b) {
    \n-
    187 return a._buffer == b._buffer && a._comm == b._comm;
    \n-
    188 }
    \n-
    \n-
    \n-
    189 friend bool operator!=(const MPIPack& a, const MPIPack& b) {
    \n-
    190 return !(a==b);
    \n-
    191 }
    \n-
    \n-
    192
    \n-
    193 };
    \n-
    \n-
    194
    \n-
    195 template<class P>
    \n-
    \n-
    196 struct MPIData<P, std::enable_if_t<std::is_same<std::remove_const_t<P>, MPIPack>::value>> {
    \n-
    197 protected:
    \n-
    198 friend auto getMPIData<P>(P& t);
    \n-
    \n-
    199 MPIData(P& t) :
    \n-
    200 data_(t)
    \n-
    201 {}
    \n-
    \n-
    202 public:
    \n-
    203 static constexpr bool static_size = std::is_const<P>::value;
    \n-
    204
    \n-
    \n-
    205 void* ptr() {
    \n-
    206 return (void*) data_._buffer.data();
    \n-
    207 }
    \n-
    \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-
    \n-
    209 int size() {
    \n-
    210 return data_.size();
    \n-
    211 }
    \n-
    \n-
    212
    \n-
    \n-
    213 MPI_Datatype type() const{
    \n-
    214 return MPI_PACKED;
    \n-
    215 }
    \n-
    \n-
    216
    \n-
    \n-
    217 void resize(int size){
    \n-
    218 data_.resize(size);
    \n-
    219 }
    \n-
    \n-
    220 protected:
    \n-\n-
    222 };
    \n-
    \n-
    223
    \n-
    224} // end namespace Dune
    \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#endif
    \n-
    227#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 MPI's collective communication methods.
    \n-
    STL namespace.
    \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+
    Traits for type conversions and type information.
    \n+
    Utilities for reduction like operations on ranges.
    \n+\n+\n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    auto getMPIData(T &t)
    Definition mpidata.hh:43
    \n-
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n-
    Definition mpidata.hh:50
    \n-
    T & data_
    Definition mpidata.hh:53
    \n-
    int size() const
    Definition mpidata.hh:67
    \n-
    static constexpr bool static_size
    Definition mpidata.hh:65
    \n-
    Definition mpipack.hh:32
    \n-
    void enlarge(int s)
    Enlarges the internal buffer.
    Definition mpipack.hh:147
    \n-
    friend MPIPack & operator>>(MPIPack &p, T &t)
    Unpacks data from the object.
    Definition mpipack.hh:119
    \n-
    friend MPIPack & operator<<(MPIPack &p, const T &t)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:112
    \n-
    friend bool operator!=(const MPIPack &a, const MPIPack &b)
    Definition mpipack.hh:189
    \n-
    size_t size() const
    Returns the size of the internal buffer.
    Definition mpipack.hh:153
    \n-
    MPIPack & operator=(const MPIPack &other)=delete
    \n-
    MPIPack(Communication< MPI_Comm > comm, std::size_t size=0)
    Definition mpipack.hh:40
    \n-
    void pack(const T &data)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:58
    \n-
    auto unpack(T &data) -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void >
    Unpacks data from the object.
    Definition mpipack.hh:95
    \n-
    auto unpack(T &data) -> std::enable_if_t< decltype(getMPIData(data))::static_size, void >
    Unpacks data from the object.
    Definition mpipack.hh:81
    \n-
    friend bool operator==(const MPIPack &a, const MPIPack &b)
    Definition mpipack.hh:186
    \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:160
    \n-
    bool eof() const
    Checks whether the end of the buffer is reached.
    Definition mpipack.hh:173
    \n-
    void resize(size_t size)
    Resizes the internal buffer.
    Definition mpipack.hh:141
    \n-
    int tell() const
    Gets the position in the buffer where the next pack/unpack operation should take place.
    Definition mpipack.hh:167
    \n-
    MPIPack(MPIPack &&)=default
    \n-
    MPIPack & read(T &t)
    Unpacks data from the object.
    Definition mpipack.hh:126
    \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:180
    \n-
    MPIPack & write(const T &t)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:133
    \n-\n-\n-\n-\n-\n-\n+
    bool any_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:493
    \n+
    bool all_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:499
    \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:481
    \n+
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:487
    \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:115
    \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,323 +1,549 @@\n dune-common\u00a02.9.0\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-mpipack.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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-20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH\n-21#define DUNE_COMMON_PARALLEL_MPIPACK_HH\n-22\n-23#include \n-24#if HAVE_MPI\n-25#include \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_\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_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n-28\n-29\n-30namespace _\bD_\bu_\bn_\be {\n-31\n-_\b3_\b2 class _\bM_\bP_\bI_\bP_\ba_\bc_\bk {\n-33 std::vector _buffer;\n-34 int _position;\n-_\b3_\b5 MPI_Comm _comm;\n-36\n-37 friend struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba<_\bM_\bP_\bI_\bP_\ba_\bc_\bk>;\n-38 friend struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba;\n-39 public:\n-_\b4_\b0 _\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-41 : _buffer(_\bs_\bi_\bz_\be)\n-42 , _position(0)\n-43 , _comm(comm)\n-44 {}\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-46 // Its not valid to copy a MPIPack but you can move it\n-_\b4_\b7 _\bM_\bP_\bI_\bP_\ba_\bc_\bk(const _\bM_\bP_\bI_\bP_\ba_\bc_\bk&) = delete;\n-_\b4_\b8 _\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-_\b4_\b9 _\bM_\bP_\bI_\bP_\ba_\bc_\bk(_\bM_\bP_\bI_\bP_\ba_\bc_\bk&&) = default;\n-_\b5_\b0 _\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-51\n-57 template\n-_\b5_\b8 void _\bp_\ba_\bc_\bk(const T& data){\n-59 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n-60 int _\bs_\bi_\bz_\be = _\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be(mpidata.size(), _comm, mpidata.type());\n-61 constexpr bool has_static_size = decltype(_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(std::declval()))::\n-static_size;\n-62 if(!has_static_size)\n-63 _\bs_\bi_\bz_\be += _\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be(1, _comm, MPI_INT);\n-64 if (_position + _\bs_\bi_\bz_\be > 0 && size_t(_position + _\bs_\bi_\bz_\be) > _buffer.size()) /\n-/ resize buffer if necessary\n-65 _buffer.resize(_position + _\bs_\bi_\bz_\be);\n-66 if(!has_static_size){\n-67 int _\bs_\bi_\bz_\be = mpidata.size();\n-68 MPI_Pack(&_\bs_\bi_\bz_\be, 1, MPI_INT, _buffer.data(), _buffer.size(),\n-69 &_position, _comm);\n-70 }\n-71 MPI_Pack(mpidata.ptr(), mpidata.size(),\n-72 mpidata.type(), _buffer.data(), _buffer.size(),\n-73 &_position, _comm);\n-74 }\n-75\n-80 template\n-_\b8_\b1 auto /*void*/ _\bu_\bn_\bp_\ba_\bc_\bk(T& data)\n-82 -> std::enable_if_t\n-83 {\n-84 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n-85 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n-86 mpidata.ptr(), mpidata.size(),\n-87 mpidata.type(), _comm);\n-88 }\n-89\n-94 template\n-_\b9_\b5 auto /*void*/ _\bu_\bn_\bp_\ba_\bc_\bk(T& data)\n-96 -> std::enable_if_t\n-97 {\n-98 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n-99 int _\bs_\bi_\bz_\be = 0;\n-100 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n-101 &_\bs_\bi_\bz_\be, 1,\n-102 MPI_INT, _comm);\n-103 mpidata.resize(_\bs_\bi_\bz_\be);\n-104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n-105 mpidata.ptr(), mpidata.size(),\n-106 mpidata.type(), _comm);\n-107 }\n-108\n-109\n-111 template\n-_\b1_\b1_\b2 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-113 p._\bp_\ba_\bc_\bk(t);\n-114 return p;\n-115 }\n-116\n-118 template\n-_\b1_\b1_\b9 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-120 p._\bu_\bn_\bp_\ba_\bc_\bk(t);\n-121 return p;\n-122 }\n-123\n-125 template\n-_\b1_\b2_\b6 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\br_\be_\ba_\bd(T& t){\n-127 _\bu_\bn_\bp_\ba_\bc_\bk(t);\n-128 return *this;\n-129 }\n-130\n-132 template\n-_\b1_\b3_\b3 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\bw_\br_\bi_\bt_\be(const T& t){\n-134 _\bp_\ba_\bc_\bk(t);\n-135 return *this;\n-136 }\n-137\n-_\b1_\b4_\b1 void _\br_\be_\bs_\bi_\bz_\be(size_t _\bs_\bi_\bz_\be){\n-142 _buffer.resize(_\bs_\bi_\bz_\be);\n-143 }\n-144\n-_\b1_\b4_\b7 void _\be_\bn_\bl_\ba_\br_\bg_\be(int s) {\n-148 _buffer.resize(_buffer.size() + s);\n-149 }\n-150\n-_\b1_\b5_\b3 size_t _\bs_\bi_\bz_\be() const {\n-154 return _buffer.size();\n-155 }\n-156\n-_\b1_\b6_\b0 void _\bs_\be_\be_\bk(int p){\n-161 _position = p;\n-162 }\n-163\n-_\b1_\b6_\b7 int _\bt_\be_\bl_\bl() const{\n-168 return _position;\n-169 }\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-_\b1_\b7_\b3 bool _\be_\bo_\bf() const{\n-174 return std::size_t(_position)==_buffer.size();\n-175 }\n-176\n-_\b1_\b8_\b0 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-181 int _\bs_\bi_\bz_\be;\n-182 MPI_Pack_size(len, dt, comm, &_\bs_\bi_\bz_\be);\n-183 return _\bs_\bi_\bz_\be;\n-184 }\n-185\n-_\b1_\b8_\b6 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-187 return a._buffer == b._buffer && a._comm == b._comm;\n-188 }\n-_\b1_\b8_\b9 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-190 return !(a==b);\n-191 }\n-192\n-193 };\n-194\n-195 template\n-_\b1_\b9_\b6 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba,\n-MPIPack>::value>> {\n-197 protected:\n-_\b1_\b9_\b8 friend auto getMPIData

    (P& t);\n-_\b1_\b9_\b9 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(P& t) :\n-200 _\bd_\ba_\bt_\ba_\b_(t)\n-201 {}\n-202 public:\n-_\b2_\b0_\b3 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = std::is_const

    ::value;\n-204\n-_\b2_\b0_\b5 void* _\bp_\bt_\br() {\n-206 return (void*) _\bd_\ba_\bt_\ba_\b_._buffer.data();\n-207 }\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-_\b2_\b0_\b9 int _\bs_\bi_\bz_\be() {\n-210 return _\bd_\ba_\bt_\ba_\b_.size();\n-211 }\n-212\n-_\b2_\b1_\b3 MPI_Datatype _\bt_\by_\bp_\be() const{\n-214 return MPI_PACKED;\n-215 }\n-216\n-_\b2_\b1_\b7 void _\br_\be_\bs_\bi_\bz_\be(int _\bs_\bi_\bz_\be){\n-218 _\bd_\ba_\bt_\ba_\b_.resize(_\bs_\bi_\bz_\be);\n-219 }\n-220 protected:\n-_\b2_\b2_\b1 P& _\bd_\ba_\bt_\ba_\b_;\n-222 };\n-223\n-224} // end namespace Dune\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-226#endif\n-227#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-_\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\n-STL namespace.\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+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\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+_\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_\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:43\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:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:50\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:53\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:67\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:65\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:32\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:147\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:119\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:112\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:189\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:153\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:40\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:58\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:95\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:81\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:186\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:160\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:173\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:141\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:167\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:126\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:180\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:133\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: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:_\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:199\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: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:_\bp_\bt_\br\n-void * ptr()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:205\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:221\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:217\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:493\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:499\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:481\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:487\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:115\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/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: indicessyncer.hh File Reference\n+dune-common: io.hh File Reference\n \n \n \n \n \n \n \n@@ -65,86 +65,76 @@\n

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

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

    IO interface of the SIMD abstraction. \n More...

    \n-
    #include "indexset.hh"
    \n-#include "remoteindices.hh"
    \n-#include <dune/common/stdstreams.hh>
    \n-#include <dune/common/sllist.hh>
    \n-#include <cassert>
    \n-#include <cmath>
    \n-#include <limits>
    \n-#include <algorithm>
    \n-#include <functional>
    \n-#include <map>
    \n-#include <tuple>
    \n+
    #include <ios>
    \n+#include <type_traits>
    \n+#include <dune/common/rangeutilities.hh>
    \n+#include <dune/common/simd/simd.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 Classes

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

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::SimdImpl
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\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.
     
    template<class V , class = std::enable_if_t<Simd::lanes<V>() != 1>>
    Inserter< V > Dune::SimdImpl::io (const V &v)
     
    template<class V , class = std::enable_if_t<Simd::lanes<V>() == 1>>
    Simd::Scalar< V > Dune::SimdImpl::io (const V &v)
     
    IO interface

    Templates and functions in this group provide syntactic sugar for IO. They are implemented using the functionality from SimdInterfaceBase, and are not customizable by implementations.

    \n+
    template<class V >
    auto Dune::Simd::vio (const V &v)
     construct a stream inserter
     
    template<class V >
    auto Dune::Simd::io (const V &v)
     construct a stream inserter
     
    \n

    Detailed Description

    \n-

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

    \n-
    Author
    Markus Blatt
    \n+

    IO interface of the SIMD abstraction.

    \n+

    This file provides IO interface functions of the SIMD abstraction layer.

    \n+

    This file is intended for direct inclusion by header making use of the IO interface.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,77 +1,56 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\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-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 \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n-#include \"_\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/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+io.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+IO interface of the SIMD abstraction. _\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/_\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_\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 _\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+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b<_\b _\bT_\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_\bi_\bm_\bd_\bI_\bm_\bp_\bl\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd\n+\u00a0 Namespace for vectorization interface functions used by library\n+ developers.\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+template() != 1>>\n+ _\bI_\bn_\bs_\be_\br_\bt_\be_\br< V >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo (const V &v)\n+\u00a0\n+template() == 1>>\n+_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br< V >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo (const V &v)\n+\u00a0\n+IO interface\n+Templates and functions in this group provide syntactic sugar for IO. They are\n+implemented using the functionality from SimdInterfaceBase, and are not\n+customizable by implementations.\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bv_\bi_\bo (const V &v)\n+\u00a0 construct a stream inserter\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bi_\bo (const V &v)\n+\u00a0 construct a stream inserter\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+IO interface of the SIMD abstraction.\n+This file provides IO interface functions of the SIMD abstraction layer.\n+This file is intended for direct inclusion by header making use of the IO\n+interface.\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: indicessyncer.hh Source File\n+dune-common: io.hh Source File\n \n \n \n \n \n \n \n@@ -70,1051 +70,125 @@\n
    \n
    \n \n \n \n \n \n
    \n-
    indicessyncer.hh
    \n+
    io.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 (C) 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_INDICESSYNCER_HH
    \n-
    6#define DUNE_INDICESSYNCER_HH
    \n-
    7
    \n-
    8#include "indexset.hh"
    \n-
    9#include "remoteindices.hh"
    \n-\n-
    11#include <dune/common/sllist.hh>
    \n-
    12#include <cassert>
    \n-
    13#include <cmath>
    \n-
    14#include <limits>
    \n-
    15#include <algorithm>
    \n-
    16#include <functional>
    \n-
    17#include <map>
    \n-
    18#include <tuple>
    \n-
    19
    \n-
    20#if HAVE_MPI
    \n-
    21namespace Dune
    \n-
    22{
    \n-
    39 template<typename T>
    \n-
    \n-\n-
    41 {
    \n-
    42 public:
    \n-
    43
    \n-\n-
    46
    \n-\n-
    49
    \n-\n-
    52
    \n-
    54 typedef typename ParallelIndexSet::LocalIndex::Attribute Attribute;
    \n-
    55
    \n-\n-
    60
    \n-\n-
    71 RemoteIndices& remoteIndices);
    \n-
    72
    \n-
    82 void sync();
    \n-
    83
    \n-
    94 template<typename T1>
    \n-
    95 void sync(T1& numberer);
    \n-
    96
    \n-
    97 private:
    \n-
    98
    \n-
    100 ParallelIndexSet& indexSet_;
    \n-
    101
    \n-
    103 RemoteIndices& remoteIndices_;
    \n-
    104
    \n-
    106 char** sendBuffers_;
    \n-
    107
    \n-
    109 char* receiveBuffer_;
    \n-
    110
    \n-
    112 std::size_t* sendBufferSizes_;
    \n-
    113
    \n-
    115 int receiveBufferSize_; // int because of MPI
    \n-
    116
    \n-
    120 struct MessageInformation
    \n-
    121 {
    \n-
    \n-\n-
    123 : publish(), pairs()
    \n-
    124 {}
    \n-
    \n-\n-
    131 int pairs;
    \n-
    132 };
    \n-
    133
    \n-
    137 class DefaultNumberer
    \n-
    138 {
    \n-
    139 public:
    \n-
    145 std::size_t operator()([[maybe_unused]] const GlobalIndex& global)
    \n-
    146 {
    \n-
    147 return std::numeric_limits<size_t>::max();
    \n-
    148 }
    \n-
    149 };
    \n-
    150
    \n-
    152 MPI_Datatype datatype_;
    \n-
    153
    \n-
    155 int rank_;
    \n-
    156
    \n-
    161 typedef SLList<std::pair<GlobalIndex,Attribute>, typename RemoteIndices::Allocator> GlobalIndexList;
    \n-
    162
    \n-
    164 typedef typename GlobalIndexList::ModifyIterator GlobalIndexModifier;
    \n-
    165
    \n-\n-
    170 GlobalIndexIterator;
    \n-
    171
    \n-
    173 typedef std::map<int, GlobalIndexList> GlobalIndicesMap;
    \n-
    174
    \n-
    183 GlobalIndicesMap globalMap_;
    \n-
    184
    \n-\n-
    189
    \n-
    193 typedef typename BoolList::iterator BoolIterator;
    \n-
    194
    \n-
    196 typedef typename BoolList::ModifyIterator BoolListModifier;
    \n-
    197
    \n-
    199 typedef std::map<int,BoolList> BoolMap;
    \n-
    200
    \n-
    205 BoolMap oldMap_;
    \n-
    206
    \n-
    208 std::map<int,MessageInformation> infoSend_;
    \n-
    209
    \n-
    211 typedef typename RemoteIndices::RemoteIndexList RemoteIndexList;
    \n-
    212
    \n-
    214 typedef typename RemoteIndexList::ModifyIterator RemoteIndexModifier;
    \n-
    215
    \n-\n-
    218
    \n-
    220 typedef typename RemoteIndexList::iterator RemoteIndexIterator;
    \n-
    221
    \n-
    223 typedef typename RemoteIndexList::const_iterator ConstRemoteIndexIterator;
    \n-
    224
    \n-
    226 typedef std::tuple<RemoteIndexModifier,GlobalIndexModifier,BoolListModifier,
    \n-
    227 const ConstRemoteIndexIterator> IteratorTuple;
    \n-
    228
    \n-
    236 class Iterators
    \n-
    237 {
    \n-
    238 friend class IndicesSyncer<T>;
    \n-
    239 public:
    \n-
    249 Iterators(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n-
    250 BoolList& booleans);
    \n-
    251
    \n-
    255 Iterators();
    \n-
    256
    \n-\n-
    261
    \n-
    267 void insert(const RemoteIndex& index,
    \n-
    268 const std::pair<GlobalIndex,Attribute>& global);
    \n-
    269
    \n-
    274 RemoteIndex& remoteIndex() const;
    \n-
    275
    \n-
    280 std::pair<GlobalIndex,Attribute>& globalIndexPair() const;
    \n-
    281
    \n-\n-
    283
    \n-
    289 bool isOld() const;
    \n-
    290
    \n-
    300 void reset(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n-
    301 BoolList& booleans);
    \n-
    302
    \n-
    308 bool isNotAtEnd() const;
    \n-
    309
    \n-
    315 bool isAtEnd() const;
    \n-
    316
    \n-
    317 private:
    \n-
    327 IteratorTuple iterators_;
    \n-
    328 };
    \n-
    329
    \n-
    331 typedef std::map<int,Iterators> IteratorsMap;
    \n-
    332
    \n-
    344 IteratorsMap iteratorsMap_;
    \n-
    345
    \n-
    347 void calculateMessageSizes();
    \n-
    348
    \n-
    356 void packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& req);
    \n-
    357
    \n-
    362 template<typename T1>
    \n-
    363 void recvAndUnpack(T1& numberer);
    \n-
    364
    \n-
    368 void registerMessageDatatype();
    \n-
    369
    \n-
    373 void insertIntoRemoteIndexList(int process,
    \n-
    374 const std::pair<GlobalIndex,Attribute>& global,
    \n-
    375 char attribute);
    \n-
    376
    \n-
    380 void resetIteratorsMap();
    \n-
    381
    \n-
    386 bool checkReset();
    \n-
    387
    \n-
    396 bool checkReset(const Iterators& iterators, RemoteIndexList& rlist, GlobalIndexList& gList,
    \n-
    397 BoolList& bList);
    \n-
    398 };
    \n-
    \n-
    399
    \n-
    400 template<typename TG, typename TA>
    \n-
    \n-\n-
    402 const std::pair<TG,TA>& i2)
    \n-
    403 {
    \n-
    404 return i1.global() < i2.first ||
    \n-
    405 (i1.global() == i2.first && i1.local().attribute()<i2.second);
    \n-
    406 }
    \n-
    \n-
    407
    \n-
    408 template<typename TG, typename TA>
    \n-
    \n-
    409 bool operator<(const std::pair<TG,TA>& i1,
    \n-
    410 const IndexPair<TG,ParallelLocalIndex<TA> >& i2)
    \n-
    411 {
    \n-
    412 return i1.first < i2.global() ||
    \n-
    413 (i1.first == i2.global() && i1.second<i2.local().attribute());
    \n-
    414 }
    \n-
    \n-
    415
    \n-
    416 template<typename TG, typename TA>
    \n-
    \n-\n-
    418 const std::pair<TG,TA>& i2)
    \n-
    419 {
    \n-
    420 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n-
    421 }
    \n-
    \n-
    422
    \n-
    423 template<typename TG, typename TA>
    \n-
    \n-\n-
    425 const std::pair<TG,TA>& i2)
    \n-
    426 {
    \n-
    427 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n-
    428 }
    \n-
    \n-
    429
    \n-
    430 template<typename TG, typename TA>
    \n-
    \n-
    431 bool operator==(const std::pair<TG,TA>& i2,
    \n-
    432 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n-
    433 {
    \n-
    434 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n-
    435 }
    \n-
    \n-
    436
    \n-
    437 template<typename TG, typename TA>
    \n-
    \n-
    438 bool operator!=(const std::pair<TG,TA>& i2,
    \n-
    439 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n-
    440 {
    \n-
    441 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n-
    442 }
    \n-
    \n-
    443
    \n-
    460 template<typename T, typename A, typename A1>
    \n-
    \n-
    461 void storeGlobalIndicesOfRemoteIndices(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n-
    462 const RemoteIndices<T,A1>& remoteIndices)
    \n-
    463 {
    \n-
    464 for(auto remote = remoteIndices.begin(), end =remoteIndices.end(); remote != end; ++remote) {
    \n-
    465 typedef typename RemoteIndices<T,A1>::RemoteIndexList RemoteIndexList;
    \n-\n-
    467 GlobalIndexList& global = globalMap[remote->first];
    \n-
    468 RemoteIndexList& rList = *(remote->second.first);
    \n-
    469
    \n-
    470 for(auto index = rList.begin(), riEnd = rList.end();
    \n-
    471 index != riEnd; ++index) {
    \n-
    472 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n-
    473 index->localIndexPair().local().attribute()));
    \n-
    474 }
    \n-
    475 }
    \n-
    476 }
    \n-
    \n-
    477
    \n-
    486 template<typename T, typename A, typename A1>
    \n-
    \n-
    487 inline void repairLocalIndexPointers(std::map<int,
    \n-
    488 SLList<std::pair<typename T::GlobalIndex,
    \n-
    489 typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n-
    490 RemoteIndices<T,A1>& remoteIndices,
    \n-
    491 const T& indexSet)
    \n-
    492 {
    \n-
    493 assert(globalMap.size()==static_cast<std::size_t>(remoteIndices.neighbours()));
    \n-
    494 // Repair pointers to index set in remote indices.
    \n-
    495 auto global = globalMap.begin();
    \n-
    496 auto end = remoteIndices.remoteIndices_.end();
    \n-
    497
    \n-
    498 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end; ++remote, ++global) {
    \n-
    499 assert(remote->first==global->first);
    \n-
    500 assert(remote->second.first->size() == global->second.size());
    \n-
    501
    \n-
    502 auto riEnd = remote->second.first->end();
    \n-
    503 auto rIndex = remote->second.first->begin();
    \n-
    504 auto gIndex = global->second.begin();
    \n-
    505 auto index = indexSet.begin();
    \n-
    506
    \n-
    507 assert(rIndex==riEnd || gIndex != global->second.end());
    \n-
    508 while(rIndex != riEnd) {
    \n-
    509 // Search for the index in the set.
    \n-
    510 assert(gIndex != global->second.end());
    \n-
    511
    \n-
    512 while(!(index->global() == gIndex->first
    \n-
    513 && index->local().attribute() == gIndex->second)) {
    \n-
    514 ++index;
    \n-
    515 // this is only needed for ALU, where there may exist
    \n-
    516 // more entries with the same global index in the remote index set
    \n-
    517 // than in the index set
    \n-
    518 if (index->global() > gIndex->first) {
    \n-
    519 index=indexSet.begin();
    \n-
    520 }
    \n-
    521 }
    \n-
    522
    \n-
    523 assert(index != indexSet.end() && *index == *gIndex);
    \n-
    524
    \n-
    525 rIndex->localIndex_ = &(*index);
    \n-
    526 ++index;
    \n-
    527 ++rIndex;
    \n-
    528 ++gIndex;
    \n-
    529 }
    \n-
    530 }
    \n-
    531 remoteIndices.sourceSeqNo_ = remoteIndices.source_->seqNo();
    \n-
    532 remoteIndices.destSeqNo_ = remoteIndices.target_->seqNo();
    \n-
    533 }
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_IO_HH
    \n+
    4#define DUNE_COMMON_SIMD_IO_HH
    \n+
    5
    \n+
    16#include <ios>
    \n+
    17#include <type_traits>
    \n+
    18
    \n+\n+\n+\n+
    22
    \n+
    23namespace Dune {
    \n+
    24
    \n+
    \n+
    25 namespace SimdImpl {
    \n+
    26
    \n+
    27 template<class T>
    \n+
    \n+
    28 class Inserter {
    \n+
    29 T value_;
    \n+
    30
    \n+
    31 public:
    \n+
    32 Inserter(const T &value) : value_(value) {}
    \n+
    33
    \n+
    34 template<class Stream,
    \n+
    35 class = std::enable_if_t<std::is_base_of<std::ios_base,
    \n+
    36 Stream>::value> >
    \n+
    \n+
    37 friend Stream& operator<<(Stream &out, const Inserter &ins)
    \n+
    38 {
    \n+
    39 const char *sep = "<";
    \n+
    40 for(auto l : range(Simd::lanes(ins.value_)))
    \n+
    41 {
    \n+
    42 out << sep << autoCopy(Simd::lane(l, ins.value_));
    \n+
    43 sep = ", ";
    \n+
    44 }
    \n+
    45 out << '>';
    \n+
    46 return out;
    \n+
    47 }
    \n
    \n-
    534
    \n-
    535 template<typename T>
    \n-
    \n-\n-
    537 RemoteIndices& remoteIndices)
    \n-
    538 : indexSet_(indexSet), remoteIndices_(remoteIndices)
    \n-
    539 {
    \n-
    540 // index sets must match.
    \n-
    541 assert(remoteIndices.source_ == remoteIndices.target_);
    \n-
    542 assert(remoteIndices.source_ == &indexSet);
    \n-
    543 MPI_Comm_rank(remoteIndices_.communicator(), &rank_);
    \n-
    544 }
    \n+
    48 };
    \n
    \n-
    545
    \n-
    546 template<typename T>
    \n-
    \n-\n-
    548 GlobalIndexList& globalIndices,
    \n-
    549 BoolList& booleans)
    \n-
    550 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),
    \n-
    551 booleans.beginModify(), remoteIndices.end())
    \n-
    552 { }
    \n-
    \n-
    553
    \n-
    554 template<typename T>
    \n-
    \n-\n-
    556 : iterators_()
    \n-
    557 {}
    \n-
    \n-
    558
    \n-
    559 template<typename T>
    \n-
    \n-\n-
    561 {
    \n-
    562 ++(std::get<0>(iterators_));
    \n-
    563 ++(std::get<1>(iterators_));
    \n-
    564 ++(std::get<2>(iterators_));
    \n-
    565 return *this;
    \n-
    566 }
    \n-
    \n-
    567
    \n-
    568 template<typename T>
    \n-
    \n-\n-
    570 const std::pair<GlobalIndex,Attribute>& global)
    \n-
    571 {
    \n-
    572 std::get<0>(iterators_).insert(index);
    \n-
    573 std::get<1>(iterators_).insert(global);
    \n-
    574 std::get<2>(iterators_).insert(false);
    \n-
    575 }
    \n-
    \n-
    576
    \n-
    577 template<typename T>
    \n-
    578 inline typename IndicesSyncer<T>::RemoteIndex&
    \n-
    \n-\n-
    580 {
    \n-
    581 return *(std::get<0>(iterators_));
    \n-
    582 }
    \n-
    \n-
    583
    \n-
    584 template<typename T>
    \n-
    585 inline std::pair<typename IndicesSyncer<T>::GlobalIndex,typename IndicesSyncer<T>::Attribute>&
    \n-
    \n-\n-
    587 {
    \n-
    588 return *(std::get<1>(iterators_));
    \n-
    589 }
    \n-
    \n-
    590
    \n-
    591 template<typename T>
    \n-
    \n-\n-
    593 {
    \n-
    594 return *(std::get<2>(iterators_));
    \n-
    595 }
    \n-
    \n-
    596
    \n-
    597 template<typename T>
    \n-
    \n-\n-
    599 GlobalIndexList& globalIndices,
    \n-
    600 BoolList& booleans)
    \n-
    601 {
    \n-
    602 std::get<0>(iterators_) = remoteIndices.beginModify();
    \n-
    603 std::get<1>(iterators_) = globalIndices.beginModify();
    \n-
    604 std::get<2>(iterators_) = booleans.beginModify();
    \n-
    605 }
    \n-
    \n-
    606
    \n-
    607 template<typename T>
    \n-
    \n-\n-
    609 {
    \n-
    610 return std::get<0>(iterators_) != std::get<3>(iterators_);
    \n-
    611 }
    \n-
    \n-
    612
    \n-
    613 template<typename T>
    \n-
    \n-\n-
    615 {
    \n-
    616 return std::get<0>(iterators_) == std::get<3>(iterators_);
    \n-
    617 }
    \n+
    49
    \n+
    50 template<class V, class = std::enable_if_t<Simd::lanes<V>() != 1> >
    \n+
    \n+
    51 Inserter<V> io(const V &v)
    \n+
    52 {
    \n+
    53 return { v };
    \n+
    54 }
    \n
    \n-
    618
    \n-
    619 template<typename T>
    \n-\n-
    621 {
    \n-
    622 MPI_Datatype type[2] = {MPI_INT, MPI_INT};
    \n-
    623 int blocklength[2] = {1,1};
    \n-
    624 MPI_Aint displacement[2];
    \n-
    625 MPI_Aint base;
    \n-
    626
    \n-
    627 // Compute displacement
    \n-
    628 MessageInformation message;
    \n-
    629
    \n-
    630 MPI_Get_address( &(message.publish), displacement);
    \n-
    631 MPI_Get_address( &(message.pairs), displacement+1);
    \n-
    632
    \n-
    633 // Make the displacement relative
    \n-
    634 MPI_Get_address(&message, &base);
    \n-
    635 displacement[0] -= base;
    \n-
    636 displacement[1] -= base;
    \n-
    637
    \n-
    638 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);
    \n-
    639 MPI_Type_commit(&datatype_);
    \n-
    640 }
    \n-
    641
    \n-
    642 template<typename T>
    \n-
    643 void IndicesSyncer<T>::calculateMessageSizes()
    \n-
    644 {
    \n-
    645 auto iEnd = indexSet_.end();
    \n-
    646 auto collIter = remoteIndices_.template iterator<true>();
    \n-
    647
    \n-
    648 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n-
    649 collIter.advance(index->global(), index->local().attribute());
    \n-
    650 if(collIter.empty())
    \n-
    651 break;
    \n-
    652 int knownRemote=0;
    \n-
    653 auto end = collIter.end();
    \n-
    654
    \n-
    655 // Count the remote indices we know.
    \n-
    656 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n-
    657 ++knownRemote;
    \n-
    658 }
    \n-
    659
    \n-
    660 if(knownRemote>0) {
    \n-
    661 Dune::dverb<<rank_<<": publishing "<<knownRemote<<" for index "<<index->global()<< " for processes ";
    \n-
    662
    \n-
    663 // Update MessageInformation
    \n-
    664 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n-
    665 ++(infoSend_[valid.process()].publish);
    \n-
    666 (infoSend_[valid.process()].pairs) += knownRemote;
    \n-
    667 Dune::dverb<<valid.process()<<" ";
    \n-
    668 Dune::dverb<<"(publish="<<infoSend_[valid.process()].publish<<", pairs="<<infoSend_[valid.process()].pairs
    \n-
    669 <<") ";
    \n-
    670 }
    \n-
    671 Dune::dverb<<std::endl;
    \n-
    672 }
    \n-
    673 }
    \n-
    674
    \n-
    675 const auto end = infoSend_.end();
    \n-
    676
    \n-
    677 // Now determine the buffersizes needed for each neighbour using MPI_Pack_size
    \n-
    678 MessageInformation dummy;
    \n-
    679
    \n-
    680 auto messageIter= infoSend_.begin();
    \n-
    681 const auto rend = remoteIndices_.end();
    \n-
    682 int neighbour=0;
    \n-
    683
    \n-
    684 for(auto remote = remoteIndices_.begin(); remote != rend; ++remote, ++neighbour) {
    \n-
    685 MessageInformation* message;
    \n-
    686 MessageInformation recv;
    \n-
    687
    \n-
    688 if(messageIter != end && messageIter->first==remote->first) {
    \n-
    689 // We want to send message information to that process
    \n-
    690 message = const_cast<MessageInformation*>(&(messageIter->second));
    \n-
    691 ++messageIter;
    \n-
    692 }else
    \n-
    693 // We do not want to send information but the other process might.
    \n-
    694 message = &dummy;
    \n-
    695
    \n-
    696 sendBufferSizes_[neighbour]=0;
    \n-
    697 int tsize;
    \n-
    698 // The number of indices published
    \n-
    699 MPI_Pack_size(1, MPI_INT,remoteIndices_.communicator(), &tsize);
    \n-
    700 sendBufferSizes_[neighbour] += tsize;
    \n-
    701
    \n-
    702 for(int i=0; i < message->publish; ++i) {
    \n-
    703 // The global index
    \n-
    704 MPI_Pack_size(1, MPITraits<GlobalIndex>::getType(), remoteIndices_.communicator(), &tsize);
    \n-
    705 sendBufferSizes_[neighbour] += tsize;
    \n-
    706 // The attribute in the local index
    \n-
    707 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n-
    708 sendBufferSizes_[neighbour] += tsize;
    \n-
    709 // The number of corresponding remote indices
    \n-
    710 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n-
    711 sendBufferSizes_[neighbour] += tsize;
    \n-
    712 }
    \n-
    713 for(int i=0; i < message->pairs; ++i) {
    \n-
    714 // The process of the remote index
    \n-
    715 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n-
    716 sendBufferSizes_[neighbour] += tsize;
    \n-
    717 // The attribute of the remote index
    \n-
    718 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n-
    719 sendBufferSizes_[neighbour] += tsize;
    \n-
    720 }
    \n-
    721
    \n-
    722 Dune::dverb<<rank_<<": Buffer (neighbour="<<remote->first<<") size is "<< sendBufferSizes_[neighbour]<<" for publish="<<message->publish<<" pairs="<<message->pairs<<std::endl;
    \n-
    723 }
    \n-
    724
    \n-
    725 }
    \n-
    726
    \n-
    727 template<typename T>
    \n-
    \n-\n-
    729 {
    \n-
    730 DefaultNumberer numberer;
    \n-
    731 sync(numberer);
    \n-
    732 }
    \n+
    55
    \n+
    56 template<class V, class = std::enable_if_t<Simd::lanes<V>() == 1> >
    \n+
    \n+
    57 Simd::Scalar<V> io(const V &v)
    \n+
    58 {
    \n+
    59 return Simd::lane(0, v);
    \n+
    60 }
    \n+
    \n+
    61
    \n+
    62 }
    \n+
    \n+
    63
    \n+
    64 namespace Simd {
    \n+
    65
    \n+
    82
    \n+
    89 template<class V>
    \n+
    \n+
    90 auto vio(const V &v)
    \n+
    91 {
    \n+
    92 return SimdImpl::Inserter<V>{ v };
    \n+
    93 }
    \n
    \n-
    733
    \n-
    734 template<typename T>
    \n-
    735 template<typename T1>
    \n-
    \n-
    736 void IndicesSyncer<T>::sync(T1& numberer)
    \n-
    737 {
    \n-
    738 // The pointers to the local indices in the remote indices
    \n-
    739 // will become invalid due to the resorting of the index set.
    \n-
    740 // Therefore store the corresponding global indices.
    \n-
    741 // Mark all indices as not added
    \n-
    742 const auto end = remoteIndices_.end();
    \n-
    743
    \n-
    744 // Number of neighbours might change during the syncing.
    \n-
    745 // save the old neighbours
    \n-
    746 std::size_t noOldNeighbours = remoteIndices_.neighbours();
    \n-
    747 int* oldNeighbours = new int[noOldNeighbours];
    \n-
    748 sendBufferSizes_ = new std::size_t[noOldNeighbours];
    \n-
    749 std::size_t neighbourI = 0;
    \n-
    750
    \n-
    751 for(auto remote = remoteIndices_.begin(); remote != end; ++remote, ++neighbourI) {
    \n-
    752 oldNeighbours[neighbourI] = remote->first;
    \n-
    753
    \n-
    754 // Make sure we only have one remote index list.
    \n-
    755 assert(remote->second.first==remote->second.second);
    \n-
    756
    \n-
    757 RemoteIndexList& rList = *(remote->second.first);
    \n-
    758
    \n-
    759 // Store the corresponding global indices.
    \n-
    760 GlobalIndexList& global = globalMap_[remote->first];
    \n-
    761 BoolList& added = oldMap_[remote->first];
    \n-
    762 auto riEnd = rList.end();
    \n-
    763
    \n-
    764 for(auto index = rList.begin();
    \n-
    765 index != riEnd; ++index) {
    \n-
    766 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n-
    767 index->localIndexPair().local().attribute()));
    \n-
    768 added.push_back(true);
    \n-
    769 }
    \n-
    770
    \n-
    771 Iterators iterators(rList, global, added);
    \n-
    772 iteratorsMap_.insert(std::make_pair(remote->first, iterators));
    \n-
    773 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));
    \n-
    774 }
    \n-
    775
    \n-
    776 // Exchange indices with each neighbour
    \n-
    777 calculateMessageSizes();
    \n-
    778
    \n-
    779 // Allocate the buffers
    \n-
    780 receiveBufferSize_=1;
    \n-
    781 sendBuffers_ = new char*[noOldNeighbours];
    \n-
    782
    \n-
    783 for(std::size_t i=0; i<noOldNeighbours; ++i) {
    \n-
    784 sendBuffers_[i] = new char[sendBufferSizes_[i]];
    \n-
    785 receiveBufferSize_ = std::max(receiveBufferSize_, static_cast<int>(sendBufferSizes_[i]));
    \n-
    786 }
    \n-
    787
    \n-
    788 receiveBuffer_=new char[receiveBufferSize_];
    \n-
    789
    \n-
    790 indexSet_.beginResize();
    \n-
    791
    \n-
    792 Dune::dverb<<rank_<<": Neighbours: ";
    \n-
    793
    \n-
    794 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n-
    795 Dune::dverb<<oldNeighbours[i]<<" ";
    \n-
    796
    \n-
    797 Dune::dverb<<std::endl;
    \n-
    798
    \n-
    799 MPI_Request* requests = new MPI_Request[noOldNeighbours];
    \n-
    800 MPI_Status* statuses = new MPI_Status[noOldNeighbours];
    \n-
    801
    \n-
    802 // Pack Message data and start the sends
    \n-
    803 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n-
    804 packAndSend(oldNeighbours[i], sendBuffers_[i], sendBufferSizes_[i], requests[i]);
    \n-
    805
    \n-
    806 // Probe for incoming messages, receive and unpack them
    \n-
    807 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n-
    808 recvAndUnpack(numberer);
    \n-
    809 // }else{
    \n-
    810 // recvAndUnpack(oldNeighbours[i], numberer);
    \n-
    811 // packAndSend(oldNeighbours[i]);
    \n-
    812 // }
    \n-
    813 // }
    \n-
    814
    \n-
    815 delete[] receiveBuffer_;
    \n-
    816
    \n-
    817 // Wait for the completion of the sends
    \n-
    818 // Wait for completion of sends
    \n-
    819 if(MPI_SUCCESS!=MPI_Waitall(noOldNeighbours, requests, statuses)) {
    \n-
    820 std::cerr<<": MPI_Error occurred while sending message"<<std::endl;
    \n-
    821 for(std::size_t i=0; i< noOldNeighbours; i++)
    \n-
    822 if(MPI_SUCCESS!=statuses[i].MPI_ERROR)
    \n-
    823 std::cerr<<"Destination "<<statuses[i].MPI_SOURCE<<" error code: "<<statuses[i].MPI_ERROR<<std::endl;
    \n-
    824 }
    \n-
    825
    \n-
    826 delete[] statuses;
    \n-
    827 delete[] requests;
    \n-
    828
    \n-
    829 for(std::size_t i=0; i<noOldNeighbours; ++i)
    \n-
    830 delete[] sendBuffers_[i];
    \n-
    831
    \n-
    832 delete[] sendBuffers_;
    \n-
    833 delete[] sendBufferSizes_;
    \n-
    834
    \n-
    835 // No need for the iterator tuples any more
    \n-
    836 iteratorsMap_.clear();
    \n-
    837
    \n-
    838 indexSet_.endResize();
    \n-
    839
    \n-
    840 delete[] oldNeighbours;
    \n-
    841
    \n-
    842 repairLocalIndexPointers(globalMap_, remoteIndices_, indexSet_);
    \n-
    843
    \n-
    844 oldMap_.clear();
    \n-
    845 globalMap_.clear();
    \n-
    846
    \n-
    847 // update the sequence number
    \n-
    848 remoteIndices_.sourceSeqNo_ = remoteIndices_.destSeqNo_ = indexSet_.seqNo();
    \n-
    849 }
    \n+
    94
    \n+
    96
    \n+
    105 template<class V>
    \n+
    \n+
    106 auto io(const V &v)
    \n+
    107 {
    \n+
    108 return SimdImpl::io(v);
    \n+
    109 }
    \n
    \n-
    850
    \n-
    851 template<typename T>
    \n-
    852 void IndicesSyncer<T>::packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& request)
    \n-
    853 {
    \n-
    854 auto iEnd = indexSet_.end();
    \n-
    855 int bpos = 0;
    \n-
    856 int published = 0;
    \n-
    857 int pairs = 0;
    \n-
    858
    \n-
    859 assert(checkReset());
    \n-
    860
    \n-
    861 // Pack the number of indices we publish
    \n-
    862 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize, &bpos,
    \n-
    863 remoteIndices_.communicator());
    \n-
    864
    \n-
    865 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n-
    866 // Search for corresponding remote indices in all iterator tuples
    \n-
    867 auto iteratorsEnd = iteratorsMap_.end();
    \n-
    868
    \n-
    869 // advance all iterators to a position with global index >= index->global()
    \n-
    870 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators) {
    \n-
    871 while(iterators->second.isNotAtEnd() &&
    \n-
    872 iterators->second.globalIndexPair().first < index->global())
    \n-
    873 ++(iterators->second);
    \n-
    874 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair().first >= index->global());
    \n-
    875 }
    \n-
    876
    \n-
    877 // Add all remote indices positioned at global which were already present before calling sync
    \n-
    878 // to the message.
    \n-
    879 // Count how many remote indices we will send
    \n-
    880 int indices = 0;
    \n-
    881 bool knownRemote = false; // Is the remote process supposed to know this index?
    \n-
    882
    \n-
    883 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n-
    884 {
    \n-
    885 std::pair<GlobalIndex,Attribute> p;
    \n-
    886 if (iterators->second.isNotAtEnd())
    \n-
    887 {
    \n-
    888 p = iterators->second.globalIndexPair();
    \n-
    889 }
    \n-
    890
    \n-
    891 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n-
    892 && iterators->second.globalIndexPair().first == index->global()) {
    \n-
    893 indices++;
    \n-
    894 if(destination == iterators->first)
    \n-
    895 knownRemote = true;
    \n-
    896 }
    \n-
    897 }
    \n-
    898
    \n-
    899 if(!knownRemote)
    \n-
    900 // We do not need to send any indices
    \n-
    901 continue;
    \n-
    902
    \n-
    903 Dune::dverb<<rank_<<": sending "<<indices<<" for index "<<index->global()<<" to "<<destination<<std::endl;
    \n-
    904
    \n-
    905
    \n-
    906 // Pack the global index, the attribute and the number
    \n-
    907 MPI_Pack(const_cast<GlobalIndex*>(&(index->global())), 1, MPITraits<GlobalIndex>::getType(), buffer, bufferSize, &bpos,
    \n-
    908 remoteIndices_.communicator());
    \n-
    909
    \n-
    910 char attr = index->local().attribute();
    \n-
    911 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n-
    912 remoteIndices_.communicator());
    \n-
    913
    \n-
    914 // Pack the number of remote indices we send.
    \n-
    915 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n-
    916 remoteIndices_.communicator());
    \n-
    917
    \n-
    918 // Pack the information about the remote indices
    \n-
    919 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n-
    920 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n-
    921 && iterators->second.globalIndexPair().first == index->global()) {
    \n-
    922 int process = iterators->first;
    \n-
    923
    \n-
    924 ++pairs;
    \n-
    925 assert(pairs <= infoSend_[destination].pairs);
    \n-
    926 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n-
    927 remoteIndices_.communicator());
    \n-
    928 char attr2 = iterators->second.remoteIndex().attribute();
    \n-
    929
    \n-
    930 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n-
    931 remoteIndices_.communicator());
    \n-
    932 --indices;
    \n-
    933 }
    \n-
    934 assert(indices==0);
    \n-
    935 ++published;
    \n-
    936 Dune::dvverb<<" (publish="<<published<<", pairs="<<pairs<<")"<<std::endl;
    \n-
    937 assert(published <= infoSend_[destination].publish);
    \n-
    938 }
    \n-
    939
    \n-
    940 // Make sure we send all expected entries
    \n-
    941 assert(published == infoSend_[destination].publish);
    \n-
    942 assert(pairs == infoSend_[destination].pairs);
    \n-
    943 resetIteratorsMap();
    \n-
    944
    \n-
    945 Dune::dverb << rank_<<": Sending message of "<<bpos<<" bytes to "<<destination<<std::endl;
    \n-
    946
    \n-
    947 MPI_Issend(buffer, bpos, MPI_PACKED, destination, 345, remoteIndices_.communicator(),&request);
    \n-
    948 }
    \n-
    949
    \n-
    950 template<typename T>
    \n-
    951 inline void IndicesSyncer<T>::insertIntoRemoteIndexList(int process,
    \n-
    952 const std::pair<GlobalIndex,Attribute>& globalPair,
    \n-
    953 char attribute)
    \n-
    954 {
    \n-
    955 Dune::dverb<<"Inserting from "<<process<<" "<<globalPair.first<<", "<<
    \n-
    956 globalPair.second<<" "<<attribute<<std::endl;
    \n-
    957
    \n-
    958 resetIteratorsMap();
    \n-
    959
    \n-
    960 // There might be cases where there no remote indices for that process yet
    \n-
    961 typename IteratorsMap::iterator found = iteratorsMap_.find(process);
    \n-
    962
    \n-
    963 if( found == iteratorsMap_.end() ) {
    \n-
    964 Dune::dverb<<"Discovered new neighbour "<<process<<std::endl;
    \n-
    965 RemoteIndexList* rlist = new RemoteIndexList();
    \n-
    966 remoteIndices_.remoteIndices_.insert(std::make_pair(process,std::make_pair(rlist,rlist)));
    \n-
    967 Iterators iterators = Iterators(*rlist, globalMap_[process], oldMap_[process]);
    \n-
    968 found = iteratorsMap_.insert(std::make_pair(process, iterators)).first;
    \n-
    969 }
    \n-
    970
    \n-
    971 Iterators& iterators = found->second;
    \n-
    972
    \n-
    973 // Search for the remote index
    \n-
    974 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {
    \n-
    975 // Increment all iterators
    \n-
    976 ++iterators;
    \n-
    977
    \n-
    978 }
    \n-
    979
    \n-
    980 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {
    \n-
    981 // The entry is not yet known
    \n-
    982 // Insert in the list and do not change the first iterator.
    \n-
    983 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n-
    984 return;
    \n-
    985 }
    \n-
    986
    \n-
    987 // Global indices match
    \n-
    988 bool indexIsThere=false;
    \n-
    989 for(Iterators tmpIterators = iterators;
    \n-
    990 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;
    \n-
    991 ++tmpIterators)
    \n-
    992 //entry already exists with the same attribute
    \n-
    993 if(tmpIterators.globalIndexPair().second == attribute) {
    \n-
    994 indexIsThere=true;
    \n-
    995 break;
    \n-
    996 }
    \n-
    997
    \n-
    998 if(!indexIsThere)
    \n-
    999 // The entry is not yet known
    \n-
    1000 // Insert in the list and do not change the first iterator.
    \n-
    1001 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n-
    1002 }
    \n-
    1003
    \n-
    1004 template<typename T>
    \n-
    1005 template<typename T1>
    \n-
    1006 void IndicesSyncer<T>::recvAndUnpack(T1& numberer)
    \n-
    1007 {
    \n-
    1008 const ParallelIndexSet& constIndexSet = indexSet_;
    \n-
    1009 auto iEnd = constIndexSet.end();
    \n-
    1010 auto index = constIndexSet.begin();
    \n-
    1011 int bpos = 0;
    \n-
    1012 int publish;
    \n-
    1013
    \n-
    1014 assert(checkReset());
    \n-
    1015
    \n-
    1016 MPI_Status status;
    \n-
    1017
    \n-
    1018 // We have to determine the message size and source before the receive
    \n-
    1019 MPI_Probe(MPI_ANY_SOURCE, 345, remoteIndices_.communicator(), &status);
    \n-
    1020
    \n-
    1021 int source=status.MPI_SOURCE;
    \n-
    1022 int count;
    \n-
    1023 MPI_Get_count(&status, MPI_PACKED, &count);
    \n-
    1024
    \n-
    1025 Dune::dvverb<<rank_<<": Receiving message from "<< source<<" with "<<count<<" bytes"<<std::endl;
    \n-
    1026
    \n-
    1027 if(count>receiveBufferSize_) {
    \n-
    1028 receiveBufferSize_=count;
    \n-
    1029 delete[] receiveBuffer_;
    \n-
    1030 receiveBuffer_ = new char[receiveBufferSize_];
    \n-
    1031 }
    \n-
    1032
    \n-
    1033 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345, remoteIndices_.communicator(), &status);
    \n-
    1034
    \n-
    1035 // How many global entries were published?
    \n-
    1036 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT, remoteIndices_.communicator());
    \n-
    1037
    \n-
    1038 // Now unpack the remote indices and add them.
    \n-
    1039 while(publish>0) {
    \n-
    1040
    \n-
    1041 // Unpack information about the local index on the source process
    \n-
    1042 GlobalIndex global; // global index of the current entry
    \n-
    1043 char sourceAttribute; // Attribute on the source process
    \n-
    1044 int pairs;
    \n-
    1045
    \n-
    1046 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1, MPITraits<GlobalIndex>::getType(),
    \n-
    1047 remoteIndices_.communicator());
    \n-
    1048 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,
    \n-
    1049 remoteIndices_.communicator());
    \n-
    1050 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,
    \n-
    1051 remoteIndices_.communicator());
    \n-
    1052
    \n-
    1053 // Insert the entry on the remote process to our
    \n-
    1054 // remote index list
    \n-
    1055 SLList<std::pair<int,Attribute> > sourceAttributeList;
    \n-
    1056 sourceAttributeList.push_back(std::make_pair(source,Attribute(sourceAttribute)));
    \n-
    1057#ifndef NDEBUG
    \n-
    1058 bool foundSelf = false;
    \n-
    1059#endif
    \n-
    1060 Attribute myAttribute=Attribute();
    \n-
    1061
    \n-
    1062 // Unpack the remote indices
    \n-
    1063 for(; pairs>0; --pairs) {
    \n-
    1064 // Unpack the process id that knows the index
    \n-
    1065 int process;
    \n-
    1066 char attribute;
    \n-
    1067 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,
    \n-
    1068 remoteIndices_.communicator());
    \n-
    1069 // Unpack the attribute
    \n-
    1070 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,
    \n-
    1071 remoteIndices_.communicator());
    \n-
    1072
    \n-
    1073 if(process==rank_) {
    \n-
    1074#ifndef NDEBUG
    \n-
    1075 foundSelf=true;
    \n-
    1076#endif
    \n-
    1077 myAttribute=Attribute(attribute);
    \n-
    1078 // Now we know the local attribute of the global index
    \n-
    1079 //Only add the index if it is unknown.
    \n-
    1080 // Do we know that global index already?
    \n-
    1081 auto pos = std::lower_bound(index, iEnd, IndexPair(global));
    \n-
    1082
    \n-
    1083 if(pos == iEnd || pos->global() != global) {
    \n-
    1084 // no entry with this global index
    \n-
    1085 indexSet_.add(global,
    \n-
    1086 ParallelLocalIndex<Attribute>(numberer(global),
    \n-
    1087 myAttribute, true));
    \n-
    1088 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n-
    1089 continue;
    \n-
    1090 }
    \n-
    1091
    \n-
    1092 // because of above the global indices match. Add only if the attribute is different
    \n-
    1093 bool indexIsThere = false;
    \n-
    1094 index=pos;
    \n-
    1095
    \n-
    1096 for(; pos->global()==global; ++pos)
    \n-
    1097 if(pos->local().attribute() == myAttribute) {
    \n-
    1098 Dune::dvverb<<"found "<<global<<" "<<myAttribute<<std::endl;
    \n-
    1099 indexIsThere = true;
    \n-
    1100 break;
    \n-
    1101 }
    \n-
    1102
    \n-
    1103 if(!indexIsThere) {
    \n-
    1104 indexSet_.add(global,
    \n-
    1105 ParallelLocalIndex<Attribute>(numberer(global),
    \n-
    1106 myAttribute, true));
    \n-
    1107 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n-
    1108 }
    \n-
    1109
    \n-
    1110 }else{
    \n-
    1111 sourceAttributeList.push_back(std::make_pair(process,Attribute(attribute)));
    \n-
    1112 }
    \n-
    1113 }
    \n-
    1114 assert(foundSelf);
    \n-
    1115 // Insert remote indices
    \n-
    1116 typedef typename SLList<std::pair<int,Attribute> >::const_iterator Iter;
    \n-
    1117 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();
    \n-
    1118 i!=end; ++i)
    \n-
    1119 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),
    \n-
    1120 i->second);
    \n-
    1121 --publish;
    \n-
    1122 }
    \n-
    1123
    \n-
    1124 resetIteratorsMap();
    \n-
    1125 }
    \n-
    1126
    \n-
    1127 template<typename T>
    \n-
    1128 void IndicesSyncer<T>::resetIteratorsMap(){
    \n-
    1129
    \n-
    1130 // Reset iterators in all tuples.
    \n-
    1131 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n-
    1132 auto iterators = iteratorsMap_.begin();
    \n-
    1133 auto global = globalMap_.begin();
    \n-
    1134 auto added = oldMap_.begin();
    \n-
    1135
    \n-
    1136 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n-
    1137 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n-
    1138 iterators->second.reset(*(remote->second.first), global->second, added->second);
    \n-
    1139 }
    \n-
    1140 }
    \n-
    1141
    \n-
    1142 template<typename T>
    \n-
    1143 bool IndicesSyncer<T>::checkReset(const Iterators& iterators, RemoteIndexList& rList, GlobalIndexList& gList,
    \n-
    1144 BoolList& bList){
    \n-
    1145
    \n-
    1146 if(std::get<0>(iterators.iterators_) != rList.begin())
    \n-
    1147 return false;
    \n-
    1148 if(std::get<1>(iterators.iterators_) != gList.begin())
    \n-
    1149 return false;
    \n-
    1150 if(std::get<2>(iterators.iterators_) != bList.begin())
    \n-
    1151 return false;
    \n-
    1152 return true;
    \n-
    1153 }
    \n-
    1154
    \n-
    1155
    \n-
    1156 template<typename T>
    \n-
    1157 bool IndicesSyncer<T>::checkReset(){
    \n-
    1158
    \n-
    1159 // Reset iterators in all tuples.
    \n-
    1160 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n-
    1161 auto iterators = iteratorsMap_.begin();
    \n-
    1162 auto global = globalMap_.begin();
    \n-
    1163 auto added = oldMap_.begin();
    \n-
    1164 bool ret = true;
    \n-
    1165
    \n-
    1166 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n-
    1167 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n-
    1168 if(!checkReset(iterators->second, *(remote->second.first), global->second,
    \n-
    1169 added->second))
    \n-
    1170 ret=false;
    \n-
    1171 }
    \n-
    1172 return ret;
    \n-
    1173 }
    \n-
    1174}
    \n-
    1175
    \n-
    1176#endif
    \n-
    1177#endif
    \n-
    Standard Dune debug streams.
    \n-
    Classes describing a distributed indexset.
    \n-
    Provides a map between global and local indices.
    \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:637
    \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:237
    \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:259
    \n-
    Iterators()
    Default constructor.
    Definition indicessyncer.hh:555
    \n-
    Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
    Type of the remote indices.
    Definition indicessyncer.hh:59
    \n-
    bool isOld() const
    Was this entry already in the remote index list before the sync process?
    Definition indicessyncer.hh:592
    \n-
    int publish
    The number of indices we publish for the other process.
    Definition indicessyncer.hh:126
    \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:487
    \n-
    bool isAtEnd() const
    Are we at the end of the list?
    Definition indicessyncer.hh:614
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    Type of the global index used in the index set.
    Definition indicessyncer.hh:51
    \n-
    int pairs
    The number of pairs (attribute and process number) we publish to the neighbour process.
    Definition indicessyncer.hh:131
    \n-
    Attribute & attribute() const
    \n-
    Iterators & operator++()
    Increment all iteraors.
    Definition indicessyncer.hh:560
    \n-
    ParallelIndexSet::LocalIndex::Attribute Attribute
    Type of the attribute used in the index set.
    Definition indicessyncer.hh:54
    \n-
    std::pair< GlobalIndex, Attribute > & globalIndexPair() const
    Get the global index of the remote index at current position.
    Definition indicessyncer.hh:586
    \n-
    IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)
    Constructor.
    Definition indicessyncer.hh:536
    \n-
    void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices, BoolList &booleans)
    Reset all the underlying iterators.
    Definition indicessyncer.hh:598
    \n-
    std::size_t operator()(const GlobalIndex &global)
    Provide the local index, always std::numeric_limits<size_t>::max()
    Definition indicessyncer.hh:145
    \n-
    T ParallelIndexSet
    The type of the index set.
    Definition indicessyncer.hh:45
    \n-
    bool isNotAtEnd() const
    Are we not at the end of the list?
    Definition indicessyncer.hh:608
    \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:461
    \n-
    void sync()
    Sync the index set.
    Definition indicessyncer.hh:728
    \n-
    int seqNo() const
    Get the internal sequence number.
    \n-
    ParallelIndexSet::IndexPair IndexPair
    The type of the index pair.
    Definition indicessyncer.hh:48
    \n-
    RemoteIndex & remoteIndex() const
    Get the remote index at current position.
    Definition indicessyncer.hh:579
    \n-
    MessageInformation()
    Definition indicessyncer.hh:122
    \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:569
    \n-
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:95
    \n-
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:116
    \n+
    110
    \n+
    112
    \n+
    114
    \n+
    115 } // namespace Simd
    \n+
    116} // namespace Dune
    \n+
    117
    \n+
    118#endif // DUNE_COMMON_SIMD_IO_HH
    \n+
    Traits for type conversions and type information.
    \n+
    Utilities for reduction like operations on ranges.
    \n+
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n+
    constexpr AutonomousValue< T > autoCopy(T &&v)
    Autonomous copy of an expression's value for use in auto type deduction.
    Definition typetraits.hh:642
    \n+
    auto io(const V &v)
    construct a stream inserter
    Definition io.hh:106
    \n+
    auto vio(const V &v)
    construct a stream inserter
    Definition io.hh:90
    \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+
    typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
    Element type of some SIMD type.
    Definition simd/interface.hh:235
    \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:41
    \n-
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:49
    \n-
    The indices present on remote processes.
    Definition remoteindices.hh:189
    \n-
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1696
    \n-
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1529
    \n-
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1446
    \n-
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:237
    \n-
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1522
    \n-
    Information about an index residing on another processor.
    Definition remoteindices.hh:73
    \n-
    A mutable iterator for the SLList.
    Definition sllist.hh:271
    \n-
    A single linked list.
    Definition sllist.hh:44
    \n+
    Inserter< V > io(const V &v)
    Definition io.hh:51
    \n+
    Definition io.hh:28
    \n+
    Inserter(const T &value)
    Definition io.hh:32
    \n+
    friend Stream & operator<<(Stream &out, const Inserter &ins)
    Definition io.hh:37
    \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,1204 +1,135 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\bd\n+io.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_INDICESSYNCER_HH\n-6#define DUNE_INDICESSYNCER_HH\n-7\n-8#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n-9#include \"_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\"\n-10#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-11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\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#if HAVE_MPI\n-21namespace _\bD_\bu_\bn_\be\n-22{\n-39 template\n-_\b4_\b0 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3#ifndef DUNE_COMMON_SIMD_IO_HH\n+4#define DUNE_COMMON_SIMD_IO_HH\n+5\n+16#include \n+17#include \n+18\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_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\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+_\b2_\b5 namespace SimdImpl {\n+26\n+27 template\n+_\b2_\b8 class _\bI_\bn_\bs_\be_\br_\bt_\be_\br {\n+29 T value_;\n+30\n+31 public:\n+_\b3_\b2 _\bI_\bn_\bs_\be_\br_\bt_\be_\br(const T &value) : value_(value) {}\n+33\n+34 template::value> >\n+_\b3_\b7 friend Stream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(Stream &out, const _\bI_\bn_\bs_\be_\br_\bt_\be_\br &ins)\n+38 {\n+39 const char *sep = \"<\";\n+40 for(auto l : _\br_\ba_\bn_\bg_\be(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(ins.value_)))\n 41 {\n-42 public:\n-43\n-_\b4_\b5 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-46\n-_\b4_\b8 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+42 out << sep << _\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, ins.value_));\n+43 sep = \", \";\n+44 }\n+45 out << '>';\n+46 return out;\n+47 }\n+48 };\n 49\n-_\b5_\b1 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-52\n-_\b5_\b4 typedef typename ParallelIndexSet::LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+50 template() != 1> >\n+_\b5_\b1 _\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b<_\bV_\b> _\bi_\bo(const V &v)\n+52 {\n+53 return { v };\n+54 }\n 55\n-_\b5_\b9 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-60\n-70 _\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-71 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices);\n-72\n-82 void _\bs_\by_\bn_\bc();\n-83\n-94 template\n-95 void _\bs_\by_\bn_\bc(T1& numberer);\n+56 template() == 1> >\n+_\b5_\b7 _\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b> _\bi_\bo(const V &v)\n+58 {\n+59 return _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(0, v);\n+60 }\n+61\n+62 }\n+63\n+64 namespace Simd {\n+65\n+82\n+89 template\n+_\b9_\b0 auto _\bv_\bi_\bo(const V &v)\n+91 {\n+92 return _\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b<_\bV_\b>{ v };\n+93 }\n+94\n 96\n-97 private:\n-98\n-100 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet_;\n-101\n-103 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices_;\n-104\n-106 char** sendBuffers_;\n-107\n-109 char* receiveBuffer_;\n+105 template\n+_\b1_\b0_\b6 auto _\bi_\bo(const V &v)\n+107 {\n+108 return _\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo(v);\n+109 }\n 110\n-112 std::size_t* sendBufferSizes_;\n-113\n-115 int receiveBufferSize_; // int because of MPI\n-116\n-120 struct MessageInformation\n-121 {\n-_\b1_\b2_\b2 _\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n-123 : _\bp_\bu_\bb_\bl_\bi_\bs_\bh(), _\bp_\ba_\bi_\br_\bs()\n-124 {}\n-_\b1_\b2_\b6 int _\bp_\bu_\bb_\bl_\bi_\bs_\bh;\n-_\b1_\b3_\b1 int _\bp_\ba_\bi_\br_\bs;\n-132 };\n-133\n-137 class DefaultNumberer\n-138 {\n-139 public:\n-_\b1_\b4_\b5 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-146 {\n-147 return std::numeric_limits::max();\n-148 }\n-149 };\n-150\n-152 MPI_Datatype datatype_;\n-153\n-155 int rank_;\n-156\n-161 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-162\n-164 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-165\n-169 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-170 GlobalIndexIterator;\n-171\n-173 typedef std::map GlobalIndicesMap;\n-174\n-183 GlobalIndicesMap globalMap_;\n-184\n-188 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-189\n-193 typedef typename _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br BoolIterator;\n-194\n-196 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-197\n-199 typedef std::map BoolMap;\n-200\n-205 BoolMap oldMap_;\n-206\n-208 std::map infoSend_;\n-209\n-211 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-212\n-214 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-215\n-217 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-218\n-220 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-221\n-223 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-224\n-226 typedef std::\n-tuple IteratorTuple;\n-228\n-236 class Iterators\n-237 {\n-238 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-239 public:\n-249 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,\n-250 BoolList& booleans);\n-251\n-255 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs();\n-256\n-260 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-261\n-267 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index,\n-268 const std::pair& global);\n-269\n-274 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx() const;\n-275\n-280 std::pair& _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const;\n-281\n-_\b2_\b8_\b2 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n-283\n-289 bool _\bi_\bs_\bO_\bl_\bd() const;\n-290\n-300 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-301 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans);\n-302\n-308 bool _\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd() const;\n-309\n-315 bool _\bi_\bs_\bA_\bt_\bE_\bn_\bd() const;\n-316\n-317 private:\n-327 IteratorTuple iterators_;\n-328 };\n-329\n-331 typedef std::map IteratorsMap;\n-332\n-344 IteratorsMap iteratorsMap_;\n-345\n-347 void calculateMessageSizes();\n-348\n-356 void packAndSend(int destination, char* buffer, std::size_t bufferSize,\n-MPI_Request& req);\n-357\n-362 template\n-363 void recvAndUnpack(T1& numberer);\n-364\n-368 void registerMessageDatatype();\n-369\n-373 void insertIntoRemoteIndexList(int process,\n-374 const std::pair& global,\n-375 char attribute);\n-376\n-380 void resetIteratorsMap();\n-381\n-386 bool checkReset();\n-387\n-396 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-397 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& bList);\n-398 };\n-399\n-400 template\n-_\b4_\b0_\b1 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n-402 const std::pair& i2)\n-403 {\n-404 return i1.global() < i2.first ||\n-405 (i1.global() == i2.first && i1.local().attribute()\n-_\b4_\b0_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const std::pair& i1,\n-410 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i2)\n-411 {\n-412 return i1.first < i2.global() ||\n-413 (i1.first == i2.global() && i1.second\n-_\b4_\b1_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n-418 const std::pair& i2)\n-419 {\n-420 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n-421 }\n-422\n-423 template\n-_\b4_\b2_\b4 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n-425 const std::pair& i2)\n-426 {\n-427 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n-428 }\n-429\n-430 template\n-_\b4_\b3_\b1 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const std::pair& i2,\n-432 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n-433 {\n-434 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n-435 }\n-436\n-437 template\n-_\b4_\b3_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const std::pair& i2,\n-439 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n-440 {\n-441 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n-442 }\n-443\n-460 template\n-_\b4_\b6_\b1 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-462 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices)\n-463 {\n-464 for(auto remote = remoteIndices._\bb_\be_\bg_\bi_\bn(), end =remoteIndices._\be_\bn_\bd(); remote\n-!= end; ++remote) {\n-465 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-466 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-467 GlobalIndexList& global = globalMap[remote->first];\n-468 RemoteIndexList& rList = *(remote->second.first);\n-469\n-470 for(auto index = rList.begin(), riEnd = rList.end();\n-471 index != riEnd; ++index) {\n-472 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n-473 index->localIndexPair().local().attribute()));\n-474 }\n-475 }\n-476 }\n-477\n-486 template\n-_\b4_\b8_\b7 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-490 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices,\n-491 const T& indexSet)\n-492 {\n-493 assert(globalMap.size()==static_cast(remoteIndices._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-()));\n-494 // Repair pointers to index set in remote indices.\n-495 auto global = globalMap.begin();\n-496 auto end = remoteIndices.remoteIndices_.end();\n-497\n-498 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end;\n-++remote, ++global) {\n-499 assert(remote->first==global->first);\n-500 assert(remote->second.first->size() == global->second.size());\n-501\n-502 auto riEnd = remote->second.first->end();\n-503 auto rIndex = remote->second.first->begin();\n-504 auto gIndex = global->second.begin();\n-505 auto index = indexSet.begin();\n-506\n-507 assert(rIndex==riEnd || gIndex != global->second.end());\n-508 while(rIndex != riEnd) {\n-509 // Search for the index in the set.\n-510 assert(gIndex != global->second.end());\n-511\n-512 while(!(index->global() == gIndex->first\n-513 && index->local().attribute() == gIndex->second)) {\n-514 ++index;\n-515 // this is only needed for ALU, where there may exist\n-516 // more entries with the same global index in the remote index set\n-517 // than in the index set\n-518 if (index->global() > gIndex->first) {\n-519 index=indexSet.begin();\n-520 }\n-521 }\n-522\n-523 assert(index != indexSet.end() && *index == *gIndex);\n-524\n-525 rIndex->localIndex_ = &(*index);\n-526 ++index;\n-527 ++rIndex;\n-528 ++gIndex;\n-529 }\n-530 }\n-531 remoteIndices.sourceSeqNo_ = remoteIndices.source_->_\bs_\be_\bq_\bN_\bo();\n-532 remoteIndices.destSeqNo_ = remoteIndices.target_->_\bs_\be_\bq_\bN_\bo();\n-533 }\n-534\n-535 template\n-_\b5_\b3_\b6 _\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-537 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices)\n-538 : indexSet_(indexSet), remoteIndices_(remoteIndices)\n-539 {\n-540 // index sets must match.\n-541 assert(remoteIndices.source_ == remoteIndices.target_);\n-542 assert(remoteIndices.source_ == &indexSet);\n-543 MPI_Comm_rank(remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &rank_);\n-544 }\n-545\n-546 template\n-_\b5_\b4_\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:_\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-548 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n-549 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n-550 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),\n-551 booleans.beginModify(), remoteIndices.end())\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()\n-556 : iterators_()\n-557 {}\n-558\n-559 template\n-_\b5_\b6_\b0 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-561 {\n-562 ++(std::get<0>(iterators_));\n-563 ++(std::get<1>(iterators_));\n-564 ++(std::get<2>(iterators_));\n-565 return *this;\n-566 }\n-567\n-568 template\n-_\b5_\b6_\b9 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-570 const std::pair& global)\n-571 {\n-572 std::get<0>(iterators_).insert(index);\n-573 std::get<1>(iterators_).insert(global);\n-574 std::get<2>(iterators_).insert(false);\n-575 }\n-576\n-577 template\n-578 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_\b7_\b9 _\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-580 {\n-581 return *(std::get<0>(iterators_));\n-582 }\n-583\n-584 template\n-585 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_\b8_\b6 _\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-587 {\n-588 return *(std::get<1>(iterators_));\n-589 }\n-590\n-591 template\n-_\b5_\b9_\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_\bO_\bl_\bd() const\n-593 {\n-594 return *(std::get<2>(iterators_));\n-595 }\n-596\n-597 template\n-_\b5_\b9_\b8 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-599 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n-600 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n-601 {\n-602 std::get<0>(iterators_) = remoteIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n-603 std::get<1>(iterators_) = globalIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n-604 std::get<2>(iterators_) = booleans._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n-605 }\n-606\n-607 template\n-_\b6_\b0_\b8 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-609 {\n-610 return std::get<0>(iterators_) != std::get<3>(iterators_);\n-611 }\n-612\n-613 template\n-_\b6_\b1_\b4 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-615 {\n-616 return std::get<0>(iterators_) == std::get<3>(iterators_);\n-617 }\n-618\n-619 template\n-620 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-621 {\n-622 MPI_Datatype type[2] = {MPI_INT, MPI_INT};\n-623 int blocklength[2] = {1,1};\n-624 MPI_Aint displacement[2];\n-625 MPI_Aint base;\n-626\n-627 // Compute displacement\n-628 MessageInformation message;\n-629\n-630 MPI_Get_address( &(message.publish), displacement);\n-631 MPI_Get_address( &(message.pairs), displacement+1);\n-632\n-633 // Make the displacement relative\n-634 MPI_Get_address(&message, &base);\n-635 displacement[0] -= base;\n-636 displacement[1] -= base;\n-637\n-638 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);\n-639 MPI_Type_commit(&datatype_);\n-640 }\n-641\n-642 template\n-643 void IndicesSyncer::calculateMessageSizes()\n-644 {\n-645 auto iEnd = indexSet_.end();\n-646 auto collIter = remoteIndices_.template iterator();\n-647\n-648 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n-649 collIter.advance(index->global(), index->local().attribute());\n-650 if(collIter.empty())\n-651 break;\n-652 int knownRemote=0;\n-653 auto end = collIter.end();\n-654\n-655 // Count the remote indices we know.\n-656 for(auto valid = collIter.begin(); valid != end; ++valid) {\n-657 ++knownRemote;\n-658 }\n-659\n-660 if(knownRemote>0) {\n-661 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<global()<< \" for processes \";\n-662\n-663 // Update MessageInformation\n-664 for(auto valid = collIter.begin(); valid != end; ++valid) {\n-665 ++(infoSend_[valid.process()].publish);\n-666 (infoSend_[valid.process()].pairs) += knownRemote;\n-667 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<first==remote->first) {\n-689 // We want to send message information to that process\n-690 message = const_cast(&(messageIter->second));\n-691 ++messageIter;\n-692 }else\n-693 // We do not want to send information but the other process might.\n-694 message = &dummy;\n-695\n-696 sendBufferSizes_[neighbour]=0;\n-697 int tsize;\n-698 // The number of indices published\n-699 MPI_Pack_size(1, MPI_INT,remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-700 sendBufferSizes_[neighbour] += tsize;\n-701\n-702 for(int i=0; i < message->publish; ++i) {\n-703 // The global index\n-704 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-705 sendBufferSizes_[neighbour] += tsize;\n-706 // The attribute in the local index\n-707 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-708 sendBufferSizes_[neighbour] += tsize;\n-709 // The number of corresponding remote indices\n-710 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-711 sendBufferSizes_[neighbour] += tsize;\n-712 }\n-713 for(int i=0; i < message->pairs; ++i) {\n-714 // The process of the remote index\n-715 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-716 sendBufferSizes_[neighbour] += tsize;\n-717 // The attribute of the remote index\n-718 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n-719 sendBufferSizes_[neighbour] += tsize;\n-720 }\n-721\n-722 _\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_\b2_\b8 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-729 {\n-730 DefaultNumberer numberer;\n-731 _\bs_\by_\bn_\bc(numberer);\n-732 }\n-733\n-734 template\n-735 template\n-_\b7_\b3_\b6 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)\n-737 {\n-738 // The pointers to the local indices in the remote indices\n-739 // will become invalid due to the resorting of the index set.\n-740 // Therefore store the corresponding global indices.\n-741 // Mark all indices as not added\n-742 const auto end = remoteIndices_._\be_\bn_\bd();\n-743\n-744 // Number of neighbours might change during the syncing.\n-745 // save the old neighbours\n-746 std::size_t noOldNeighbours = remoteIndices_._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs();\n-747 int* oldNeighbours = new int[noOldNeighbours];\n-748 sendBufferSizes_ = new std::size_t[noOldNeighbours];\n-749 std::size_t neighbourI = 0;\n-750\n-751 for(auto remote = remoteIndices_._\bb_\be_\bg_\bi_\bn(); remote != end; ++remote,\n-++neighbourI) {\n-752 oldNeighbours[neighbourI] = remote->first;\n-753\n-754 // Make sure we only have one remote index list.\n-755 assert(remote->second.first==remote->second.second);\n-756\n-757 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList = *(remote->second.first);\n-758\n-759 // Store the corresponding global indices.\n-760 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& global = globalMap_[remote->first];\n-761 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& added = oldMap_[remote->first];\n-762 auto riEnd = rList._\be_\bn_\bd();\n-763\n-764 for(auto index = rList._\bb_\be_\bg_\bi_\bn();\n-765 index != riEnd; ++index) {\n-766 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n-767 index->localIndexPair().local().attribute()));\n-768 added._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(true);\n-769 }\n-770\n-771 Iterators iterators(rList, global, added);\n-772 iteratorsMap_.insert(std::make_pair(remote->first, iterators));\n-773 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));\n-774 }\n-775\n-776 // Exchange indices with each neighbour\n-777 calculateMessageSizes();\n-778\n-779 // Allocate the buffers\n-780 receiveBufferSize_=1;\n-781 sendBuffers_ = new char*[noOldNeighbours];\n-782\n-783 for(std::size_t i=0; i\n-(sendBufferSizes_[i]));\n-786 }\n-787\n-788 receiveBuffer_=new char[receiveBufferSize_];\n-789\n-790 indexSet_.beginResize();\n-791\n-792 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<\n-852 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-853 {\n-854 auto iEnd = indexSet_.end();\n-855 int bpos = 0;\n-856 int published = 0;\n-857 int pairs = 0;\n-858\n-859 assert(checkReset());\n-860\n-861 // Pack the number of indices we publish\n-862 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize,\n-&bpos,\n-863 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-864\n-865 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n-866 // Search for corresponding remote indices in all iterator tuples\n-867 auto iteratorsEnd = iteratorsMap_.end();\n-868\n-869 // advance all iterators to a position with global index >= index->global()\n-870 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n-++iterators) {\n-871 while(iterators->second.isNotAtEnd() &&\n-872 iterators->second.globalIndexPair().first < index->global())\n-873 ++(iterators->second);\n-874 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair\n-().first >= index->global());\n-875 }\n-876\n-877 // Add all remote indices positioned at global which were already present\n-before calling sync\n-878 // to the message.\n-879 // Count how many remote indices we will send\n-880 int indices = 0;\n-881 bool knownRemote = false; // Is the remote process supposed to know this\n-index?\n-882\n-883 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n-++iterators)\n-884 {\n-885 std::pair p;\n-886 if (iterators->second.isNotAtEnd())\n-887 {\n-888 p = iterators->second.globalIndexPair();\n-889 }\n-890\n-891 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n-892 && iterators->second.globalIndexPair().first == index->global()) {\n-893 indices++;\n-894 if(destination == iterators->first)\n-895 knownRemote = true;\n-896 }\n-897 }\n-898\n-899 if(!knownRemote)\n-900 // We do not need to send any indices\n-901 continue;\n-902\n-903 _\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-908 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-909\n-910 char attr = index->local().attribute();\n-911 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n-912 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-913\n-914 // Pack the number of remote indices we send.\n-915 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,\n-916 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-917\n-918 // Pack the information about the remote indices\n-919 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n-++iterators)\n-920 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n-921 && iterators->second.globalIndexPair().first == index->global()) {\n-922 int process = iterators->first;\n-923\n-924 ++pairs;\n-925 assert(pairs <= infoSend_[destination].pairs);\n-926 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,\n-927 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-928 char attr2 = iterators->second.remoteIndex().attribute();\n-929\n-930 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n-931 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-932 --indices;\n-933 }\n-934 assert(indices==0);\n-935 ++published;\n-936 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\" (publish=\"<\n-951 inline void IndicesSyncer::insertIntoRemoteIndexList(int process,\n-952 const std::pair& globalPair,\n-953 char attribute)\n-954 {\n-955 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<<\"Inserting from \"<second;\n-972\n-973 // Search for the remote index\n-974 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {\n-975 // Increment all iterators\n-976 ++iterators;\n-977\n-978 }\n-979\n-980 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {\n-981 // The entry is not yet known\n-982 // Insert in the list and do not change the first iterator.\n-983 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n-984 return;\n-985 }\n-986\n-987 // Global indices match\n-988 bool indexIsThere=false;\n-989 for(Iterators tmpIterators = iterators;\n-990 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;\n-991 ++tmpIterators)\n-992 //entry already exists with the same attribute\n-993 if(tmpIterators.globalIndexPair().second == attribute) {\n-994 indexIsThere=true;\n-995 break;\n-996 }\n-997\n-998 if(!indexIsThere)\n-999 // The entry is not yet known\n-1000 // Insert in the list and do not change the first iterator.\n-1001 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n-1002 }\n-1003\n-1004 template\n-1005 template\n-1006 void IndicesSyncer::recvAndUnpack(T1& numberer)\n-1007 {\n-1008 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& constIndexSet = indexSet_;\n-1009 auto iEnd = constIndexSet.end();\n-1010 auto index = constIndexSet.begin();\n-1011 int bpos = 0;\n-1012 int publish;\n-1013\n-1014 assert(checkReset());\n-1015\n-1016 MPI_Status status;\n-1017\n-1018 // We have to determine the message size and source before the receive\n-1019 MPI_Probe(MPI_ANY_SOURCE, 345, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &status);\n-1020\n-1021 int source=status.MPI_SOURCE;\n-1022 int count;\n-1023 MPI_Get_count(&status, MPI_PACKED, &count);\n-1024\n-1025 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<receiveBufferSize_) {\n-1028 receiveBufferSize_=count;\n-1029 delete[] receiveBuffer_;\n-1030 receiveBuffer_ = new char[receiveBufferSize_];\n-1031 }\n-1032\n-1033 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345,\n-remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &status);\n-1034\n-1035 // How many global entries were published?\n-1036 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT,\n-remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1037\n-1038 // Now unpack the remote indices and add them.\n-1039 while(publish>0) {\n-1040\n-1041 // Unpack information about the local index on the source process\n-1042 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global; // global index of the current entry\n-1043 char sourceAttribute; // Attribute on the source process\n-1044 int pairs;\n-1045\n-1046 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-1047 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1048 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,\n-1049 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1050 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,\n-1051 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1052\n-1053 // Insert the entry on the remote process to our\n-1054 // remote index list\n-1055 SLList > sourceAttributeList;\n-1056 sourceAttributeList.push_back(std::make_pair(source,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-(sourceAttribute)));\n-1057#ifndef NDEBUG\n-1058 bool foundSelf = false;\n-1059#endif\n-1060 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be();\n-1061\n-1062 // Unpack the remote indices\n-1063 for(; pairs>0; --pairs) {\n-1064 // Unpack the process id that knows the index\n-1065 int process;\n-1066 char attribute;\n-1067 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,\n-1068 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1069 // Unpack the attribute\n-1070 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,\n-1071 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n-1072\n-1073 if(process==rank_) {\n-1074#ifndef NDEBUG\n-1075 foundSelf=true;\n-1076#endif\n-1077 myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute);\n-1078 // Now we know the local attribute of the global index\n-1079 //Only add the index if it is unknown.\n-1080 // Do we know that global index already?\n-1081 auto pos = std::lower_bound(index, iEnd, _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(global));\n-1082\n-1083 if(pos == iEnd || pos->global() != global) {\n-1084 // no entry with this global index\n-1085 indexSet_.add(global,\n-1086 ParallelLocalIndex(numberer(global),\n-1087 myAttribute, true));\n-1088 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"<global()==global; ++pos)\n-1097 if(pos->local().attribute() == myAttribute) {\n-1098 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\"found \"<(numberer(global),\n-1106 myAttribute, true));\n-1107 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"< >::const_iterator Iter;\n-1117 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();\n-1118 i!=end; ++i)\n-1119 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),\n-1120 i->second);\n-1121 --publish;\n-1122 }\n-1123\n-1124 resetIteratorsMap();\n-1125 }\n-1126\n-1127 template\n-1128 void IndicesSyncer::resetIteratorsMap(){\n-1129\n-1130 // Reset iterators in all tuples.\n-1131 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n-1132 auto iterators = iteratorsMap_.begin();\n-1133 auto global = globalMap_.begin();\n-1134 auto added = oldMap_.begin();\n-1135\n-1136 for(auto remote = remoteIndices_.remoteIndices_.begin();\n-1137 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n-1138 iterators->second.reset(*(remote->second.first), global->second, added-\n->second);\n-1139 }\n-1140 }\n-1141\n-1142 template\n-1143 bool IndicesSyncer::checkReset(const Iterators& iterators,\n-RemoteIndexList& rList, GlobalIndexList& gList,\n-1144 BoolList& bList){\n-1145\n-1146 if(std::get<0>(iterators.iterators_) != rList.begin())\n-1147 return false;\n-1148 if(std::get<1>(iterators.iterators_) != gList.begin())\n-1149 return false;\n-1150 if(std::get<2>(iterators.iterators_) != bList.begin())\n-1151 return false;\n-1152 return true;\n-1153 }\n-1154\n-1155\n-1156 template\n-1157 bool IndicesSyncer::checkReset(){\n-1158\n-1159 // Reset iterators in all tuples.\n-1160 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n-1161 auto iterators = iteratorsMap_.begin();\n-1162 auto global = globalMap_.begin();\n-1163 auto added = oldMap_.begin();\n-1164 bool ret = true;\n-1165\n-1166 for(auto remote = remoteIndices_.remoteIndices_.begin();\n-1167 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n-1168 if(!checkReset(iterators->second, *(remote->second.first), global->second,\n-1169 added->second))\n-1170 ret=false;\n-1171 }\n-1172 return ret;\n-1173 }\n-1174}\n-1175\n-1176#endif\n-1177#endif\n-_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n-Standard Dune debug streams.\n-_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-Classes describing a distributed indexset.\n-_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\n-Provides a map between global and local indices.\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:637\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:237\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:259\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:555\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:59\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:592\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:126\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:487\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:614\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:51\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:131\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 iteraors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:560\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:54\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:586\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:536\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:598\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:145\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:45\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:608\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:461\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:728\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:48\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:579\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:122\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:569\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:95\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:116\n+112\n+114\n+115 } // namespace Simd\n+116} // namespace Dune\n+117\n+118#endif // DUNE_COMMON_SIMD_IO_HH\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\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+_\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:300\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:642\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bi_\bo\n+auto io(const V &v)\n+construct a stream inserter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bv_\bi_\bo\n+auto vio(const V &v)\n+construct a stream inserter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:90\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:_\bS_\bc_\ba_\bl_\ba_\br\n+typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n+Element type of some SIMD type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\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:41\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:49\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:189\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:1696\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:1529\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:1446\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:237\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:1522\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:73\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+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo\n+Inserter< V > io(const V &v)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br\n+Inserter(const T &value)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend Stream & operator<<(Stream &out, const Inserter &ins)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:37\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/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: remoteindices.hh File Reference\n+dune-common: test.hh File Reference\n \n \n \n \n \n \n \n@@ -65,89 +65,496 @@\n
    \n
    \n
    \n
    \n \n \n
    \n \n+
    test.hh File Reference
    \n
    \n
    \n \n-

    Classes describing a distributed indexset. \n+

    Common tests for simd abstraction implementations. \n More...

    \n-
    #include <cassert>
    \n+
    #include <algorithm>
    \n+#include <cstddef>
    \n #include <iostream>
    \n-#include <ostream>
    \n-#include <map>
    \n-#include <memory>
    \n-#include <set>
    \n+#include <sstream>
    \n+#include <string>
    \n+#include <type_traits>
    \n+#include <typeindex>
    \n+#include <typeinfo>
    \n+#include <unordered_set>
    \n #include <utility>
    \n-#include <vector>
    \n-#include <mpi.h>
    \n-#include <dune/common/exceptions.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/sllist.hh>
    \n-#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/classname.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include <dune/common/rangeutilities.hh>
    \n+#include <dune/common/simd/io.hh>
    \n+#include <dune/common/simd/loop.hh>
    \n+#include <dune/common/simd/simd.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n+#include <dune/common/typelist.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 Classes

    class  Dune::MPITraits< IndexPair< TG, ParallelLocalIndex< TA > > >
    struct  Dune::Simd::EndMark
     final element marker for RebindList 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...
    class  Dune::Simd::UnitTest
     
    \n \n \n \n \n+\n+\n+\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Macros

    #define DUNE_SIMD_CHECK(expr)    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
     
    #define DUNE_SIMD_CHECK_OP(expr)
     
    #define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_OPNAME   (className<Op(V)>())
     
    #define DUNE_SIMD_INFIX_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL)
     
    #define DUNE_SIMD_OPNAME   (className<OpInfixComma(T1, T2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, V2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, P2)>())
     
    #define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)
     
    \n-\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)
     

    \n+Typedefs

    template<class... Types>
    using Dune::Simd::RebindList = typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type
     A list of types with the final element removed.
     
    template<class T >
    using Dune::Simd::IsLoop = typename Impl::IsLoop< T >::type
     check whether a type is an instance of LoopSIMD
     
    \n

    Detailed Description

    \n-

    Classes describing a distributed indexset.

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

    Common tests for simd abstraction implementations.

    \n+

    This file is an interface header and may be included without restrictions.

    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_SIMD_ASSIGN_OP

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_ASSIGN_OP( NAME,
     SYMBOL 
    )
    \n+
    \n+Value:
    struct OpInfix##NAME \\
    \n+
    { \\
    \n+
    template<class V1, class V2> \\
    \n+
    decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n+
    { \\
    \n+
    return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n+
    } \\
    \n+
    template<class S1, class S2> \\
    \n+
    auto scalar(S1& s1, S2&& s2) const \\
    \n+
    -> decltype(s1 SYMBOL std::forward<S2>(s2)); \\
    \n+
    }
    \n+
    \n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_CHECK

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_CHECK( expr)    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_CHECK_OP

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_CHECK_OP( expr)
    \n+
    \n+Value:
    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\
    \n+\n+
    #define DUNE_SIMD_OPNAME
    \n+
    \n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_DO

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_DO( M1,
     M2,
     M3,
     V1,
     V2,
     V3,
     NAME 
    )
    \n+
    \n+Value:
    checker(bool_constant<isMask ? do_##M1 : do_##V1>{}, \\
    \n+
    bool_constant<isMask ? do_##M2 : do_##V2>{}, \\
    \n+
    bool_constant<isMask ? do_##M3 : do_##V3>{}, \\
    \n+
    Op##NAME{})
    \n+
    \n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_INFIX_OP

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_INFIX_OP( NAME,
     SYMBOL 
    )
    \n+
    \n+Value:
    struct OpInfix##NAME \\
    \n+
    { \\
    \n+
    template<class V1, class V2> \\
    \n+
    decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n+
    { \\
    \n+
    return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n+
    } \\
    \n+
    template<class S1, class S2> \\
    \n+
    auto scalar(S1&& s1, S2&& s2) const \\
    \n+
    -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \n+
    }
    \n+
    \n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_OPNAME [1/6]

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_OPNAME   (className<Op(V)>())
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_OPNAME [2/6]

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_OPNAME   (className<OpInfixComma(T1, T2)>())
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_OPNAME [3/6]

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_OPNAME   (className<Op(V1, V2)>())
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_OPNAME [4/6]

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_OPNAME [5/6]

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_OPNAME [6/6]

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_OPNAME   (className<Op(V1, P2)>())
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_POSTFIX_OP

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_POSTFIX_OP( NAME,
     SYMBOL 
    )
    \n+
    \n+Value:
    struct OpPostfix##NAME \\
    \n+
    { \\
    \n+
    template<class V> \\
    \n+
    auto operator()(V&& v) const \\
    \n+
    -> decltype(std::forward<V>(v) SYMBOL) \\
    \n+
    { \\
    \n+
    return std::forward<V>(v) SYMBOL; \\
    \n+
    } \\
    \n+
    }
    \n+
    \n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_PREFIX_OP

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_PREFIX_OP( NAME,
     SYMBOL 
    )
    \n+
    \n+Value:
    struct OpPrefix##NAME \\
    \n+
    { \\
    \n+
    template<class V> \\
    \n+
    auto operator()(V&& v) const \\
    \n+
    -> decltype(SYMBOL std::forward<V>(v)) \\
    \n+
    { \\
    \n+
    return SYMBOL std::forward<V>(v); \\
    \n+
    } \\
    \n+
    }
    \n+
    \n+
    \n+
    \n+\n+

    ◆ DUNE_SIMD_REPL_OP

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_SIMD_REPL_OP( NAME,
     REPLFN,
     SYMBOL 
    )
    \n+
    \n+Value:
    struct OpInfix##NAME \\
    \n+
    { \\
    \n+
    template<class V1, class V2> \\
    \n+
    decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n+
    { \\
    \n+
    return Simd::REPLFN(std::forward<V1>(v1), std::forward<V2>(v2)); \\
    \n+
    } \\
    \n+
    template<class S1, class S2> \\
    \n+
    auto scalar(S1&& s1, S2&& s2) const \\
    \n+
    -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \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,72 +1,203 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\bd\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n+test.hh File Reference\n+Common tests for simd abstraction implementations. _\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 \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_\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-#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/_\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/_\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/_\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_\bi_\bm_\bd_\b/_\bi_\bo_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bl_\bo_\bo_\bp_\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/_\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/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\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:_\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bE_\bn_\bd_\bM_\ba_\br_\bk\n+\u00a0 final element marker for RebindList _\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_\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+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt\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+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-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+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd\n+\u00a0 Namespace for vectorization interface functions used by library\n+ developers.\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+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(expr)\u00a0\u00a0\u00a0 ((expr) ? void() : complain(__FILE__,\n+ __LINE__, __func__, #expr))\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+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(expr)\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+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(NAME, SYMBOL)\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+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP(NAME, SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(NAME, SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(NAME, SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP(NAME, REPLFN, SYMBOL)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(M1, M2, M3, V1, V2, V3, NAME)\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_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bL_\bi_\bs_\bt = typename Impl::RemoveEnd< _\bE_\bn_\bd_\bM_\ba_\br_\bk, _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt<\n+ Types... > >::type\n+\u00a0 A list of types with the final element removed.\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+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bI_\bs_\bL_\bo_\bo_\bp = typename Impl::IsLoop< T >::type\n+\u00a0 check whether a type is an instance of _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\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-Classes describing a distributed indexset.\n- Author\n- Markus Blatt\n+Common tests for simd abstraction implementations.\n+This file is an interface header and may be included without restrictions.\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_S\bSI\bIM\bMD\bD_\b_A\bAS\bSS\bSI\bIG\bGN\bN_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_ASSIGN_OP ( \u00a0 NAME,\n+ \u00a0 SYMBOL\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+struct OpInfix##NAME \\\n+{ \\\n+template \\\n+decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n+{ \\\n+return std::forward(v1) SYMBOL std::forward(v2); \\\n+} \\\n+template \\\n+auto scalar(S1& s1, S2&& s2) const \\\n+-> decltype(s1 SYMBOL std::forward(s2)); \\\n+}\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_C\bCH\bHE\bEC\bCK\bK *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_CHECK ( \u00a0 expr ) \u00a0\u00a0\u00a0 ((expr) ? void() : complain(__FILE__,\n+ __LINE__, __func__, #expr))\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_C\bCH\bHE\bEC\bCK\bK_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_CHECK_OP ( \u00a0 expr )\n+V\bVa\bal\blu\bue\be:\b:\n+((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE, #expr))\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\n+#define DUNE_SIMD_OPNAME\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_D\bDO\bO *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_DO ( \u00a0 M1,\n+ \u00a0 M2,\n+ \u00a0 M3,\n+ \u00a0 V1,\n+ \u00a0 V2,\n+ \u00a0 V3,\n+ \u00a0 NAME\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+checker(bool_constant{}, \\\n+bool_constant{}, \\\n+bool_constant{}, \\\n+Op##NAME{})\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_I\bIN\bNF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_INFIX_OP ( \u00a0 NAME,\n+ \u00a0 SYMBOL\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+struct OpInfix##NAME \\\n+{ \\\n+template \\\n+decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n+{ \\\n+return std::forward(v1) SYMBOL std::forward(v2); \\\n+} \\\n+template \\\n+auto scalar(S1&& s1, S2&& s2) const \\\n+-> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n+}\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[1\b1/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[2\b2/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[3\b3/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[4\b4/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[5\b5/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[6\b6/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_P\bPO\bOS\bST\bTF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_POSTFIX_OP ( \u00a0 NAME,\n+ \u00a0 SYMBOL\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+struct OpPostfix##NAME \\\n+{ \\\n+template \\\n+auto operator()(V&& v) const \\\n+-> decltype(std::forward(v) SYMBOL) \\\n+{ \\\n+return std::forward(v) SYMBOL; \\\n+} \\\n+}\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_P\bPR\bRE\bEF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_PREFIX_OP ( \u00a0 NAME,\n+ \u00a0 SYMBOL\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+struct OpPrefix##NAME \\\n+{ \\\n+template \\\n+auto operator()(V&& v) const \\\n+-> decltype(SYMBOL std::forward(v)) \\\n+{ \\\n+return SYMBOL std::forward(v); \\\n+} \\\n+}\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_R\bRE\bEP\bPL\bL_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n+#define DUNE_SIMD_REPL_OP ( \u00a0 NAME,\n+ \u00a0 REPLFN,\n+ \u00a0 SYMBOL\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+struct OpInfix##NAME \\\n+{ \\\n+template \\\n+decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n+{ \\\n+return Simd::REPLFN(std::forward(v1), std::forward(v2)); \\\n+} \\\n+template \\\n+auto scalar(S1&& s1, S2&& s2) const \\\n+-> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n+}\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: remoteindices.hh Source File\n+dune-common: test.hh Source File\n \n \n \n \n \n \n \n@@ -70,1697 +70,2026 @@\n \n \n \n \n \n \n \n
    \n-
    remoteindices.hh
    \n+
    test.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 (C) 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_REMOTEINDICES_HH
    \n-
    6#define DUNE_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 <utility>
    \n-
    17#include <vector>
    \n-
    18
    \n-
    19#include <mpi.h>
    \n-
    20
    \n-\n-\n-\n-\n-
    25#include <dune/common/sllist.hh>
    \n-\n-
    27
    \n-
    28namespace Dune {
    \n-
    40 template<typename TG, typename TA>
    \n-
    \n-\n-
    42 {
    \n-
    43 public:
    \n-
    44 inline static MPI_Datatype getType();
    \n-
    45 private:
    \n-
    46 static MPI_Datatype type;
    \n-
    47 };
    \n-
    \n-
    48
    \n-
    49
    \n-
    50 template<typename T, typename A>
    \n-
    51 class RemoteIndices;
    \n-
    52
    \n-
    53 template<typename T1, typename T2>
    \n-
    54 class RemoteIndex;
    \n-
    55
    \n-
    56 // forward declaration needed for friend declaration.
    \n-
    57 template<typename T>
    \n-
    58 class IndicesSyncer;
    \n-
    59
    \n-
    60 template<typename T1, typename T2>
    \n-
    61 std::ostream& operator<<(std::ostream& os, const RemoteIndex<T1,T2>& index);
    \n-
    62
    \n-
    63
    \n-
    64 template<typename T, typename A, bool mode>
    \n-\n-
    66
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_TEST_HH
    \n+
    4#define DUNE_COMMON_SIMD_TEST_HH
    \n+
    5
    \n+
    12#include <algorithm>
    \n+
    13#include <cstddef>
    \n+
    14#include <iostream>
    \n+
    15#include <sstream>
    \n+
    16#include <string>
    \n+
    17#include <type_traits>
    \n+
    18#include <typeindex>
    \n+
    19#include <typeinfo>
    \n+
    20#include <unordered_set>
    \n+
    21#include <utility>
    \n+
    22
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+
    32
    \n+
    33namespace Dune {
    \n+
    34 namespace Simd {
    \n+
    35
    \n+
    36 namespace Impl {
    \n+
    37
    \n+
    38 template<class T, class SFINAE = void>
    \n+
    39 struct LessThenComparable : std::false_type {};
    \n+
    40 template<class T>
    \n+
    41 struct LessThenComparable<T, std::void_t<decltype(std::declval<T>()
    \n+
    42 < std::declval<T>())> > :
    \n+
    43 std::true_type
    \n+
    44 {};
    \n+
    45
    \n+
    46 template<class Dst, class Src>
    \n+
    47 struct CopyConstHelper
    \n+
    48 {
    \n+
    49 using type = Dst;
    \n+
    50 };
    \n+
    51 template<class Dst, class Src>
    \n+
    52 struct CopyConstHelper<Dst, const Src>
    \n+
    53 {
    \n+
    54 using type = std::add_const_t<Dst>;
    \n+
    55 };
    \n+
    56
    \n+
    57 template<class Dst, class Src>
    \n+
    58 struct CopyVolatileHelper
    \n+
    59 {
    \n+
    60 using type = Dst;
    \n+
    61 };
    \n+
    62 template<class Dst, class Src>
    \n+
    63 struct CopyVolatileHelper<Dst, volatile Src>
    \n+
    64 {
    \n+
    65 using type = std::add_volatile_t<Dst>;
    \n+
    66 };
    \n
    67
    \n-
    71 template<typename T1, typename T2>
    \n-
    \n-\n-
    73 {
    \n-
    74 template<typename T>
    \n-
    75 friend class IndicesSyncer;
    \n-
    76
    \n-
    77 template<typename T, typename A, typename A1>
    \n-
    78 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >&,
    \n-\n-
    80 const T&);
    \n-
    81
    \n-
    82 template<typename T, typename A, bool mode>
    \n-\n+
    68 template<class Dst, class Src>
    \n+
    69 struct CopyReferenceHelper
    \n+
    70 {
    \n+
    71 using type = Dst;
    \n+
    72 };
    \n+
    73 template<class Dst, class Src>
    \n+
    74 struct CopyReferenceHelper<Dst, Src&>
    \n+
    75 {
    \n+
    76 using type = std::add_lvalue_reference_t<Dst>;
    \n+
    77 };
    \n+
    78
    \n+
    79 template<class Dst, class Src>
    \n+
    80 struct CopyReferenceHelper<Dst, Src&&>
    \n+
    81 {
    \n+
    82 using type = std::add_rvalue_reference_t<Dst>;
    \n+
    83 };
    \n
    84
    \n-
    85 public:
    \n-
    90 typedef T1 GlobalIndex;
    \n-
    99 typedef T2 Attribute;
    \n-
    100
    \n-\n-\n-
    106
    \n-
    111 const Attribute attribute() const;
    \n+
    85 template<class Dst, class Src>
    \n+
    86 using CopyRefQual = typename CopyReferenceHelper<
    \n+
    87 typename CopyVolatileHelper<
    \n+
    88 typename CopyConstHelper<
    \n+
    89 std::decay_t<Dst>,
    \n+
    90 std::remove_reference_t<Src>
    \n+
    91 >::type,
    \n+
    92 std::remove_reference_t<Src>
    \n+
    93 >::type,
    \n+
    94 Src
    \n+
    95 >::type;
    \n+
    96
    \n+
    97 template<class Mark, class Types,
    \n+
    98 class Indices =
    \n+
    99 std::make_index_sequence<TypeListSize<Types>::value - 1> >
    \n+
    100 struct RemoveEnd;
    \n+
    101 template<class Mark, class Types, std::size_t... I>
    \n+
    102 struct RemoveEnd<Mark, Types, std::index_sequence<I...>>
    \n+
    103 {
    \n+
    104 using Back = TypeListEntry_t<TypeListSize<Types>::value - 1, Types>;
    \n+
    105 static_assert(std::is_same<Mark, Back>::value,
    \n+
    106 "TypeList not terminated by proper EndMark");
    \n+
    107 using type = TypeList<TypeListEntry_t<I, Types>...>;
    \n+
    108 };
    \n+
    109
    \n+
    110 template<class T, class List, class = void>
    \n+
    111 struct TypeInList;
    \n
    112
    \n-
    118 const PairType& localIndexPair() const;
    \n-
    119
    \n-
    123 RemoteIndex();
    \n+
    113 template<class T>
    \n+
    114 struct TypeInList<T, TypeList<> > : std::false_type {};
    \n+
    115
    \n+
    116 template<class T, class... Rest>
    \n+
    117 struct TypeInList<T, TypeList<T, Rest...> > : std::true_type {};
    \n+
    118
    \n+
    119 template<class T, class Head, class... Rest>
    \n+
    120 struct TypeInList<T, TypeList<Head, Rest...>,
    \n+
    121 std::enable_if_t<!std::is_same<T, Head>::value> > :
    \n+
    122 TypeInList<T, TypeList<Rest...> >::type
    \n+
    123 {};
    \n
    124
    \n-
    125
    \n-
    131 RemoteIndex(const T2& attribute,
    \n-
    132 const PairType* local);
    \n-
    133
    \n-
    134
    \n-
    140 RemoteIndex(const T2& attribute);
    \n+
    125 template<class T>
    \n+
    126 struct IsLoop : std::false_type {};
    \n+
    127 template<class T, std::size_t S>
    \n+
    128 struct IsLoop<LoopSIMD<T, S> > : std::true_type {};
    \n+
    129
    \n+
    130 // used inside static_assert to trick the compiler into printing a list
    \n+
    131 // of types:
    \n+
    132 //
    \n+
    133 // static_assert(debugTypes<V>(Std::bool_constant<condition>{}), "msg");
    \n+
    134 //
    \n+
    135 // Should include what the type `V` expands to in the error message.
    \n+
    136 template<class...>
    \n+
    137 constexpr bool debugTypes(std::true_type) { return true; }
    \n+
    138 template<class... Types>
    \n+
    139 [[deprecated]]
    \n+
    140 constexpr bool debugTypes(std::false_type) { return false; }
    \n
    141
    \n-
    142 bool operator==(const RemoteIndex& ri) const;
    \n+
    142 } // namespace Impl
    \n
    143
    \n-
    144 bool operator!=(const RemoteIndex& ri) const;
    \n-
    145 private:
    \n-
    147 const PairType* localIndex_;
    \n-
    148
    \n-
    150 char attribute_;
    \n-
    151 };
    \n-
    \n-
    152
    \n-
    153 template<class T, class A>
    \n-
    154 std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices);
    \n-
    155
    \n-
    156 class InterfaceBuilder;
    \n-
    157
    \n-
    158 template<class T, class A>
    \n-
    159 class CollectiveIterator;
    \n-
    160
    \n-
    161 // forward declaration needed for friend declaration.
    \n-
    162 template<class T>
    \n-
    163 class IndicesSyncer;
    \n-
    164
    \n-
    165 // forward declaration needed for friend declaration.
    \n-
    166 template<typename T1, typename T2>
    \n-\n-
    168
    \n-
    169
    \n-
    186 template<class T, class A=std::allocator<RemoteIndex<typename T::GlobalIndex,
    \n-
    187 typename T::LocalIndex::Attribute> > >
    \n-
    \n-\n-
    189 {
    \n-
    190 friend class InterfaceBuilder;
    \n-
    191 friend class IndicesSyncer<T>;
    \n-
    192 template<typename T1, typename A2, typename A1>
    \n-
    193 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T1::GlobalIndex, typename T1::LocalIndex::Attribute>,A2> >&,
    \n-\n-
    195 const T1&);
    \n-
    196
    \n-
    197 template<class G, class T1, class T2>
    \n-\n-
    199 friend std::ostream& operator<<<>(std::ostream&, const RemoteIndices<T>&);
    \n-
    200
    \n-
    201 public:
    \n-
    202
    \n-\n+
    145 struct EndMark {};
    \n+
    147
    \n+
    156 template<class... Types>
    \n+\n+
    158 typename Impl::RemoveEnd<EndMark, TypeList<Types...> >::type;
    \n+
    159
    \n+
    161 template<class T>
    \n+
    162 using IsLoop = typename Impl::IsLoop<T>::type;
    \n+
    163
    \n+
    \n+
    164 class UnitTest {
    \n+
    165 bool good_ = true;
    \n+
    166 std::ostream &log_ = std::cerr;
    \n+
    167 // records the types for which checks have started running to avoid
    \n+
    168 // infinite recursion
    \n+
    169 std::unordered_set<std::type_index> seen_;
    \n+
    170
    \n+
    172 //
    \n+
    173 // Helper functions
    \n+
    174 //
    \n+
    175
    \n+
    176 void complain(const char *file, int line, const char *func,
    \n+
    177 const char *expr);
    \n+
    178
    \n+
    179 void complain(const char *file, int line, const char *func,
    \n+
    180 const std::string &opname, const char *expr);
    \n+
    181
    \n+
    182 // This macro is defined only within this file, do not use anywhere
    \n+
    183 // else. Doing the actual printing in an external function dramatically
    \n+
    184 // reduces memory use during compilation. Defined in such a way that
    \n+
    185 // the call will only happen for failed checks.
    \n+
    \n+
    186#define DUNE_SIMD_CHECK(expr) \\
    \n+
    187 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
    \n+
    \n+
    188
    \n+
    189 // the function using this macro must define a way to compute the
    \n+
    190 // operator name in DUNE_SIMD_OPNAME
    \n+
    \n+
    191#define DUNE_SIMD_CHECK_OP(expr) \\
    \n+
    192 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\
    \n+
    193 DUNE_SIMD_OPNAME, #expr))
    \n+
    \n+
    194
    \n+
    195 // "cast" into a prvalue
    \n+
    196 template<class T>
    \n+
    197 static std::decay_t<T> prvalue(T &&t)
    \n+
    198 {
    \n+
    199 return std::forward<T>(t);
    \n+
    200 }
    \n+
    201
    \n+
    202 // whether the vector is 42 in all lanes
    \n+
    203 template<class V>
    \n+
    204 static bool is42(const V &v)
    \n+
    205 {
    \n+
    206 bool good = true;
    \n
    207
    \n-\n+
    208 for(std::size_t l = 0; l < lanes(v); ++l)
    \n+
    209 // need to cast in case we have a mask type
    \n+
    210 good &= (lane(l, v) == Scalar<V>(42));
    \n
    211
    \n-\n-
    216
    \n-
    217
    \n-\n-
    222
    \n-
    226 typedef typename LocalIndex::Attribute Attribute;
    \n-
    227
    \n-\n-
    232
    \n-
    233
    \n-
    237 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n+
    212 return good;
    \n+
    213 }
    \n+
    214
    \n+
    215 // make a vector that contains the sequence { 1, 2, ... }
    \n+
    216 template<class V>
    \n+
    217 static V make123()
    \n+
    218 {
    \n+
    219 // initialize to avoid undefined behaviour if assigning to lane()
    \n+
    220 // involves lvalue-to-rvalue conversions, e.g. due to bitmask
    \n+
    221 // operations. Avoid using broadcast<V>() for initialization to avoid
    \n+
    222 // test interdependencies.
    \n+
    223 V vec(Scalar<V>(0));
    \n+
    224 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n+
    225 lane(l, vec) = l + 1;
    \n+
    226 return vec;
    \n+
    227 }
    \n+
    228
    \n+
    229 // whether the vector contains the sequence { 1, 2, ... }
    \n+
    230 template<class V>
    \n+
    231 static bool is123(const V &v)
    \n+
    232 {
    \n+
    233 bool good = true;
    \n+
    234
    \n+
    235 for(std::size_t l = 0; l < lanes(v); ++l)
    \n+
    236 // need to cast in case we have a mask type
    \n+
    237 good &= (lane(l, v) == Scalar<V>(l+1));
    \n
    238
    \n-\n-\n-
    242
    \n-
    244 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n-\n-
    246
    \n-
    247 typedef typename RemoteIndexMap::const_iterator const_iterator;
    \n-
    248
    \n-
    266 inline RemoteIndices(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n-
    267 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>(), bool includeSelf=false);
    \n-
    268
    \n-\n-
    270
    \n-
    278 void setIncludeSelf(bool includeSelf);
    \n+
    239 return good;
    \n+
    240 }
    \n+
    241
    \n+
    242 template<class V>
    \n+
    243 static V leftVector()
    \n+
    244 {
    \n+
    245 // Avoid using broadcast<V>() for initialization to avoid test
    \n+
    246 // interdependencies.
    \n+
    247 V res(Scalar<V>(0));
    \n+
    248 for(std::size_t l = 0; l < lanes(res); ++l)
    \n+
    249 lane(l, res) = Scalar<V>(l+1);
    \n+
    250 return res;
    \n+
    251 }
    \n+
    252
    \n+
    253 template<class V>
    \n+
    254 static V rightVector()
    \n+
    255 {
    \n+
    256 // Avoid using broadcast<V>() for initialization to avoid test
    \n+
    257 // interdependencies.
    \n+
    258 V res(Scalar<V>(0));
    \n+
    259 for(std::size_t l = 0; l < lanes(res); ++l)
    \n+
    260 // do not exceed number of bits in char (for shifts)
    \n+
    261 // avoid 0 (for / and %)
    \n+
    262 lane(l, res) = Scalar<V>((l)%7+1);
    \n+
    263 return res;
    \n+
    264 }
    \n+
    265
    \n+
    266 template<class T>
    \n+
    267 static T leftScalar()
    \n+
    268 {
    \n+
    269 return T(42);
    \n+
    270 }
    \n+
    271
    \n+
    272 template<class T>
    \n+
    273 static T rightScalar()
    \n+
    274 {
    \n+
    275 // do not exceed number of bits in char (for shifts)
    \n+
    276 // avoid 0 (for / and %)
    \n+
    277 return T(5);
    \n+
    278 }
    \n
    279
    \n-
    296 void setIndexSets(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n-
    297 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>());
    \n+
    280 template<class Dst, class Src>
    \n+
    281 using CopyRefQual = Impl::CopyRefQual<Dst, Src>;
    \n+
    282
    \n+
    283 // test whether the Op supports the operation on scalars. We do not use
    \n+
    284 // `lane()` to obtain the scalars, because that might return a proxy
    \n+
    285 // object, and we are interested in what exactly the scalar type can do,
    \n+
    286 // no a proxy that might have more overloads than needed. In addition,
    \n+
    287 // `lane()` may not preserve `const` and reference qualifiers.
    \n+
    288 template<class Op, class... Vectors>
    \n+
    289 using ScalarResult =
    \n+
    290 decltype(std::declval<Op>().
    \n+
    291 scalar(std::declval<CopyRefQual<Scalar<Vectors>,
    \n+
    292 Vectors> >()...));
    \n+
    293
    \n+
    295 //
    \n+
    296 // Check associated types
    \n+
    297 //
    \n
    298
    \n-
    299 template<typename C>
    \n-
    \n-\n-
    301 {
    \n-
    302 neighbourIds.clear();
    \n-
    303 neighbourIds.insert(neighbours.begin(), neighbours.end());
    \n+
    299 template<class V>
    \n+
    300 void checkScalar()
    \n+
    301 {
    \n+
    302 // check that the type Scalar<V> exists
    \n+
    303 using T = Scalar<V>;
    \n
    304
    \n-
    305 }
    \n-
    \n-
    306
    \n-
    \n-
    307 const std::set<int>& getNeighbours() const
    \n-
    308 {
    \n-
    309 return neighbourIds;
    \n-
    310 }
    \n-
    \n-
    311
    \n-\n-
    316
    \n-
    326 template<bool ignorePublic>
    \n-
    327 void rebuild();
    \n-
    328
    \n-
    329 bool operator==(const RemoteIndices& ri) const;
    \n-
    330
    \n-
    338 inline bool isSynced() const;
    \n-
    339
    \n-
    343 inline MPI_Comm communicator() const;
    \n-
    344
    \n-
    359 template<bool mode, bool send>
    \n-\n+
    305 static_assert(std::is_same<T, std::decay_t<T> >::value, "Scalar types "
    \n+
    306 "must not be references, and must not include "
    \n+
    307 "cv-qualifiers");
    \n+
    308 [[maybe_unused]] T a{};
    \n+
    309 }
    \n+
    310
    \n+
    311 template<class V>
    \n+
    312 [[deprecated("Warning: please include bool in the Rebinds for "
    \n+
    313 "simd type V, as Masks are not checked otherwise.")]]
    \n+
    314 void warnMissingMaskRebind(std::true_type) {}
    \n+
    315 template<class V>
    \n+
    316 void warnMissingMaskRebind(std::false_type) {}
    \n+
    317
    \n+
    318 template<class V, class Rebinds, template<class> class RebindPrune,
    \n+
    319 template<class> class RebindAccept, class Recurse>
    \n+
    320 void checkRebindOf(Recurse recurse)
    \n+
    321 {
    \n+
    322 Hybrid::forEach(Rebinds{}, [this,recurse](auto target) {
    \n+
    323 using T = typename decltype(target)::type;
    \n+
    324
    \n+
    325 // check that the rebound type exists
    \n+
    326 using W = Rebind<T, V>;
    \n+
    327 log_ << "Type " << className<V>() << " rebound to "
    \n+
    328 << className<T>() << " is " << className<W>() << std::endl;
    \n+
    329
    \n+
    330 static_assert(std::is_same<W, std::decay_t<W> >::value, "Rebound "
    \n+
    331 "types must not be references, and must not include "
    \n+
    332 "cv-qualifiers");
    \n+
    333 static_assert(lanes<V>() == lanes<W>(), "Rebound types must have "
    \n+
    334 "the same number of lanes as the original vector "
    \n+
    335 "types");
    \n+
    336 static_assert(std::is_same<T, Scalar<W> >::value, "Rebound types "
    \n+
    337 "must have the bound-to scalar type");
    \n+
    338
    \n+
    339 if constexpr (RebindPrune<W>{}) {
    \n+
    340 log_ << "Pruning check of Simd type " << className<W>()
    \n+
    341 << std::endl;
    \n+
    342 }
    \n+
    343 else {
    \n+
    344 using Impl::debugTypes;
    \n+
    345 static_assert(debugTypes<T, V, W>(RebindAccept<W>{}),
    \n+
    346 "Rebind<T, V> is W, but that is not accepted "
    \n+
    347 "by RebindAccept");
    \n+
    348 recurse(MetaType<W>{});
    \n+
    349 }
    \n+
    350 });
    \n+
    351
    \n+
    352 static_assert(std::is_same<Rebind<Scalar<V>, V>, V>::value, "A type "
    \n+
    353 "rebound to its own scalar type must be the same type "
    \n+
    354 "as the original type");
    \n+
    355 static_assert(std::is_same<Rebind<bool, V>, Mask<V> >::value, "A type "
    \n+
    356 "rebound to bool must be the mask type for that type");
    \n+
    357
    \n+
    358 constexpr bool hasBool = Impl::TypeInList<bool, Rebinds>::value;
    \n+
    359 warnMissingMaskRebind<V>(Std::bool_constant<!hasBool>{});
    \n+
    360 }
    \n
    361
    \n-
    368 inline const_iterator find(int proc) const;
    \n-
    369
    \n-
    374 inline const_iterator begin() const;
    \n+
    363 //
    \n+
    364 // Fundamental checks
    \n+
    365 //
    \n+
    366
    \n+
    367 template<class V>
    \n+
    368 void checkLanes()
    \n+
    369 {
    \n+
    370 // check lanes
    \n+
    371 static_assert(std::is_same<std::size_t, decltype(lanes<V>())>::value,
    \n+
    372 "return type of lanes<V>() should be std::size_t");
    \n+
    373 static_assert(std::is_same<std::size_t, decltype(lanes(V{}))>::value,
    \n+
    374 "return type of lanes(V{}) should be std::size_t");
    \n
    375
    \n-
    380 inline const_iterator end() const;
    \n+
    376 // the result of lanes<V>() must be constexpr
    \n+
    377 [[maybe_unused]] constexpr auto size = lanes<V>();
    \n+
    378 // but the result of lanes(vec) does not need to be constexpr
    \n+
    379 DUNE_SIMD_CHECK(lanes<V>() == lanes(V{}));
    \n+
    380 }
    \n
    381
    \n-
    385 template<bool send>
    \n-
    386 inline CollectiveIteratorT iterator() const;
    \n-
    387
    \n-
    391 inline void free();
    \n-
    392
    \n-
    397 inline int neighbours() const;
    \n-
    398
    \n-
    400 inline const ParallelIndexSet& sourceIndexSet() const;
    \n-
    401
    \n-
    403 inline const ParallelIndexSet& destinationIndexSet() const;
    \n-
    404
    \n-
    405 private:
    \n-
    407 RemoteIndices(const RemoteIndices&) = delete;
    \n+
    382 template<class V>
    \n+
    383 void checkDefaultConstruct()
    \n+
    384 {
    \n+
    385 { [[maybe_unused]] V vec; }
    \n+
    386 { [[maybe_unused]] V vec{}; }
    \n+
    387 { [[maybe_unused]] V vec = {}; }
    \n+
    388 }
    \n+
    389
    \n+
    390 template<class V>
    \n+
    391 void checkLane()
    \n+
    392 {
    \n+
    393 // Avoid using broadcast<V>() for initialization to avoid test
    \n+
    394 // interdependencies.
    \n+
    395 V vec(Scalar<V>(0));
    \n+
    396 // check lane() on mutable lvalues
    \n+
    397 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n+
    398 lane(l, vec) = l + 1;
    \n+
    399 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n+
    400 DUNE_SIMD_CHECK(lane(l, vec) == Scalar<V>(l + 1));
    \n+
    401 using MLRes = decltype(lane(0, vec));
    \n+
    402 static_assert(std::is_same<MLRes, Scalar<V>&>::value ||
    \n+
    403 std::is_same<MLRes, std::decay_t<MLRes> >::value,
    \n+
    404 "Result of lane() on a mutable lvalue vector must "
    \n+
    405 "either be a mutable reference to a scalar of that "
    \n+
    406 "vector or a proxy object (which itself may not be a "
    \n+
    407 "reference nor const).");
    \n
    408
    \n-
    410 const ParallelIndexSet* source_;
    \n-
    411
    \n-
    413 const ParallelIndexSet* target_;
    \n-
    414
    \n-
    416 MPI_Comm comm_;
    \n-
    417
    \n-
    420 std::set<int> neighbourIds;
    \n-
    421
    \n-
    423 const static int commTag_=333;
    \n-
    424
    \n-
    429 int sourceSeqNo_;
    \n-
    430
    \n-
    435 int destSeqNo_;
    \n-
    436
    \n-
    440 bool publicIgnored;
    \n-
    441
    \n-
    445 bool firstBuild;
    \n-
    446
    \n-
    447 /*
    \n-
    448 * @brief If true, sending from indices of the processor to other
    \n-
    449 * indices on the same processor is enabled even if the same indexset is used
    \n-
    450 * on both the
    \n-
    451 * sending and receiving side.
    \n-
    452 */
    \n-
    453 bool includeSelf;
    \n-
    454
    \n-\n-
    457 PairType;
    \n-
    458
    \n-
    465 RemoteIndexMap remoteIndices_;
    \n-
    466
    \n-
    477 template<bool ignorePublic>
    \n-
    478 inline void buildRemote(bool includeSelf);
    \n-
    479
    \n-
    485 inline int noPublic(const ParallelIndexSet& indexSet);
    \n+
    409 // check lane() on const lvalues
    \n+
    410 const V &vec2 = vec;
    \n+
    411 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n+
    412 DUNE_SIMD_CHECK(lane(l, vec2) == Scalar<V>(l + 1));
    \n+
    413 using CLRes = decltype(lane(0, vec2));
    \n+
    414 static_assert(std::is_same<CLRes, const Scalar<V>&>::value ||
    \n+
    415 std::is_same<CLRes, std::decay_t<CLRes> >::value,
    \n+
    416 "Result of lane() on a const lvalue vector must "
    \n+
    417 "either be a const lvalue reference to a scalar of that "
    \n+
    418 "vector or a proxy object (which itself may not be a "
    \n+
    419 "reference nor const).");
    \n+
    420 static_assert(!std::is_assignable<CLRes, Scalar<V> >::value,
    \n+
    421 "Result of lane() on a const lvalue vector must not be "
    \n+
    422 "assignable from a scalar.");
    \n+
    423
    \n+
    424 // check lane() on rvalues
    \n+
    425 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n+
    426 DUNE_SIMD_CHECK(lane(l, prvalue(vec)) == Scalar<V>(l + 1));
    \n+
    427 using RRes = decltype(lane(0, prvalue(vec)));
    \n+
    428 // TODO: do we really want to allow Scalar<V>&& here? If we allow it,
    \n+
    429 // then `auto &&res = lane(0, vec*vec);` creates a dangling reference,
    \n+
    430 // and the scalar (and even the vector types) are small enough to be
    \n+
    431 // passed in registers anyway. On the other hand, the only comparable
    \n+
    432 // accessor function in the standard library that I can think of is
    \n+
    433 // std::get(), and that does return an rvalue reference in this
    \n+
    434 // situation. However, that cannot assume anything about the size of
    \n+
    435 // the returned types.
    \n+
    436 static_assert(std::is_same<RRes, Scalar<V> >::value ||
    \n+
    437 std::is_same<RRes, Scalar<V>&&>::value,
    \n+
    438 "Result of lane() on a rvalue vector V must be "
    \n+
    439 "Scalar<V> or Scalar<V>&&.");
    \n+
    440 // Can't assert non-assignable, fails for any typical class,
    \n+
    441 // e.g. std::complex<>. Would need to return const Scalar<V> or const
    \n+
    442 // Scalar<V>&&, which would inhibit moving from the return value.
    \n+
    443 // static_assert(!std::is_assignable<RRes, Scalar<V> >::value,
    \n+
    444 // "Result of lane() on a rvalue vector must not be "
    \n+
    445 // "assignable from a scalar.");
    \n+
    446 }
    \n+
    447
    \n+
    448 // check non-default constructors
    \n+
    449 template<class V>
    \n+
    450 void checkCopyMoveConstruct()
    \n+
    451 {
    \n+
    452 // elided copy/move constructors
    \n+
    453 { V vec (make123<V>()); DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    454 { V vec = make123<V>() ; DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    455 { V vec {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    456 { V vec = {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    457
    \n+
    458 // copy constructors
    \n+
    459 { V ref(make123<V>()); V vec (ref);
    \n+
    460 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n+
    461 { V ref(make123<V>()); V vec = ref ;
    \n+
    462 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n+
    463 { V ref(make123<V>()); V vec {ref};
    \n+
    464 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n+
    465 { V ref(make123<V>()); V vec = {ref};
    \n+
    466 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n+
    467 { const V ref(make123<V>()); V vec (ref);
    \n+
    468 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    469 { const V ref(make123<V>()); V vec = ref ;
    \n+
    470 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    471 { const V ref(make123<V>()); V vec {ref};
    \n+
    472 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    473 { const V ref(make123<V>()); V vec = {ref};
    \n+
    474 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    475
    \n+
    476 // move constructors
    \n+
    477 { V ref(make123<V>()); V vec (std::move(ref));
    \n+
    478 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    479 { V ref(make123<V>()); V vec = std::move(ref) ;
    \n+
    480 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    481 { V ref(make123<V>()); V vec {std::move(ref)};
    \n+
    482 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    483 { V ref(make123<V>()); V vec = {std::move(ref)};
    \n+
    484 DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    485 }
    \n
    486
    \n-
    498 template<bool ignorePublic>
    \n-
    499 inline void packEntries(PairType** myPairs, const ParallelIndexSet& indexSet,
    \n-
    500 char* p_out, MPI_Datatype type, int bufferSize,
    \n-
    501 int* position, int n);
    \n-
    502
    \n-
    516 inline void unpackIndices(RemoteIndexList& remote, int remoteEntries,
    \n-
    517 PairType** local, int localEntries, char* p_in,
    \n-
    518 MPI_Datatype type, int* position, int bufferSize,
    \n-
    519 bool fromOurself);
    \n-
    520
    \n-
    521 inline void unpackIndices(RemoteIndexList& send, RemoteIndexList& receive,
    \n-
    522 int remoteEntries, PairType** localSource,
    \n-
    523 int localSourceEntries, PairType** localDest,
    \n-
    524 int localDestEntries, char* p_in,
    \n-
    525 MPI_Datatype type, int* position, int bufferSize);
    \n-
    526
    \n-
    527 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType** DestPairs,
    \n-
    528 int remoteProc, int sourcePublish, int destPublish,
    \n-
    529 int bufferSize, bool sendTwo, bool fromOurSelf=false);
    \n-
    530 };
    \n-
    \n-
    531
    \n-
    549 template<class T, class A, bool mode>
    \n-
    \n-\n-
    551 {
    \n-
    552
    \n-
    553 template<typename T1, typename A1>
    \n-
    554 friend class RemoteIndices;
    \n-
    555
    \n-
    556 public:
    \n-
    \n-\n-
    558 {};
    \n-
    \n-
    559
    \n-
    568 constexpr static bool MODIFYINDEXSET = mode;
    \n-
    569
    \n-\n-
    574
    \n-\n-
    579
    \n-\n-
    584
    \n-
    588 typedef typename LocalIndex::Attribute Attribute;
    \n-
    589
    \n-\n-
    594
    \n-
    598 typedef A Allocator;
    \n-
    599
    \n-\n-\n-
    603
    \n-\n-
    608
    \n-\n-
    613
    \n-
    627 void insert(const RemoteIndex& index);
    \n+
    487 template<class V>
    \n+
    488 void checkBroadcastVectorConstruct()
    \n+
    489 {
    \n+
    490 // broadcast copy constructors
    \n+
    491 { Scalar<V> ref = 42; V vec (ref);
    \n+
    492 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    493 { Scalar<V> ref = 42; V vec = ref ;
    \n+
    494 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    495 // { Scalar<V> ref = 42; V vec {ref};
    \n+
    496 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    497 // { Scalar<V> ref = 42; V vec = {ref};
    \n+
    498 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    499 { const Scalar<V> ref = 42; V vec (ref);
    \n+
    500 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    501 { const Scalar<V> ref = 42; V vec = ref ;
    \n+
    502 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    503 // { const Scalar<V> ref = 42; V vec {ref};
    \n+
    504 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    505 // { const Scalar<V> ref = 42; V vec = {ref};
    \n+
    506 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    507
    \n+
    508 // broadcast move constructors
    \n+
    509 { Scalar<V> ref = 42; V vec (std::move(ref));
    \n+
    510 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    511 { Scalar<V> ref = 42; V vec = std::move(ref) ;
    \n+
    512 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    513 // { Scalar<V> ref = 42; V vec {std::move(ref)};
    \n+
    514 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    515 // { Scalar<V> ref = 42; V vec = {std::move(ref)};
    \n+
    516 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    517 }
    \n+
    518
    \n+
    519 template<class V>
    \n+
    520 void checkBroadcastMaskConstruct()
    \n+
    521 {
    \n+
    522 // broadcast copy constructors
    \n+
    523 { Scalar<V> ref = 42; V vec (ref);
    \n+
    524 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    525 // { Scalar<V> ref = 42; V vec = ref ;
    \n+
    526 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    527 { Scalar<V> ref = 42; V vec {ref};
    \n+
    528 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    529 // { Scalar<V> ref = 42; V vec = {ref};
    \n+
    530 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    531 { const Scalar<V> ref = 42; V vec (ref);
    \n+
    532 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    533 // { const Scalar<V> ref = 42; V vec = ref ;
    \n+
    534 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    535 { const Scalar<V> ref = 42; V vec {ref};
    \n+
    536 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    537 // { const Scalar<V> ref = 42; V vec = {ref};
    \n+
    538 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    539
    \n+
    540 // broadcast move constructors
    \n+
    541 { Scalar<V> ref = 42; V vec (std::move(ref));
    \n+
    542 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    543 // { Scalar<V> ref = 42; V vec = std::move(ref) ;
    \n+
    544 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    545 { Scalar<V> ref = 42; V vec {std::move(ref)};
    \n+
    546 DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    547 // { Scalar<V> ref = 42; V vec = {std::move(ref)};
    \n+
    548 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    549 }
    \n+
    550
    \n+
    551 // check the implCast function
    \n+
    552 template<class FromV, class ToV>
    \n+
    553 void checkImplCast()
    \n+
    554 {
    \n+
    555 { // lvalue arg
    \n+
    556 FromV fromVec = make123<FromV>();
    \n+
    557 auto toVec = implCast<ToV>(fromVec);
    \n+
    558 static_assert(std::is_same<decltype(toVec), ToV>::value,
    \n+
    559 "Unexpected result type for implCast<ToV>(FromV&)");
    \n+
    560 DUNE_SIMD_CHECK(is123(fromVec));
    \n+
    561 DUNE_SIMD_CHECK(is123(toVec));
    \n+
    562 }
    \n+
    563
    \n+
    564 { // const lvalue arg
    \n+
    565 const FromV fromVec = make123<FromV>();
    \n+
    566 auto toVec = implCast<ToV>(fromVec);
    \n+
    567 static_assert(std::is_same<decltype(toVec), ToV>::value,
    \n+
    568 "Unexpected result type for implCast<ToV>(const "
    \n+
    569 "FromV&)");
    \n+
    570 DUNE_SIMD_CHECK(is123(toVec));
    \n+
    571 }
    \n+
    572
    \n+
    573 { // rvalue arg
    \n+
    574 auto toVec = implCast<ToV>(make123<FromV>());
    \n+
    575 static_assert(std::is_same<decltype(toVec), ToV>::value,
    \n+
    576 "Unexpected result type for implCast<ToV>(FromV&&)");
    \n+
    577 DUNE_SIMD_CHECK(is123(toVec));
    \n+
    578 }
    \n+
    579 }
    \n+
    580
    \n+
    581 // check the implCast function
    \n+
    582 template<class V>
    \n+
    583 void checkImplCast()
    \n+
    584 {
    \n+
    585 // check against LoopSIMD
    \n+
    586 using LoopV = Dune::LoopSIMD<Scalar<V>, lanes<V>()>;
    \n+
    587
    \n+
    588 checkImplCast<V, V>();
    \n+
    589 checkImplCast<V, LoopV>();
    \n+
    590 checkImplCast<LoopV, V>();
    \n+
    591 }
    \n+
    592
    \n+
    593 // check the broadcast function
    \n+
    594 template<class V>
    \n+
    595 void checkBroadcast()
    \n+
    596 {
    \n+
    597 // broadcast function
    \n+
    598 { // lvalue arg
    \n+
    599 Scalar<V> ref = 42;
    \n+
    600 auto vec = broadcast<V>(ref);
    \n+
    601 static_assert(std::is_same<decltype(vec), V>::value,
    \n+
    602 "Unexpected result type for broadcast<V>()");
    \n+
    603 DUNE_SIMD_CHECK(is42(vec));
    \n+
    604 DUNE_SIMD_CHECK(ref == Scalar<V>(42));
    \n+
    605 }
    \n+
    606
    \n+
    607 { // const lvalue arg
    \n+
    608 const Scalar<V> ref = 42;
    \n+
    609 auto vec = broadcast<V>(ref);
    \n+
    610 static_assert(std::is_same<decltype(vec), V>::value,
    \n+
    611 "Unexpected result type for broadcast<V>()");
    \n+
    612 DUNE_SIMD_CHECK(is42(vec));
    \n+
    613 }
    \n+
    614
    \n+
    615 { // rvalue arg
    \n+
    616 auto vec = broadcast<V>(Scalar<V>(42));
    \n+
    617 static_assert(std::is_same<decltype(vec), V>::value,
    \n+
    618 "Unexpected result type for broadcast<V>()");
    \n+
    619 DUNE_SIMD_CHECK(is42(vec));
    \n+
    620 }
    \n+
    621
    \n+
    622 { // int arg
    \n+
    623 auto vec = broadcast<V>(42);
    \n+
    624 static_assert(std::is_same<decltype(vec), V>::value,
    \n+
    625 "Unexpected result type for broadcast<V>()");
    \n+
    626 DUNE_SIMD_CHECK(is42(vec));
    \n+
    627 }
    \n
    628
    \n-
    629
    \n-
    644 void insert(const RemoteIndex& index, const GlobalIndex& global);
    \n+
    629 { // double arg
    \n+
    630 auto vec = broadcast<V>(42.0);
    \n+
    631 static_assert(std::is_same<decltype(vec), V>::value,
    \n+
    632 "Unexpected result type for broadcast<V>()");
    \n+
    633 DUNE_SIMD_CHECK(is42(vec));
    \n+
    634 }
    \n+
    635 }
    \n+
    636
    \n+
    637 template<class V>
    \n+
    638 void checkBracedAssign()
    \n+
    639 {
    \n+
    640 // copy assignment
    \n+
    641 { V ref = make123<V>(); V vec; vec = {ref};
    \n+
    642 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n+
    643 { const V ref = make123<V>(); V vec; vec = {ref};
    \n+
    644 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n
    645
    \n-
    653 bool remove(const GlobalIndex& global);
    \n-
    654
    \n-\n-
    668
    \n+
    646 // move assignment
    \n+
    647 { V vec; vec = {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
    \n+
    648 }
    \n+
    649
    \n+
    650 template<class V>
    \n+
    651 void checkBracedBroadcastAssign()
    \n+
    652 {
    \n+
    653 // nothing works here
    \n+
    654 // // broadcast copy assignment
    \n+
    655 // { Scalar<V> ref = 42; V vec; vec = {ref};
    \n+
    656 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n+
    657 // { const Scalar<V> ref = 42; V vec; vec = {ref};
    \n+
    658 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    659
    \n+
    660 // // broadcast move assignment
    \n+
    661 // { Scalar<V> ref = 42; V vec; vec = {std::move(ref)};
    \n+
    662 // DUNE_SIMD_CHECK(is42(vec)); }
    \n+
    663 }
    \n+
    664
    \n+
    666 //
    \n+
    667 // checks for unary operators
    \n+
    668 //
    \n
    669
    \n-\n-
    671
    \n-
    \n-\n-
    677 : glist_()
    \n-
    678 {}
    \n-
    \n-
    679
    \n-
    680 private:
    \n-
    681
    \n-\n-
    688 RemoteIndexList& rList);
    \n-
    689
    \n-
    690 typedef SLList<GlobalIndex,Allocator> GlobalList;
    \n-
    691 typedef typename GlobalList::ModifyIterator GlobalModifyIterator;
    \n-
    692 RemoteIndexList* rList_;
    \n-
    693 const ParallelIndexSet* indexSet_;
    \n-
    694 GlobalList glist_;
    \n-
    695 ModifyIterator iter_;
    \n-
    696 GlobalModifyIterator giter_;
    \n-
    697 ConstIterator end_;
    \n-
    698 bool first_;
    \n-
    699 GlobalIndex last_;
    \n-
    700 };
    \n-
    \n-
    701
    \n-
    706 template<class T, class A>
    \n-
    \n-\n-
    708 {
    \n-
    709
    \n-
    713 typedef T ParallelIndexSet;
    \n-
    714
    \n-
    718 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n-
    719
    \n-
    723 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n+
    \n+
    670#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL) \\
    \n+
    671 struct OpPostfix##NAME \\
    \n+
    672 { \\
    \n+
    673 template<class V> \\
    \n+
    674 auto operator()(V&& v) const \\
    \n+
    675 -> decltype(std::forward<V>(v) SYMBOL) \\
    \n+
    676 { \\
    \n+
    677 return std::forward<V>(v) SYMBOL; \\
    \n+
    678 } \\
    \n+
    679 }
    \n+
    \n+
    680
    \n+
    \n+
    681#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL) \\
    \n+
    682 struct OpPrefix##NAME \\
    \n+
    683 { \\
    \n+
    684 template<class V> \\
    \n+
    685 auto operator()(V&& v) const \\
    \n+
    686 -> decltype(SYMBOL std::forward<V>(v)) \\
    \n+
    687 { \\
    \n+
    688 return SYMBOL std::forward<V>(v); \\
    \n+
    689 } \\
    \n+
    690 }
    \n+
    \n+
    691
    \n+
    692 DUNE_SIMD_POSTFIX_OP(Decrement, -- );
    \n+
    693 DUNE_SIMD_POSTFIX_OP(Increment, ++ );
    \n+
    694
    \n+
    695 DUNE_SIMD_PREFIX_OP (Decrement, -- );
    \n+
    696 DUNE_SIMD_PREFIX_OP (Increment, ++ );
    \n+
    697
    \n+
    698 DUNE_SIMD_PREFIX_OP (Plus, + );
    \n+
    699 DUNE_SIMD_PREFIX_OP (Minus, - );
    \n+
    700 DUNE_SIMD_PREFIX_OP (LogicNot, ! );
    \n+
    701 // Do not warn about ~ being applied to bool. (1) Yes, doing that is
    \n+
    702 // weird, but we do want to test the weird stuff too. (2) It avoids
    \n+
    703 // running into <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82040> on
    \n+
    704 // g++-7.0 through 7.2. Also, ignore -Wpragmas to not warn about an
    \n+
    705 // unknown -Wbool-operation on compilers that do not know that option.
    \n+
    706#pragma GCC diagnostic push
    \n+
    707#pragma GCC diagnostic ignored "-Wpragmas"
    \n+
    708#pragma GCC diagnostic ignored "-Wunknown-warning-option" // clang 6.0.1
    \n+
    709#pragma GCC diagnostic ignored "-Wbool-operation"
    \n+
    710 DUNE_SIMD_PREFIX_OP (BitNot, ~ );
    \n+
    711#pragma GCC diagnostic pop
    \n+
    712
    \n+
    713#undef DUNE_SIMD_POSTFIX_OP
    \n+
    714#undef DUNE_SIMD_PREFIX_OP
    \n+
    715
    \n+
    716 template<class V, class Op>
    \n+
    717 std::enable_if_t<
    \n+
    718 IsCallable<Op(decltype(lane(0, std::declval<V>())))>::value>
    \n+
    719 checkUnaryOpV(Op op)
    \n+
    720 {
    \n+
    721#define DUNE_SIMD_OPNAME (className<Op(V)>())
    \n+
    722 // arguments
    \n+
    723 auto val = leftVector<std::decay_t<V>>();
    \n
    724
    \n-
    728 typedef typename LocalIndex::Attribute Attribute;
    \n-
    729
    \n-\n-
    732
    \n-
    734 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n-
    735
    \n-\n-
    738
    \n-
    740 typedef std::map<int,std::pair<typename RemoteIndexList::const_iterator,
    \n-
    741 const typename RemoteIndexList::const_iterator> >
    \n-
    742 Map;
    \n-
    743
    \n-
    744 public:
    \n-
    745
    \n-
    747 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n-\n-
    749
    \n-
    755 inline CollectiveIterator(const RemoteIndexMap& map_, bool send);
    \n-
    756
    \n-
    765 inline void advance(const GlobalIndex& global);
    \n-
    766
    \n-
    776 inline void advance(const GlobalIndex& global, const Attribute& attribute);
    \n+
    725 // copy the arguments in case V is a references
    \n+
    726 auto arg = val;
    \n+
    727 auto &&result = op(static_cast<V>(arg));
    \n+
    728 using T = Scalar<std::decay_t<decltype(result)> >;
    \n+
    729 for(std::size_t l = 0; l < lanes(val); ++l)
    \n+
    730 {
    \n+
    731 // `op` might promote the argument. This is a problem if the
    \n+
    732 // argument of the operation on the right of the `==` is
    \n+
    733 // e.g. `(unsigned short)1` and the operation is e.g. unary `-`.
    \n+
    734 // Then the argument is promoted to `int` before applying the
    \n+
    735 // negation, and the result is `(int)-1`. However, the left side of
    \n+
    736 // the `==` is still `(unsigned short)-1`, which typically is the
    \n+
    737 // same as `(unsigned short)65535`. The `==` promotes the left side
    \n+
    738 // before comparing, so that becomes `(int)65535`. It will then
    \n+
    739 // compare `(int)65535` and `(int)-1` and rightly declare them to be
    \n+
    740 // not equal.
    \n+
    741
    \n+
    742 // To work around this, we explicitly convert the right side of the
    \n+
    743 // `==` to the scalar type before comparing.
    \n+\n+
    745 (lane(l, result)
    \n+
    746 == static_cast<T>(op(lane(l, static_cast<V>(val)))));
    \n+
    747 }
    \n+
    748 // op might modify val, verify that any such modification also happens
    \n+
    749 // in the vector case
    \n+
    750 for(std::size_t l = 0; l < lanes<std::decay_t<V> >(); ++l)
    \n+
    751 DUNE_SIMD_CHECK_OP(lane(l, val) == lane(l, arg));
    \n+
    752#undef DUNE_SIMD_OPNAME
    \n+
    753 }
    \n+
    754
    \n+
    755 template<class V, class Op>
    \n+
    756 std::enable_if_t<
    \n+
    757 not IsCallable<Op(decltype(lane(0, std::declval<V>())))>::value>
    \n+
    758 checkUnaryOpV(Op op)
    \n+
    759 {
    \n+
    760 // log_ << "No " << className<Op(decltype(lane(0, std::declval<V>())))>()
    \n+
    761 // << std::endl
    \n+
    762 // << " ==> Not checking " << className<Op(V)>() << std::endl;
    \n+
    763 }
    \n+
    764
    \n+
    765 template<class V, class Op>
    \n+
    766 void checkUnaryOpsV(Op op)
    \n+
    767 {
    \n+
    768 checkUnaryOpV<V&>(op);
    \n+
    769 checkUnaryOpV<const V&>(op);
    \n+
    770 checkUnaryOpV<V&&>(op);
    \n+
    771 }
    \n+
    772
    \n+
    774 //
    \n+
    775 // checks for binary operators
    \n+
    776 //
    \n
    777
    \n-\n-
    779
    \n-
    783 inline bool empty() const;
    \n-
    784
    \n-
    \n-\n-
    792 {
    \n-
    793 public:
    \n-
    794 typedef typename Map::iterator RealIterator;
    \n-
    795 typedef typename Map::iterator ConstRealIterator;
    \n-
    796
    \n-
    797
    \n-
    \n-
    799 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex& index)
    \n-
    800 : iter_(iter), end_(end), index_(index), hasAttribute(false)
    \n-
    801 {
    \n-
    802 // Move to the first valid entry
    \n-
    803 while(iter_!=end_ && iter_->second.first->localIndexPair().global()!=index_)
    \n-
    804 ++iter_;
    \n-
    805 }
    \n-
    \n-
    806
    \n-
    \n-
    807 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex index,
    \n-
    808 Attribute attribute)
    \n-
    809 : iter_(iter), end_(end), index_(index), attribute_(attribute), hasAttribute(true)
    \n-
    810 {
    \n-
    811 // Move to the first valid entry or the end
    \n-
    812 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_
    \n-
    813 || iter_->second.first->localIndexPair().local().attribute()!=attribute))
    \n-
    814 ++iter_;
    \n-
    815 }
    \n-
    \n-
    \n-
    817 iterator(const iterator& other)
    \n-
    818 : iter_(other.iter_), end_(other.end_), index_(other.index_)
    \n-
    819 { }
    \n-
    \n-
    820
    \n-
    \n-\n-
    823 {
    \n-
    824 ++iter_;
    \n-
    825 // If entry is not valid move on
    \n-
    826 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_ ||
    \n-
    827 (hasAttribute &&
    \n-
    828 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))
    \n-
    829 ++iter_;
    \n-
    830 assert(iter_==end_ ||
    \n-
    831 (iter_->second.first->localIndexPair().global()==index_));
    \n-
    832 assert(iter_==end_ || !hasAttribute ||
    \n-
    833 (iter_->second.first->localIndexPair().local().attribute()==attribute_));
    \n-
    834 return *this;
    \n-
    835 }
    \n-
    \n-
    836
    \n-
    \n-
    838 const RemoteIndex& operator*() const
    \n-
    839 {
    \n-
    840 return *(iter_->second.first);
    \n-
    841 }
    \n-
    \n-
    842
    \n-
    \n-
    844 int process() const
    \n-
    845 {
    \n-
    846 return iter_->first;
    \n-
    847 }
    \n+
    778 // The operators contain an `operator()`, which will be invoked for both
    \n+
    779 // scalar and vector arguments. The function `scalar()` is used the
    \n+
    780 // test whether the scalar types support the operation (via
    \n+
    781 // `ScalarResult`). The difference is that `scalar()` should only ever
    \n+
    782 // receive `const`-ref-qualified version of `Scalar<V>`, while the
    \n+
    783 // `operator()` may also be called with proxies representing scalars.
    \n+
    \n+
    784#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL) \\
    \n+
    785 struct OpInfix##NAME \\
    \n+
    786 { \\
    \n+
    787 template<class V1, class V2> \\
    \n+
    788 decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n+
    789 { \\
    \n+
    790 return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n+
    791 } \\
    \n+
    792 template<class S1, class S2> \\
    \n+
    793 auto scalar(S1&& s1, S2&& s2) const \\
    \n+
    794 -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \n+
    795 }
    \n
    \n+
    796
    \n+
    797 // for assign ops, accept only non-const lvalue arguments for scalars.
    \n+
    798 // This is needed for class scalars (e.g. std::complex) because
    \n+
    799 // non-const class rvalues are actually usually assignable. Though that
    \n+
    800 // assignment happens to a temporary, and thus is lost. Except that the
    \n+
    801 // tests would bind the result of the assignment to a reference. And
    \n+
    802 // because that result is returned from a function by reference, even
    \n+
    803 // though it is a temporary passed as an argument to that function,
    \n+
    804 // accessing the result later is undefined behaviour.
    \n+
    \n+
    805#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL) \\
    \n+
    806 struct OpInfix##NAME \\
    \n+
    807 { \\
    \n+
    808 template<class V1, class V2> \\
    \n+
    809 decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n+
    810 { \\
    \n+
    811 return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n+
    812 } \\
    \n+
    813 template<class S1, class S2> \\
    \n+
    814 auto scalar(S1& s1, S2&& s2) const \\
    \n+
    815 -> decltype(s1 SYMBOL std::forward<S2>(s2)); \\
    \n+
    816 }
    \n+
    \n+
    817
    \n+
    \n+
    818#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL) \\
    \n+
    819 struct OpInfix##NAME \\
    \n+
    820 { \\
    \n+
    821 template<class V1, class V2> \\
    \n+
    822 decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n+
    823 { \\
    \n+
    824 return Simd::REPLFN(std::forward<V1>(v1), std::forward<V2>(v2)); \\
    \n+
    825 } \\
    \n+
    826 template<class S1, class S2> \\
    \n+
    827 auto scalar(S1&& s1, S2&& s2) const \\
    \n+
    828 -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \n+
    829 }
    \n+
    \n+
    830
    \n+
    831 DUNE_SIMD_INFIX_OP(Mul, * );
    \n+
    832 DUNE_SIMD_INFIX_OP(Div, / );
    \n+
    833 DUNE_SIMD_INFIX_OP(Remainder, % );
    \n+
    834
    \n+
    835 DUNE_SIMD_INFIX_OP(Plus, + );
    \n+
    836 DUNE_SIMD_INFIX_OP(Minus, - );
    \n+
    837
    \n+
    838 DUNE_SIMD_INFIX_OP(LeftShift, << );
    \n+
    839 DUNE_SIMD_INFIX_OP(RightShift, >> );
    \n+
    840
    \n+
    841 DUNE_SIMD_INFIX_OP(Less, < );
    \n+
    842 DUNE_SIMD_INFIX_OP(Greater, > );
    \n+
    843 DUNE_SIMD_INFIX_OP(LessEqual, <= );
    \n+
    844 DUNE_SIMD_INFIX_OP(GreaterEqual, >= );
    \n+
    845
    \n+
    846 DUNE_SIMD_INFIX_OP(Equal, == );
    \n+
    847 DUNE_SIMD_INFIX_OP(NotEqual, != );
    \n
    848
    \n-
    \n-
    850 const RemoteIndex* operator->() const
    \n-
    851 {
    \n-
    852 return iter_->second.first.operator->();
    \n-
    853 }
    \n-
    \n-
    854
    \n-
    \n-
    856 bool operator==(const iterator& other) const
    \n-
    857 {
    \n-
    858 return other.iter_==iter_;
    \n-
    859 }
    \n-
    \n-
    860
    \n-
    \n-
    862 bool operator!=(const iterator& other) const
    \n-
    863 {
    \n-
    864 return other.iter_!=iter_;
    \n-
    865 }
    \n-
    \n-
    866
    \n-
    867 private:
    \n-
    868 iterator();
    \n+
    849 DUNE_SIMD_INFIX_OP(BitAnd, & );
    \n+
    850 DUNE_SIMD_INFIX_OP(BitXor, ^ );
    \n+
    851 DUNE_SIMD_INFIX_OP(BitOr, | );
    \n+
    852
    \n+
    853 // Those are not supported in any meaningful way by vectorclass
    \n+
    854 // We need to test replacement functions maskAnd() and maskOr() instead.
    \n+
    855 DUNE_SIMD_REPL_OP(LogicAnd, maskAnd, && );
    \n+
    856 DUNE_SIMD_REPL_OP(LogicOr, maskOr, || );
    \n+
    857
    \n+
    858 DUNE_SIMD_ASSIGN_OP(Assign, = );
    \n+
    859 DUNE_SIMD_ASSIGN_OP(AssignMul, *= );
    \n+
    860 DUNE_SIMD_ASSIGN_OP(AssignDiv, /= );
    \n+
    861 DUNE_SIMD_ASSIGN_OP(AssignRemainder, %= );
    \n+
    862 DUNE_SIMD_ASSIGN_OP(AssignPlus, += );
    \n+
    863 DUNE_SIMD_ASSIGN_OP(AssignMinus, -= );
    \n+
    864 DUNE_SIMD_ASSIGN_OP(AssignLeftShift, <<=);
    \n+
    865 DUNE_SIMD_ASSIGN_OP(AssignRightShift, >>=);
    \n+
    866 DUNE_SIMD_ASSIGN_OP(AssignAnd, &= );
    \n+
    867 DUNE_SIMD_ASSIGN_OP(AssignXor, ^= );
    \n+
    868 DUNE_SIMD_ASSIGN_OP(AssignOr, |= );
    \n
    869
    \n-
    870 RealIterator iter_;
    \n-
    871 RealIterator end_;
    \n-
    872 GlobalIndex index_;
    \n-
    873 Attribute attribute_;
    \n-
    874 bool hasAttribute;
    \n-
    875 };
    \n-
    \n+
    870#undef DUNE_SIMD_INFIX_OP
    \n+
    871#undef DUNE_SIMD_REPL_OP
    \n+
    872#undef DUNE_SIMD_ASSIGN_OP
    \n+
    873
    \n+
    874 // just used as a tag
    \n+
    875 struct OpInfixComma {};
    \n
    876
    \n-
    877 iterator begin();
    \n-
    878
    \n-
    879 iterator end();
    \n-
    880
    \n-
    881 private:
    \n-
    882
    \n-
    883 Map map_;
    \n-
    884 GlobalIndex index_;
    \n-
    885 Attribute attribute_;
    \n-
    886 bool noattribute;
    \n-
    887 };
    \n-
    \n-
    888
    \n-
    889 template<typename TG, typename TA>
    \n-
    \n-\n-
    891 {
    \n-
    892 if(type==MPI_DATATYPE_NULL) {
    \n-
    893 int length[2] = {1, 1};
    \n-
    894 MPI_Aint base;
    \n-
    895 MPI_Aint disp[2];
    \n-
    896 MPI_Datatype types[2] = {MPITraits<TG>::getType(),
    \n-\n-\n-
    899 MPI_Get_address(&rep, &base); // lower bound of the datatype
    \n-
    900 MPI_Get_address(&(rep.global_), &disp[0]);
    \n-
    901 MPI_Get_address(&(rep.local_), &disp[1]);
    \n-
    902 for (MPI_Aint& d : disp)
    \n-
    903 d -= base;
    \n-
    904
    \n-
    905 MPI_Datatype tmp;
    \n-
    906 MPI_Type_create_struct(2, length, disp, types, &tmp);
    \n-
    907
    \n-
    908 MPI_Type_create_resized(tmp, 0, sizeof(IndexPair<TG,ParallelLocalIndex<TA> >), &type);
    \n-
    909 MPI_Type_commit(&type);
    \n-
    910
    \n-
    911 MPI_Type_free(&tmp);
    \n-
    912 }
    \n-
    913 return type;
    \n-
    914 }
    \n-
    \n-
    915
    \n-
    916 template<typename TG, typename TA>
    \n-
    917 MPI_Datatype MPITraits<IndexPair<TG,ParallelLocalIndex<TA> > >::type=MPI_DATATYPE_NULL;
    \n-
    918
    \n-
    919 template<typename T1, typename T2>
    \n-
    \n-
    920 RemoteIndex<T1,T2>::RemoteIndex(const T2& attribute, const PairType* local)
    \n-
    921 : localIndex_(local), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n-
    922 {}
    \n-
    \n-
    923
    \n-
    924 template<typename T1, typename T2>
    \n-
    \n-\n-
    926 : localIndex_(0), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n-
    927 {}
    \n-
    \n-
    928
    \n-
    929 template<typename T1, typename T2>
    \n-
    \n-\n-
    931 : localIndex_(0), attribute_()
    \n-
    932 {}
    \n-
    \n-
    933 template<typename T1, typename T2>
    \n-
    \n-
    934 inline bool RemoteIndex<T1,T2>::operator==(const RemoteIndex& ri) const
    \n-
    935 {
    \n-
    936 return localIndex_==ri.localIndex_ && attribute_==ri.attribute;
    \n-
    937 }
    \n-
    \n-
    938
    \n-
    939 template<typename T1, typename T2>
    \n-
    \n-
    940 inline bool RemoteIndex<T1,T2>::operator!=(const RemoteIndex& ri) const
    \n-
    941 {
    \n-
    942 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;
    \n-
    943 }
    \n-
    \n-
    944
    \n-
    945 template<typename T1, typename T2>
    \n-
    \n-
    946 inline const T2 RemoteIndex<T1,T2>::attribute() const
    \n-
    947 {
    \n-
    948 return T2(attribute_);
    \n-
    949 }
    \n-
    \n-
    950
    \n-
    951 template<typename T1, typename T2>
    \n-
    \n-\n-
    953 {
    \n-
    954 return *localIndex_;
    \n-
    955 }
    \n-
    \n-
    956
    \n-
    957 template<typename T, typename A>
    \n-
    \n-\n-
    959 const ParallelIndexSet& destination,
    \n-
    960 const MPI_Comm& comm,
    \n-
    961 const std::vector<int>& neighbours,
    \n-
    962 bool includeSelf_)
    \n-
    963 : source_(&source), target_(&destination), comm_(comm),
    \n-
    964 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n-
    965 includeSelf(includeSelf_)
    \n-
    966 {
    \n-\n-
    968 }
    \n-
    \n-
    969
    \n-
    970 template<typename T, typename A>
    \n-
    \n-\n-
    972 {
    \n-
    973 includeSelf=b;
    \n-
    974 }
    \n-
    \n-
    975
    \n-
    976 template<typename T, typename A>
    \n-
    \n-\n-
    978 : source_(0), target_(0), sourceSeqNo_(-1),
    \n-
    979 destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n-
    980 includeSelf(false)
    \n-
    981 {}
    \n-
    \n-
    982
    \n-
    983 template<class T, typename A>
    \n-
    \n-\n-
    985 const ParallelIndexSet& destination,
    \n-
    986 const MPI_Comm& comm,
    \n-
    987 const std::vector<int>& neighbours)
    \n-
    988 {
    \n-
    989 free();
    \n-
    990 source_ = &source;
    \n-
    991 target_ = &destination;
    \n-
    992 comm_ = comm;
    \n-
    993 firstBuild = true;
    \n-
    994 setNeighbours(neighbours);
    \n-
    995 }
    \n-
    \n-
    996
    \n-
    997 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1000 {
    \n-
    1001 return *source_;
    \n-
    1002 }
    \n-
    \n-
    1003
    \n-
    1004
    \n-
    1005 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1008 {
    \n-
    1009 return *target_;
    \n-
    1010 }
    \n-
    \n-
    1011
    \n-
    1012
    \n-
    1013 template<typename T, typename A>
    \n-
    \n-\n-
    1015 {
    \n-
    1016 free();
    \n-
    1017 }
    \n-
    \n+
    877 template<class T1, class T2>
    \n+
    878 void checkCommaOp(const std::decay_t<T1> &val1,
    \n+
    879 const std::decay_t<T2> &val2)
    \n+
    880 {
    \n+
    881#define DUNE_SIMD_OPNAME (className<OpInfixComma(T1, T2)>())
    \n+
    882 static_assert(std::is_same<decltype((std::declval<T1>(),
    \n+
    883 std::declval<T2>())), T2>::value,
    \n+
    884 "Type and value category of the comma operator must "
    \n+
    885 "match that of the second operand");
    \n+
    886
    \n+
    887 // copy the arguments in case T1 or T2 are references
    \n+
    888 auto arg1 = val1;
    \n+
    889 auto arg2 = val2;
    \n+
    890 // Do not warn that the left side of the comma operator is unused.
    \n+
    891 // Seems to work for g++-4.9 and clang++-3.8. Appears to be harmless
    \n+
    892 // for icpc (14 and 17), and icpc does not seem to issue a warning
    \n+
    893 // anyway.
    \n+
    894#pragma GCC diagnostic push
    \n+
    895#pragma GCC diagnostic ignored "-Wunused-value"
    \n+
    896 auto &&result = (static_cast<T1>(arg1),
    \n+
    897 static_cast<T2>(arg2));
    \n+
    898#pragma GCC diagnostic pop
    \n+
    899 if(std::is_reference<T2>::value)
    \n+
    900 {
    \n+
    901 // comma should return the same object as the second argument for
    \n+
    902 // lvalues and xvalues
    \n+
    903 DUNE_SIMD_CHECK_OP(&result == &arg2);
    \n+
    904 // it should not modify any arguments
    \n+
    905 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1));
    \n+
    906 DUNE_SIMD_CHECK_OP(allTrue(val2 == arg2));
    \n+
    907 }
    \n+
    908 else
    \n+
    909 {
    \n+
    910 // comma should return the same value as the second argument for
    \n+
    911 // prvalues
    \n+
    912 DUNE_SIMD_CHECK_OP(allTrue(result == arg2));
    \n+
    913 // it should not modify any arguments
    \n+
    914 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1));
    \n+
    915 // second argument is a prvalue, any modifications happen to a
    \n+
    916 // temporary and we can't detect them
    \n+
    917 }
    \n+
    918#undef DUNE_SIMD_OPNAME
    \n+
    919 }
    \n+
    920
    \n+
    922 //
    \n+
    923 // checks for vector-vector binary operations
    \n+
    924 //
    \n+
    925
    \n+
    926 // We check the following candidate operation
    \n+
    927 //
    \n+
    928 // vopres = vop1 @ vop2
    \n+
    929 //
    \n+
    930 // against the reference operation
    \n+
    931 //
    \n+
    932 // arefres[l] = aref1[l] @ aref2[l] foreach l
    \n+
    933 //
    \n+
    934 // v... variables are simd-vectors and a... variables are arrays. The
    \n+
    935 // operation may modify the operands, but if is does the modification
    \n+
    936 // needs to happen in both the candidate and the reference.
    \n+
    937 //
    \n+
    938 // We do the following checks:
    \n+
    939 // 1. lanes(vopres) == lanes(vop1)
    \n+
    940 // 2. lane(l, vopres) == arefres[l] foreach l
    \n+
    941 // 3. lane(l, vop1) == aref1[l] foreach l
    \n+
    942 // 4. lane(l, vop2) == aref2[l] foreach l
    \n+
    943 template<class V1, class V2, class Op>
    \n+
    944 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n+
    945 checkBinaryOpVV(MetaType<V1>, MetaType<V2>, Op op)
    \n+
    946 {
    \n+
    947#define DUNE_SIMD_OPNAME (className<Op(V1, V2)>())
    \n+
    948 static_assert(std::is_same<std::decay_t<V1>, std::decay_t<V2> >::value,
    \n+
    949 "Internal testsystem error: called with two types that "
    \n+
    950 "don't decay to the same thing");
    \n+
    951
    \n+
    952 // reference arguments
    \n+
    953 auto vref1 = leftVector<std::decay_t<V1>>();
    \n+
    954 auto vref2 = rightVector<std::decay_t<V2>>();
    \n+
    955
    \n+
    956 // candidate arguments
    \n+
    957 auto vop1 = vref1;
    \n+
    958 auto vop2 = vref2;
    \n+
    959
    \n+
    960 // candidate operation
    \n+
    961 auto &&vopres = op(static_cast<V1>(vop1), static_cast<V2>(vop2));
    \n+
    962 using VR = decltype(vopres);
    \n+
    963
    \n+
    964 // check 1. lanes(vopres) == lanes(vop1)
    \n+
    965 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
    \n+
    966 "The result must have the same number of lanes as the "
    \n+
    967 "operands.");
    \n+
    968
    \n+
    969 // do the reference operation, and simultaneously
    \n+
    970 // check 2. lane(l, vopres) == arefres[l] foreach l
    \n+
    971 using T = Scalar<std::decay_t<VR> >;
    \n+
    972 for(auto l : range(lanes(vopres)))
    \n+
    973 {
    \n+
    974 // see the lengthy comment in `checkUnaryOpV()` as to why the
    \n+
    975 // `static_cast` around the `op()` is necessary
    \n+\n+
    977 (lane(l, vopres)
    \n+
    978 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
    \n+
    979 lane(l, static_cast<V2>(vref2)))));
    \n+
    980 }
    \n+
    981
    \n+
    982 // check 3. lane(l, vop1) == aref1[l] foreach l
    \n+
    983 for(auto l : range(lanes(vop1)))
    \n+
    984 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
    \n+
    985
    \n+
    986 // check 4. lane(l, vop2) == aref2[l] foreach l
    \n+
    987 for(auto l : range(lanes(vop2)))
    \n+
    988 DUNE_SIMD_CHECK_OP(lane(l, vop2) == lane(l, vref2));
    \n+
    989
    \n+
    990#undef DUNE_SIMD_OPNAME
    \n+
    991 }
    \n+
    992
    \n+
    993 template<class V1, class V2, class Op>
    \n+
    994 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n+
    995 checkBinaryOpVV(MetaType<V1>, MetaType<V2>, Op op)
    \n+
    996 {
    \n+
    997 // log_ << "No " << className<Op(decltype(lane(0, std::declval<V1>())),
    \n+
    998 // decltype(lane(0, std::declval<V2>())))>()
    \n+
    999 // << std::endl
    \n+
    1000 // << " ==> Not checking " << className<Op(V1, V2)>() << std::endl;
    \n+
    1001 }
    \n+
    1002
    \n+
    1003 template<class V1, class V2>
    \n+
    1004 void checkBinaryOpVV(MetaType<V1>, MetaType<V2>, OpInfixComma)
    \n+
    1005 {
    \n+
    1006 static_assert(std::is_same<std::decay_t<V1>, std::decay_t<V2> >::value,
    \n+
    1007 "Internal testsystem error: called with two types that "
    \n+
    1008 "don't decay to the same thing");
    \n+
    1009
    \n+
    1010 checkCommaOp<V1, V2>(leftVector<std::decay_t<V1>>(),
    \n+
    1011 rightVector<std::decay_t<V2>>());
    \n+
    1012 }
    \n+
    1013
    \n+
    1015 //
    \n+
    1016 // checks for vector-scalar binary operations
    \n+
    1017 //
    \n
    1018
    \n-
    1019 template<typename T, typename A>
    \n-
    1020 template<bool ignorePublic>
    \n-
    \n-\n-
    1022 const ParallelIndexSet& indexSet,
    \n-
    1023 char* p_out, MPI_Datatype type,
    \n-
    1024 int bufferSize,
    \n-
    1025 int *position,
    \n-
    1026 [[maybe_unused]] int n)
    \n-
    1027 {
    \n-
    1028 // fill with own indices
    \n-
    1029 const auto end = indexSet.end();
    \n-
    1030
    \n-
    1031 //Now pack the source indices
    \n-
    1032 int i=0;
    \n-
    1033 for(auto index = indexSet.begin(); index != end; ++index)
    \n-
    1034 if(ignorePublic || index->local().isPublic()) {
    \n-
    1035
    \n-
    1036 MPI_Pack(const_cast<PairType*>(&(*index)), 1,
    \n-
    1037 type,
    \n-
    1038 p_out, bufferSize, position, comm_);
    \n-
    1039 pairs[i++] = const_cast<PairType*>(&(*index));
    \n-
    1040
    \n-
    1041 }
    \n-
    1042 assert(i==n);
    \n-
    1043 }
    \n-
    \n-
    1044
    \n-
    1045 template<typename T, typename A>
    \n-
    1046 inline int RemoteIndices<T,A>::noPublic(const ParallelIndexSet& indexSet)
    \n-
    1047 {
    \n-
    1048
    \n-
    1049 int noPublic=0;
    \n-
    1050
    \n-
    1051 const auto end=indexSet.end();
    \n-
    1052 for(auto index=indexSet.begin(); index!=end; ++index)
    \n-
    1053 if(index->local().isPublic())
    \n-
    1054 noPublic++;
    \n-
    1055
    \n-
    1056 return noPublic;
    \n-
    1057
    \n-
    1058 }
    \n+
    1019 // We check the following candidate operation
    \n+
    1020 //
    \n+
    1021 // vopres = vop1 @ sop2
    \n+
    1022 //
    \n+
    1023 // against the reference operation
    \n+
    1024 //
    \n+
    1025 // arefres[l] = aref1[l] @ sref2 foreach l
    \n+
    1026 //
    \n+
    1027 // v... variables are simd-vectors, a... variables are arrays, and
    \n+
    1028 // s... variables are scalars. The operation may modify the left
    \n+
    1029 // operand, but if is does the modifications needs to happen in both the
    \n+
    1030 // candidate and the reference.
    \n+
    1031 //
    \n+
    1032 // We do the following checks:
    \n+
    1033 // 1. lanes(vopres) == lanes(vop1)
    \n+
    1034 // 2. lane(l, vopres) == arefres[l] foreach l
    \n+
    1035 // 3. lane(l, vop1) == aref1[l] foreach l
    \n+
    1036 // 4. sop2 is never modified
    \n+
    1037 // 5. sref2 is never modified
    \n+
    1038 //
    \n+
    1039 // In fact, if the property "sref2 is never modified" is violated that
    \n+
    1040 // means the operation is unsuitable for an automatic broadcast of the
    \n+
    1041 // second operand and should not be checked. There are no operations in
    \n+
    1042 // the standard where the second operand is modified like this, but
    \n+
    1043 // there are operations where the first operand is modified -- and this
    \n+
    1044 // check is used for those ops as well by exchanging the first and second
    \n+
    1045 // argument below.
    \n+
    1046
    \n+
    1047 template<class V1, class T2, class Op>
    \n+
    1048 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n+
    1049 checkBinaryOpVS(MetaType<V1>, MetaType<T2>, Op op)
    \n+
    1050 {
    \n+
    1051#define DUNE_SIMD_OPNAME (className<Op(V1, T2)>())
    \n+
    1052 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
    \n+
    1053 std::decay_t<T2> >::value,
    \n+
    1054 "Internal testsystem error: called with a scalar that "
    \n+
    1055 "does not match the vector type.");
    \n+
    1056
    \n+
    1057 // initial values
    \n+
    1058 auto sinit2 = rightScalar<std::decay_t<T2>>();
    \n
    1059
    \n-
    1060
    \n-
    1061 template<typename T, typename A>
    \n-
    1062 inline void RemoteIndices<T,A>::unpackCreateRemote(char* p_in, PairType** sourcePairs,
    \n-
    1063 PairType** destPairs, int remoteProc,
    \n-
    1064 int sourcePublish, int destPublish,
    \n-
    1065 int bufferSize, bool sendTwo,
    \n-
    1066 bool fromOurSelf)
    \n-
    1067 {
    \n-
    1068
    \n-
    1069 // unpack the number of indices we received
    \n-
    1070 int noRemoteSource=-1, noRemoteDest=-1;
    \n-
    1071 char twoIndexSets=0;
    \n-
    1072 int position=0;
    \n-
    1073 // Did we receive two index sets?
    \n-
    1074 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR, comm_);
    \n-
    1075 // The number of source indices received
    \n-
    1076 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT, comm_);
    \n-
    1077 // The number of destination indices received
    \n-
    1078 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);
    \n+
    1060 // reference arguments
    \n+
    1061 auto vref1 = leftVector<std::decay_t<V1>>();
    \n+
    1062 auto sref2 = sinit2;
    \n+
    1063
    \n+
    1064 // candidate arguments
    \n+
    1065 auto vop1 = vref1;
    \n+
    1066 auto sop2 = sref2;
    \n+
    1067
    \n+
    1068 // candidate operation
    \n+
    1069 auto &&vopres = op(static_cast<V1>(vop1), static_cast<T2>(sop2));
    \n+
    1070 using VR = decltype(vopres);
    \n+
    1071
    \n+
    1072 // check 1. lanes(vopres) == lanes(vop1)
    \n+
    1073 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
    \n+
    1074 "The result must have the same number of lanes as the "
    \n+
    1075 "operands.");
    \n+
    1076
    \n+
    1077 // check 4. sop2 is never modified
    \n+
    1078 DUNE_SIMD_CHECK_OP(sop2 == sinit2);
    \n
    1079
    \n-
    1080
    \n-
    1081 // Indices for which we receive
    \n-
    1082 RemoteIndexList* receive= new RemoteIndexList();
    \n-
    1083 // Indices for which we send
    \n-
    1084 RemoteIndexList* send=0;
    \n-
    1085
    \n-
    1086 MPI_Datatype type= MPITraits<PairType>::getType();
    \n-
    1087
    \n-
    1088 if(!twoIndexSets) {
    \n-
    1089 if(sendTwo) {
    \n-
    1090 send = new RemoteIndexList();
    \n-
    1091 // Create both remote index sets simultaneously
    \n-
    1092 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,
    \n-
    1093 destPairs, destPublish, p_in, type, &position, bufferSize);
    \n-
    1094 }else{
    \n-
    1095 // we only need one list
    \n-
    1096 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,
    \n-
    1097 p_in, type, &position, bufferSize, fromOurSelf);
    \n-
    1098 send=receive;
    \n-
    1099 }
    \n-
    1100 }else{
    \n+
    1080 // do the reference operation, and simultaneously check 2. and 5.
    \n+
    1081 using T = Scalar<std::decay_t<decltype(vopres)> >;
    \n+
    1082 for(auto l : range(lanes(vopres)))
    \n+
    1083 {
    \n+
    1084 // check 2. lane(l, vopres) == arefres[l] foreach l
    \n+
    1085 // see the lengthy comment in `checkUnaryOpV()` as to why the
    \n+
    1086 // `static_cast` around the `op()` is necessary
    \n+\n+
    1088 (lane(l, vopres)
    \n+
    1089 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
    \n+
    1090 static_cast<T2>(sref2) )));
    \n+
    1091 // check 5. sref2 is never modified
    \n+
    1092 DUNE_SIMD_CHECK_OP(sref2 == sinit2);
    \n+
    1093 }
    \n+
    1094
    \n+
    1095 // check 3. lane(l, vop1) == aref1[l] foreach l
    \n+
    1096 for(auto l : range(lanes(vop1)))
    \n+
    1097 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
    \n+
    1098
    \n+
    1099#undef DUNE_SIMD_OPNAME
    \n+
    1100 }
    \n
    1101
    \n-
    1102 int oldPos=position;
    \n-
    1103 // Two index sets received
    \n-
    1104 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,
    \n-
    1105 p_in, type, &position, bufferSize, fromOurSelf);
    \n-
    1106 if(!sendTwo)
    \n-
    1107 //unpack source entries again as destination entries
    \n-
    1108 position=oldPos;
    \n-
    1109
    \n-
    1110 send = new RemoteIndexList();
    \n-
    1111 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,
    \n-
    1112 p_in, type, &position, bufferSize, fromOurSelf);
    \n-
    1113 }
    \n-
    1114
    \n-
    1115 if(receive->empty() && send->empty()) {
    \n-
    1116 if(send==receive) {
    \n-
    1117 delete send;
    \n-
    1118 }else{
    \n-
    1119 delete send;
    \n-
    1120 delete receive;
    \n-
    1121 }
    \n-
    1122 }else{
    \n-
    1123 remoteIndices_.insert(std::make_pair(remoteProc,
    \n-
    1124 std::make_pair(send,receive)));
    \n-
    1125 }
    \n-
    1126 }
    \n-
    1127
    \n+
    1102 template<class V1, class T2, class Op>
    \n+
    1103 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n+
    1104 checkBinaryOpVS(MetaType<V1>, MetaType<T2>, Op op)
    \n+
    1105 {
    \n+
    1106 // log_ << "No "
    \n+
    1107 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
    \n+
    1108 // << std::endl
    \n+
    1109 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
    \n+
    1110 }
    \n+
    1111
    \n+
    1112 template<class V1, class T2>
    \n+
    1113 void checkBinaryOpVS(MetaType<V1>, MetaType<T2>, OpInfixComma)
    \n+
    1114 {
    \n+
    1115 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
    \n+
    1116 std::decay_t<T2> >::value,
    \n+
    1117 "Internal testsystem error: called with a scalar that "
    \n+
    1118 "does not match the vector type.");
    \n+
    1119
    \n+
    1120 checkCommaOp<V1, T2>(leftVector<std::decay_t<V1>>(),
    \n+
    1121 rightScalar<std::decay_t<T2>>());
    \n+
    1122 }
    \n+
    1123
    \n+
    1125 //
    \n+
    1126 // cross-check scalar-vector binary operations against vector-vector
    \n+
    1127 //
    \n
    1128
    \n-
    1129 template<typename T, typename A>
    \n-
    1130 template<bool ignorePublic>
    \n-
    1131 inline void RemoteIndices<T,A>::buildRemote(bool includeSelf_)
    \n-
    1132 {
    \n-
    1133 // Processor configuration
    \n-
    1134 int rank, procs;
    \n-
    1135 MPI_Comm_rank(comm_, &rank);
    \n-
    1136 MPI_Comm_size(comm_, &procs);
    \n-
    1137
    \n-
    1138 // number of local indices to publish
    \n-
    1139 // The indices of the destination will be send.
    \n-
    1140 int sourcePublish, destPublish;
    \n-
    1141
    \n-
    1142 // Do we need to send two index sets?
    \n-
    1143 char sendTwo = (source_ != target_);
    \n-
    1144
    \n-
    1145 if(procs==1 && !(sendTwo || includeSelf_))
    \n-
    1146 // Nothing to communicate
    \n-
    1147 return;
    \n-
    1148
    \n-
    1149 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);
    \n-
    1150
    \n-
    1151 if(sendTwo)
    \n-
    1152 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);
    \n-
    1153 else
    \n-
    1154 // we only need to send one set of indices
    \n-
    1155 destPublish = 0;
    \n-
    1156
    \n-
    1157 int maxPublish, publish=sourcePublish+destPublish;
    \n-
    1158
    \n-
    1159 // Calculate maximum number of indices send
    \n-
    1160 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);
    \n-
    1161
    \n-
    1162 // allocate buffers
    \n-
    1163 PairType** destPairs;
    \n-
    1164 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish : 1];
    \n-
    1165
    \n-
    1166 if(sendTwo)
    \n-
    1167 destPairs = new PairType*[destPublish>0 ? destPublish : 1];
    \n-
    1168 else
    \n-
    1169 destPairs=sourcePairs;
    \n+
    1129 // We check the following candidate operation
    \n+
    1130 //
    \n+
    1131 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)
    \n+
    1132 //
    \n+
    1133 // against the reference operation
    \n+
    1134 //
    \n+
    1135 // vrefres = vref1 @ sref2
    \n+
    1136 //
    \n+
    1137 // v... variables are simd-vectors, a... variables are arrays, and
    \n+
    1138 // s... variables are scalars.
    \n+
    1139 //
    \n+
    1140 // We could check the following properties
    \n+
    1141 // 1. lanes(vopres) == lanes(vop1)
    \n+
    1142 // 2. lane(l, vopres) == lane(l, vrefres) foreach l
    \n+
    1143 // 3. lane(l, vop1) == lane(l, vref1) foreach l
    \n+
    1144 // but these are given by checking the operation against the scalar
    \n+
    1145 // operation in the vector@vector and vector@scalar cases above.
    \n+
    1146 //
    \n+
    1147 // The only thing left to check is:
    \n+
    1148 // 4. lane(l, vop2) foreach l is never modified
    \n+
    1149
    \n+
    1150 template<class V1, class T2, class Op>
    \n+
    1151 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n+
    1152 checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, Op op)
    \n+
    1153 {
    \n+
    1154#define DUNE_SIMD_OPNAME (className<Op(V1, T2)>())
    \n+
    1155 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
    \n+
    1156 std::decay_t<T2> >::value,
    \n+
    1157 "Internal testsystem error: called with a scalar that "
    \n+
    1158 "does not match the vector type.");
    \n+
    1159
    \n+
    1160 // initial values
    \n+
    1161 auto sinit2 = rightScalar<std::decay_t<T2>>();
    \n+
    1162
    \n+
    1163 // reference arguments
    \n+
    1164 auto vop1 = leftVector<std::decay_t<V1>>();
    \n+
    1165 using V2 = CopyRefQual<V1, T2>;
    \n+
    1166 std::decay_t<V2> vop2(sinit2);
    \n+
    1167
    \n+
    1168 // candidate operation
    \n+
    1169 op(static_cast<V1>(vop1), static_cast<V2>(vop2));
    \n
    1170
    \n-
    1171 char** buffer = new char*[2];
    \n-
    1172 int bufferSize;
    \n-
    1173 int position=0;
    \n-
    1174 int intSize;
    \n-
    1175 int charSize;
    \n-
    1176
    \n-
    1177 // calculate buffer size
    \n-
    1178 MPI_Datatype type = MPITraits<PairType>::getType();
    \n-
    1179
    \n-
    1180 MPI_Pack_size(maxPublish, type, comm_,
    \n-
    1181 &bufferSize);
    \n-
    1182 MPI_Pack_size(1, MPI_INT, comm_,
    \n-
    1183 &intSize);
    \n-
    1184 MPI_Pack_size(1, MPI_CHAR, comm_,
    \n-
    1185 &charSize);
    \n-
    1186 // Our message will contain the following:
    \n-
    1187 // a bool whether two index sets where sent
    \n-
    1188 // the size of the source and the dest indexset,
    \n-
    1189 // then the source and destination indices
    \n-
    1190 bufferSize += 2 * intSize + charSize;
    \n+
    1171 // 4. lane(l, vop2) foreach l is never modified
    \n+
    1172 for(auto l : range(lanes(vop2)))
    \n+
    1173 DUNE_SIMD_CHECK_OP(lane(l, vop2) == sinit2);
    \n+
    1174
    \n+
    1175#undef DUNE_SIMD_OPNAME
    \n+
    1176 }
    \n+
    1177
    \n+
    1178 template<class V1, class T2, class Op>
    \n+
    1179 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n+
    1180 checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, Op op)
    \n+
    1181 {
    \n+
    1182 // log_ << "No "
    \n+
    1183 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
    \n+
    1184 // << std::endl
    \n+
    1185 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
    \n+
    1186 }
    \n+
    1187
    \n+
    1188 template<class V1, class T2>
    \n+
    1189 void checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, OpInfixComma)
    \n+
    1190 { }
    \n
    1191
    \n-
    1192 if(bufferSize<=0) bufferSize=1;
    \n-
    1193
    \n-
    1194 buffer[0] = new char[bufferSize];
    \n-
    1195 buffer[1] = new char[bufferSize];
    \n+
    1193 //
    \n+
    1194 // checks for vector-proxy binary operations
    \n+
    1195 //
    \n
    1196
    \n-
    1197
    \n-
    1198 // pack entries into buffer[0], p_out below!
    \n-
    1199 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,
    \n-
    1200 comm_);
    \n-
    1201
    \n-
    1202 // The number of indices we send for each index set
    \n-
    1203 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n-
    1204 comm_);
    \n-
    1205 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n-
    1206 comm_);
    \n-
    1207
    \n-
    1208 // Now pack the source indices and setup the destination pairs
    \n-
    1209 packEntries<ignorePublic>(sourcePairs, *source_, buffer[0], type,
    \n-
    1210 bufferSize, &position, sourcePublish);
    \n-
    1211 // If necessary send the dest indices and setup the source pairs
    \n-
    1212 if(sendTwo)
    \n-
    1213 packEntries<ignorePublic>(destPairs, *target_, buffer[0], type,
    \n-
    1214 bufferSize, &position, destPublish);
    \n-
    1215
    \n-
    1216
    \n-
    1217 // Update remote indices for ourself
    \n-
    1218 if(sendTwo|| includeSelf_)
    \n-
    1219 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,
    \n-
    1220 destPublish, bufferSize, sendTwo, includeSelf_);
    \n-
    1221
    \n-
    1222 neighbourIds.erase(rank);
    \n-
    1223
    \n-
    1224 if(neighbourIds.size()==0)
    \n-
    1225 {
    \n-
    1226 Dune::dvverb<<rank<<": Sending messages in a ring"<<std::endl;
    \n-
    1227 // send messages in ring
    \n-
    1228 for(int proc=1; proc<procs; proc++) {
    \n-
    1229 // pointers to the current input and output buffers
    \n-
    1230 char* p_out = buffer[1-(proc%2)];
    \n-
    1231 char* p_in = buffer[proc%2];
    \n-
    1232
    \n-
    1233 MPI_Status status;
    \n-
    1234 if(rank%2==0) {
    \n-
    1235 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n-
    1236 commTag_, comm_);
    \n-
    1237 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n-
    1238 commTag_, comm_, &status);
    \n-
    1239 }else{
    \n-
    1240 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n-
    1241 commTag_, comm_, &status);
    \n-
    1242 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n-
    1243 commTag_, comm_);
    \n-
    1244 }
    \n-
    1245
    \n-
    1246
    \n-
    1247 // The process these indices are from
    \n-
    1248 int remoteProc = (rank+procs-proc)%procs;
    \n-
    1249
    \n-
    1250 unpackCreateRemote(p_in, sourcePairs, destPairs, remoteProc, sourcePublish,
    \n-
    1251 destPublish, bufferSize, sendTwo);
    \n-
    1252
    \n-
    1253 }
    \n-
    1254
    \n-
    1255 }
    \n-
    1256 else
    \n-
    1257 {
    \n-
    1258 MPI_Request* requests=new MPI_Request[neighbourIds.size()];
    \n-
    1259 MPI_Request* req=requests;
    \n-
    1260
    \n-
    1261 typedef typename std::set<int>::size_type size_type;
    \n-
    1262 size_type noNeighbours=neighbourIds.size();
    \n-
    1263
    \n-
    1264 // setup sends
    \n-
    1265 for(std::set<int>::iterator neighbour=neighbourIds.begin();
    \n-
    1266 neighbour!= neighbourIds.end(); ++neighbour) {
    \n-
    1267 // Only send the information to the neighbouring processors
    \n-
    1268 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_, req++);
    \n-
    1269 }
    \n-
    1270
    \n-
    1271 //Test for received messages
    \n-
    1272
    \n-
    1273 for(size_type received=0; received <noNeighbours; ++received)
    \n-
    1274 {
    \n-
    1275 MPI_Status status;
    \n-
    1276 // probe for next message
    \n-
    1277 MPI_Probe(MPI_ANY_SOURCE, commTag_, comm_, &status);
    \n-
    1278 int remoteProc=status.MPI_SOURCE;
    \n-
    1279 int size;
    \n-
    1280 MPI_Get_count(&status, MPI_PACKED, &size);
    \n-
    1281 // receive message
    \n-
    1282 MPI_Recv(buffer[1], size, MPI_PACKED, remoteProc,
    \n-
    1283 commTag_, comm_, &status);
    \n-
    1284
    \n-
    1285 unpackCreateRemote(buffer[1], sourcePairs, destPairs, remoteProc, sourcePublish,
    \n-
    1286 destPublish, bufferSize, sendTwo);
    \n-
    1287 }
    \n-
    1288 // wait for completion of pending requests
    \n-
    1289 MPI_Status* statuses = new MPI_Status[neighbourIds.size()];
    \n-
    1290
    \n-
    1291 if(MPI_ERR_IN_STATUS==MPI_Waitall(neighbourIds.size(), requests, statuses)) {
    \n-
    1292 for(size_type i=0; i < neighbourIds.size(); ++i)
    \n-
    1293 if(statuses[i].MPI_ERROR!=MPI_SUCCESS) {
    \n-
    1294 std::cerr<<rank<<": MPI_Error occurred while receiving message."<<std::endl;
    \n-
    1295 MPI_Abort(comm_, 999);
    \n-
    1296 }
    \n-
    1297 }
    \n-
    1298 delete[] requests;
    \n-
    1299 delete[] statuses;
    \n-
    1300 }
    \n-
    1301
    \n-
    1302
    \n-
    1303 // delete allocated memory
    \n-
    1304 if(destPairs!=sourcePairs)
    \n-
    1305 delete[] destPairs;
    \n-
    1306
    \n-
    1307 delete[] sourcePairs;
    \n-
    1308 delete[] buffer[0];
    \n-
    1309 delete[] buffer[1];
    \n-
    1310 delete[] buffer;
    \n-
    1311 }
    \n-
    1312
    \n-
    1313 template<typename T, typename A>
    \n-
    1314 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& remote,
    \n-
    1315 int remoteEntries,
    \n-
    1316 PairType** local,
    \n-
    1317 int localEntries,
    \n-
    1318 char* p_in,
    \n-
    1319 MPI_Datatype type,
    \n-
    1320 int* position,
    \n-
    1321 int bufferSize,
    \n-
    1322 bool fromOurSelf)
    \n-
    1323 {
    \n-
    1324 if(remoteEntries==0)
    \n-
    1325 return;
    \n-
    1326
    \n-
    1327 PairType index;
    \n-
    1328 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1329 type, comm_);
    \n-
    1330 GlobalIndex oldGlobal=index.global();
    \n-
    1331 int n_in=0, localIndex=0;
    \n-
    1332
    \n-
    1333 //Check if we know the global index
    \n-
    1334 while(localIndex<localEntries) {
    \n-
    1335 if(local[localIndex]->global()==index.global()) {
    \n-
    1336 int oldLocalIndex=localIndex;
    \n+
    1197 // We check the following candidate operation
    \n+
    1198 //
    \n+
    1199 // vopres = vop1 @ pop2
    \n+
    1200 //
    \n+
    1201 // against the reference operation
    \n+
    1202 //
    \n+
    1203 // arefres[l] = aref1[l] @ sref2 foreach l
    \n+
    1204 //
    \n+
    1205 // v... variables are simd-vectors, a... variables are arrays,
    \n+
    1206 // p... variables are proxies of simd-vector entries and s... variables
    \n+
    1207 // are scalars. The operation may modify the left operand, but if is
    \n+
    1208 // does the modifications needs to happen in both the candidate and the
    \n+
    1209 // reference.
    \n+
    1210 //
    \n+
    1211 // We do the following checks:
    \n+
    1212 // 1. lanes(vopres) == lanes(vop1)
    \n+
    1213 // 2. lane(l, vopres) == arefres[l] foreach l
    \n+
    1214 // 3. lane(l, vop1) == aref1[l] foreach l
    \n+
    1215 // 4. pop2 is never modified
    \n+
    1216 // 5. sref2 is never modified
    \n+
    1217 //
    \n+
    1218 // In fact, if the property "sref2 is never modified" is violated that
    \n+
    1219 // means the operation is unsuitable for an automatic broadcast of the
    \n+
    1220 // second operand and should not be checked. There are no operations in
    \n+
    1221 // the standard where the second operand is modified like this, but
    \n+
    1222 // there are operations where the first operand is modified -- and this
    \n+
    1223 // check is used for those ops as well by exchanging the first and second
    \n+
    1224 // argument below.
    \n+
    1225
    \n+
    1226 template<class V1, class V2, class Op>
    \n+
    1227 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n+
    1228 checkBinaryOpVP(MetaType<V1>, MetaType<V2>, Op op)
    \n+
    1229 {
    \n+
    1230 using P2 = decltype(lane(0, std::declval<V2>()));
    \n+
    1231 using T2 = CopyRefQual<Scalar<V2>, V2>;
    \n+
    1232#define DUNE_SIMD_OPNAME (className<Op(V1, P2)>())
    \n+
    1233 static_assert(std::is_same<Scalar<V1>, Scalar<V2> >::value,
    \n+
    1234 "Internal testsystem error: called with two vector "
    \n+
    1235 "types whose scalar types don't match.");
    \n+
    1236
    \n+
    1237 // initial values
    \n+
    1238 auto sinit2 = rightScalar<Scalar<V2>>();
    \n+
    1239
    \n+
    1240 // reference arguments
    \n+
    1241 auto vref1 = leftVector<std::decay_t<V1>>();
    \n+
    1242 auto sref2 = sinit2;
    \n+
    1243
    \n+
    1244 // candidate arguments
    \n+
    1245 auto vop1 = vref1;
    \n+
    1246 auto vop2 = std::decay_t<V2>(Scalar<V2>(0));
    \n+
    1247 lane(0, vop2) = sref2; // pop2 is just a name for `lane(0, vop2)`
    \n+
    1248
    \n+
    1249 // candidate operation
    \n+
    1250 auto &&vopres =
    \n+
    1251 op(static_cast<V1>(vop1), lane(0, static_cast<V2>(vop2)));
    \n+
    1252 using VR = decltype(vopres);
    \n+
    1253
    \n+
    1254 // check 1. lanes(vopres) == lanes(vop1)
    \n+
    1255 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
    \n+
    1256 "The result must have the same number of lanes as the "
    \n+
    1257 "operands.");
    \n+
    1258
    \n+
    1259 // check 4. pop2 is never modified
    \n+
    1260 DUNE_SIMD_CHECK_OP(lane(0, vop2) == sinit2);
    \n+
    1261
    \n+
    1262 // do the reference operation, and simultaneously check 2. and 5.
    \n+
    1263 using T = Scalar<decltype(vopres)>;
    \n+
    1264 for(auto l : range(lanes(vopres)))
    \n+
    1265 {
    \n+
    1266 // check 2. lane(l, vopres) == arefres[l] foreach l
    \n+
    1267 // see the lengthy comment in `checkUnaryOpV()` as to why the
    \n+
    1268 // `static_cast` around the `op()` is necessary
    \n+\n+
    1270 (lane(l, vopres)
    \n+
    1271 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
    \n+
    1272 static_cast<T2>(sref2) )));
    \n+
    1273 // check 5. sref2 is never modified
    \n+
    1274 DUNE_SIMD_CHECK_OP(sref2 == sinit2);
    \n+
    1275 }
    \n+
    1276
    \n+
    1277 // check 3. lane(l, vop1) == aref1[l] foreach l
    \n+
    1278 for(auto l : range(lanes(vop1)))
    \n+
    1279 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
    \n+
    1280
    \n+
    1281#undef DUNE_SIMD_OPNAME
    \n+
    1282 }
    \n+
    1283
    \n+
    1284 template<class V1, class V2, class Op>
    \n+
    1285 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n+
    1286 checkBinaryOpVP(MetaType<V1>, MetaType<V2>, Op op)
    \n+
    1287 {
    \n+
    1288 // log_ << "No "
    \n+
    1289 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
    \n+
    1290 // << std::endl
    \n+
    1291 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
    \n+
    1292 }
    \n+
    1293
    \n+
    1294 template<class V1, class V2>
    \n+
    1295 void checkBinaryOpVP(MetaType<V1>, MetaType<V2>, OpInfixComma)
    \n+
    1296 {
    \n+
    1297 // Don't really know how to check comma operator for proxies
    \n+
    1298 }
    \n+
    1299
    \n+
    1301 //
    \n+
    1302 // checks for (scalar/proxy)-vector binary operations
    \n+
    1303 //
    \n+
    1304
    \n+
    1305 template<class Op>
    \n+
    1306 struct OpInfixSwappedArgs
    \n+
    1307 {
    \n+
    1308 Op orig;
    \n+
    1309
    \n+
    1310 template<class V1, class V2>
    \n+
    1311 decltype(auto) operator()(V1&& v1, V2&& v2) const
    \n+
    1312 {
    \n+
    1313 return orig(std::forward<V2>(v2), std::forward<V1>(v1));
    \n+
    1314 }
    \n+
    1315 template<class S1, class S2>
    \n+
    1316 auto scalar(S1&& s1, S2&& s2) const
    \n+
    1317 -> decltype(orig.scalar(std::forward<S2>(s2), std::forward<S1>(s1)));
    \n+
    1318 };
    \n+
    1319
    \n+
    1320 template<class T1, class V2, class Op>
    \n+
    1321 void checkBinaryOpSV(MetaType<T1> t1, MetaType<V2> v2, Op op)
    \n+
    1322 {
    \n+
    1323 checkBinaryOpVS(v2, t1, OpInfixSwappedArgs<Op>{op});
    \n+
    1324 }
    \n+
    1325
    \n+
    1326 template<class T1, class V2>
    \n+
    1327 void checkBinaryOpSV(MetaType<T1>, MetaType<V2>, OpInfixComma)
    \n+
    1328 {
    \n+
    1329 static_assert(std::is_same<std::decay_t<T1>,
    \n+
    1330 Scalar<std::decay_t<V2> > >::value,
    \n+
    1331 "Internal testsystem error: called with a scalar that "
    \n+
    1332 "does not match the vector type.");
    \n+
    1333
    \n+
    1334 checkCommaOp<T1, V2>(leftScalar<std::decay_t<T1>>(),
    \n+
    1335 rightVector<std::decay_t<V2>>());
    \n+
    1336 }
    \n
    1337
    \n-
    1338 while(localIndex<localEntries &&
    \n-
    1339 local[localIndex]->global()==index.global()) {
    \n-
    1340 if(!fromOurSelf || index.local().attribute() !=
    \n-
    1341 local[localIndex]->local().attribute())
    \n-
    1342 // if index is from us it has to have a different attribute
    \n-
    1343 remote.push_back(RemoteIndex(index.local().attribute(),
    \n-
    1344 local[localIndex]));
    \n-
    1345 localIndex++;
    \n-
    1346 }
    \n-
    1347
    \n-
    1348 // unpack next remote index
    \n-
    1349 if((++n_in) < remoteEntries) {
    \n-
    1350 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1351 type, comm_);
    \n-
    1352 if(index.global()==oldGlobal)
    \n-
    1353 // Restart comparison for the same global indices
    \n-
    1354 localIndex=oldLocalIndex;
    \n-
    1355 else
    \n-
    1356 oldGlobal=index.global();
    \n-
    1357 }else{
    \n-
    1358 // No more received indices
    \n-
    1359 break;
    \n-
    1360 }
    \n-
    1361 continue;
    \n-
    1362 }
    \n-
    1363
    \n-
    1364 if (local[localIndex]->global()<index.global()) {
    \n-
    1365 // compare with next entry in our list
    \n-
    1366 ++localIndex;
    \n-
    1367 }else{
    \n-
    1368 // We do not know the index, unpack next
    \n-
    1369 if((++n_in) < remoteEntries) {
    \n-
    1370 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1371 type, comm_);
    \n-
    1372 oldGlobal=index.global();
    \n-
    1373 }else
    \n-
    1374 // No more received indices
    \n-
    1375 break;
    \n-
    1376 }
    \n-
    1377 }
    \n-
    1378
    \n-
    1379 // Unpack the other received indices without doing anything
    \n-
    1380 while(++n_in < remoteEntries)
    \n-
    1381 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1382 type, comm_);
    \n-
    1383 }
    \n-
    1384
    \n+
    1338 template<class V1, class V2, class Op>
    \n+
    1339 void checkBinaryOpPV(MetaType<V1> v1, MetaType<V2> v2, Op op)
    \n+
    1340 {
    \n+
    1341 checkBinaryOpVP(v2, v1, OpInfixSwappedArgs<Op>{op});
    \n+
    1342 }
    \n+
    1343
    \n+
    1344 template<class V1, class V2>
    \n+
    1345 void checkBinaryOpPV(MetaType<V1>, MetaType<V2>, OpInfixComma)
    \n+
    1346 {
    \n+
    1347 // Don't really know how to check comma operator for proxies
    \n+
    1348 }
    \n+
    1349
    \n+
    1351 //
    \n+
    1352 // cross-check scalar-vector binary operations against vector-vector
    \n+
    1353 //
    \n+
    1354
    \n+
    1355 // We check the following candidate operation
    \n+
    1356 //
    \n+
    1357 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)
    \n+
    1358 //
    \n+
    1359 // against the reference operation
    \n+
    1360 //
    \n+
    1361 // vrefres = vref1 @ sref2
    \n+
    1362 //
    \n+
    1363 // v... variables are simd-vectors, a... variables are arrays, and
    \n+
    1364 // s... variables are scalars.
    \n+
    1365 //
    \n+
    1366 // We could check the following properties
    \n+
    1367 // 1. lanes(vopres) == lanes(vop1)
    \n+
    1368 // 2. lane(l, vopres) == lane(l, vrefres) foreach l
    \n+
    1369 // 3. lane(l, vop1) == lane(l, vref1) foreach l
    \n+
    1370 // but these are given by checking the operation against the scalar
    \n+
    1371 // operation in the vector@vector and vector@scalar cases above.
    \n+
    1372 //
    \n+
    1373 // The only thing left to check is:
    \n+
    1374 // 4. lane(l, vop2) foreach l is never modified
    \n+
    1375
    \n+
    1376 template<class T1, class V2, class Op>
    \n+
    1377 void checkBinaryOpVVAgainstSV(MetaType<T1> t1, MetaType<V2> v2, Op op)
    \n+
    1378 {
    \n+
    1379 checkBinaryOpVVAgainstVS(v2, t1, OpInfixSwappedArgs<Op>{op});
    \n+
    1380 }
    \n+
    1381
    \n+
    1382 template<class V1, class T2>
    \n+
    1383 void checkBinaryOpVVAgainstSV(MetaType<V1>, MetaType<T2>, OpInfixComma)
    \n+
    1384 { }
    \n
    1385
    \n-
    1386 template<typename T, typename A>
    \n-
    1387 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& send,
    \n-
    1388 RemoteIndexList& receive,
    \n-
    1389 int remoteEntries,
    \n-
    1390 PairType** localSource,
    \n-
    1391 int localSourceEntries,
    \n-
    1392 PairType** localDest,
    \n-
    1393 int localDestEntries,
    \n-
    1394 char* p_in,
    \n-
    1395 MPI_Datatype type,
    \n-
    1396 int* position,
    \n-
    1397 int bufferSize)
    \n-
    1398 {
    \n-
    1399 int n_in=0, sourceIndex=0, destIndex=0;
    \n-
    1400
    \n-
    1401 //Check if we know the global index
    \n-
    1402 while(n_in<remoteEntries && (sourceIndex<localSourceEntries || destIndex<localDestEntries)) {
    \n-
    1403 // Unpack next index
    \n-
    1404 PairType index;
    \n-
    1405 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n-
    1406 type, comm_);
    \n-
    1407 n_in++;
    \n-
    1408
    \n-
    1409 // Advance until global index in localSource and localDest are >= than the one in the unpacked index
    \n-
    1410 while(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()<index.global())
    \n-
    1411 sourceIndex++;
    \n-
    1412
    \n-
    1413 while(destIndex<localDestEntries && localDest[destIndex]->global()<index.global())
    \n-
    1414 destIndex++;
    \n-
    1415
    \n-
    1416 // Add a remote index if we found the global index.
    \n-
    1417 if(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()==index.global())
    \n-
    1418 send.push_back(RemoteIndex(index.local().attribute(),
    \n-
    1419 localSource[sourceIndex]));
    \n+
    1387 //
    \n+
    1388 // Invoke the checks for all combinations
    \n+
    1389 //
    \n+
    1390
    \n+
    1391 template<class T1, class T2, bool condition, class Checker>
    \n+
    1392 void checkBinaryRefQual(Checker checker)
    \n+
    1393 {
    \n+
    1394 if constexpr (condition) {
    \n+
    1395 Hybrid::forEach(TypeList<T1&, const T1&, T1&&>{}, [=] (auto t1) {
    \n+
    1396 Hybrid::forEach(TypeList<T2&, const T2&, T2&&>{}, [=] (auto t2) {
    \n+
    1397 checker(t1, t2);
    \n+
    1398 });
    \n+
    1399 });
    \n+
    1400 }
    \n+
    1401 }
    \n+
    1402
    \n+
    1403 template<class V, class Checker>
    \n+
    1404 void checkBinaryOps(Checker checker)
    \n+
    1405 {
    \n+
    1406 using Std::bool_constant;
    \n+
    1407
    \n+
    1408 constexpr bool isMask = std::is_same<Scalar<V>, bool>::value;
    \n+
    1409
    \n+
    1410 constexpr bool do_ = false;
    \n+
    1411 constexpr bool do_SV = true;
    \n+
    1412 constexpr bool do_VV = true;
    \n+
    1413 constexpr bool do_VS = true;
    \n+
    1414
    \n+
    1415#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) \\
    \n+
    1416 checker(bool_constant<isMask ? do_##M1 : do_##V1>{}, \\
    \n+
    1417 bool_constant<isMask ? do_##M2 : do_##V2>{}, \\
    \n+
    1418 bool_constant<isMask ? do_##M3 : do_##V3>{}, \\
    \n+
    1419 Op##NAME{})
    \n
    1420
    \n-
    1421 if(destIndex < localDestEntries && localDest[destIndex]->global() == index.global())
    \n-
    1422 receive.push_back(RemoteIndex(index.local().attribute(),
    \n-
    1423 localDest[sourceIndex]));
    \n-
    1424 }
    \n-
    1425
    \n-
    1426 }
    \n-
    1427
    \n-
    1428 template<typename T, typename A>
    \n-
    \n-\n-
    1430 {
    \n-
    1431 auto lend = remoteIndices_.end();
    \n-
    1432 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {
    \n-
    1433 if(lists->second.first==lists->second.second) {
    \n-
    1434 // there is only one remote index list.
    \n-
    1435 delete lists->second.first;
    \n-
    1436 }else{
    \n-
    1437 delete lists->second.first;
    \n-
    1438 delete lists->second.second;
    \n-
    1439 }
    \n-
    1440 }
    \n-
    1441 remoteIndices_.clear();
    \n-
    1442 firstBuild=true;
    \n-
    1443 }
    \n-
    \n+
    1421 // (Mask , Vector , Name );
    \n+
    1422
    \n+
    1423 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMul );
    \n+
    1424 DUNE_SIMD_DO( , , , SV, VV, VS, InfixDiv );
    \n+
    1425 DUNE_SIMD_DO( , , , SV, VV, VS, InfixRemainder );
    \n+
    1426
    \n+
    1427 DUNE_SIMD_DO( , , , SV, VV, VS, InfixPlus );
    \n+
    1428 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMinus );
    \n+
    1429
    \n+
    1430 DUNE_SIMD_DO( , , , , VV, VS, InfixLeftShift );
    \n+
    1431 DUNE_SIMD_DO( , , , , VV, VS, InfixRightShift );
    \n+
    1432
    \n+
    1433 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLess );
    \n+
    1434 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreater );
    \n+
    1435 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLessEqual );
    \n+
    1436 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreaterEqual );
    \n+
    1437
    \n+
    1438 DUNE_SIMD_DO( , , , SV, VV, VS, InfixEqual );
    \n+
    1439 DUNE_SIMD_DO( , , , SV, VV, VS, InfixNotEqual );
    \n+
    1440
    \n+
    1441 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitAnd );
    \n+
    1442 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitXor );
    \n+
    1443 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitOr );
    \n
    1444
    \n-
    1445 template<typename T, typename A>
    \n-
    \n-\n-
    1447 {
    \n-
    1448 return remoteIndices_.size();
    \n-
    1449 }
    \n-
    \n-
    1450
    \n-
    1451 template<typename T, typename A>
    \n-
    1452 template<bool ignorePublic>
    \n-
    \n-\n-
    1454 {
    \n-
    1455 // Test whether a rebuild is Needed.
    \n-
    1456 if(firstBuild ||
    \n-
    1457 ignorePublic!=publicIgnored || !
    \n-
    1458 isSynced()) {
    \n-
    1459 free();
    \n-
    1460
    \n-
    1461 buildRemote<ignorePublic>(includeSelf);
    \n-
    1462
    \n-
    1463 sourceSeqNo_ = source_->seqNo();
    \n-
    1464 destSeqNo_ = target_->seqNo();
    \n-
    1465 firstBuild=false;
    \n-
    1466 publicIgnored=ignorePublic;
    \n-
    1467 }
    \n-
    1468
    \n+
    1445 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicAnd );
    \n+
    1446 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicOr );
    \n+
    1447
    \n+
    1448 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssign );
    \n+
    1449 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMul );
    \n+
    1450 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignDiv );
    \n+
    1451 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRemainder );
    \n+
    1452 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignPlus );
    \n+
    1453 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMinus );
    \n+
    1454 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignLeftShift );
    \n+
    1455 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRightShift);
    \n+
    1456 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignAnd );
    \n+
    1457 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignXor );
    \n+
    1458 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignOr );
    \n+
    1459
    \n+
    1460 DUNE_SIMD_DO(SV, VV, VS, SV, , VS, InfixComma );
    \n+
    1461
    \n+
    1462#undef DUNE_SIMD_DO
    \n+
    1463 }
    \n+
    1464
    \n+
    1466 //
    \n+
    1467 // SIMD interface functions
    \n+
    1468 //
    \n
    1469
    \n-
    1470 }
    \n-
    \n-
    1471
    \n-
    1472 template<typename T, typename A>
    \n-
    \n-\n-
    1474 {
    \n-
    1475 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();
    \n-
    1476 }
    \n-
    \n-
    1477
    \n-
    1478 template<typename T, typename A>
    \n-
    1479 template<bool mode, bool send>
    \n-
    \n-\n-
    1481 {
    \n-
    1482
    \n-
    1483 // The user are on their own now!
    \n-
    1484 // We assume they know what they are doing and just set the
    \n-
    1485 // remote indices to synced status.
    \n-
    1486 sourceSeqNo_ = source_->seqNo();
    \n-
    1487 destSeqNo_ = target_->seqNo();
    \n-
    1488
    \n-
    1489 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);
    \n-
    1490
    \n-
    1491 if(found == remoteIndices_.end())
    \n-
    1492 {
    \n-
    1493 if(source_ != target_)
    \n-
    1494 found = remoteIndices_.insert(found, std::make_pair(process,
    \n-
    1495 std::make_pair(new RemoteIndexList(),
    \n-
    1496 new RemoteIndexList())));
    \n-
    1497 else{
    \n-
    1498 RemoteIndexList* rlist = new RemoteIndexList();
    \n-
    1499 found = remoteIndices_.insert(found,
    \n-
    1500 std::make_pair(process,
    \n-
    1501 std::make_pair(rlist, rlist)));
    \n-
    1502 }
    \n-
    1503 }
    \n-
    1504
    \n-
    1505 firstBuild = false;
    \n-
    1506
    \n-
    1507 if(send)
    \n-
    1508 return RemoteIndexListModifier<T,A,mode>(*source_, *(found->second.first));
    \n-
    1509 else
    \n-
    1510 return RemoteIndexListModifier<T,A,mode>(*target_, *(found->second.second));
    \n-
    1511 }
    \n-
    \n-
    1512
    \n-
    1513 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1516 {
    \n-
    1517 return remoteIndices_.find(proc);
    \n-
    1518 }
    \n-
    \n-
    1519
    \n-
    1520 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1523 {
    \n-
    1524 return remoteIndices_.begin();
    \n-
    1525 }
    \n-
    \n-
    1526
    \n-
    1527 template<typename T, typename A>
    \n-\n-
    \n-\n-
    1530 {
    \n-
    1531 return remoteIndices_.end();
    \n-
    1532 }
    \n-
    \n-
    1533
    \n-
    1534
    \n-
    1535 template<typename T, typename A>
    \n-
    \n-\n-
    1537 {
    \n-
    1538 if(neighbours()!=ri.neighbours())
    \n-
    1539 return false;
    \n-
    1540
    \n-
    1541 const auto rend = remoteIndices_.end();
    \n-
    1542
    \n-
    1543 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin(); rindex!=rend; ++rindex, ++rindex1) {
    \n-
    1544 if(rindex->first != rindex1->first)
    \n-
    1545 return false;
    \n-
    1546 if(*(rindex->second.first) != *(rindex1->second.first))
    \n-
    1547 return false;
    \n-
    1548 if(*(rindex->second.second) != *(rindex1->second.second))
    \n-
    1549 return false;
    \n-
    1550 }
    \n-
    1551 return true;
    \n-
    1552 }
    \n-
    \n-
    1553
    \n-
    1554 template<class T, class A, bool mode>
    \n-\n-
    1556 RemoteIndexList& rList)
    \n-
    1557 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_(rList.end()), first_(true)
    \n-
    1558 {
    \n-
    1559 if(MODIFYINDEXSET) {
    \n-
    1560 assert(indexSet_);
    \n-
    1561 for(ConstIterator iter=iter_; iter != end_; ++iter)
    \n-
    1562 glist_.push_back(iter->localIndexPair().global());
    \n-
    1563 giter_ = glist_.beginModify();
    \n-
    1564 }
    \n-
    1565 }
    \n+
    1470 template<class V>
    \n+
    1471 void checkAutoCopy()
    \n+
    1472 {
    \n+
    1473 using RValueResult = decltype(autoCopy(lane(0, std::declval<V>())));
    \n+
    1474 static_assert(std::is_same<RValueResult, Scalar<V> >::value,
    \n+
    1475 "Result of autoCopy() must always be Scalar<V>");
    \n+
    1476
    \n+
    1477 using MutableLValueResult =
    \n+
    1478 decltype(autoCopy(lane(0, std::declval<V&>())));
    \n+
    1479 static_assert(std::is_same<MutableLValueResult, Scalar<V> >::value,
    \n+
    1480 "Result of autoCopy() must always be Scalar<V>");
    \n+
    1481
    \n+
    1482 using ConstLValueResult =
    \n+
    1483 decltype(autoCopy(lane(0, std::declval<const V&>())));
    \n+
    1484 static_assert(std::is_same<ConstLValueResult, Scalar<V> >::value,
    \n+
    1485 "Result of autoCopy() must always be Scalar<V>");
    \n+
    1486
    \n+
    1487 V vec = make123<V>();
    \n+
    1488 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n+
    1489 DUNE_SIMD_CHECK(autoCopy(lane(l, vec)) == Scalar<V>(l+1));
    \n+
    1490 }
    \n+
    1491
    \n+
    1492 // may only be called for mask types
    \n+
    1493 template<class M>
    \n+
    1494 void checkBoolReductions()
    \n+
    1495 {
    \n+
    1496 M trueVec(true);
    \n+
    1497
    \n+
    1498 // mutable lvalue
    \n+
    1499 DUNE_SIMD_CHECK(allTrue (static_cast<M&>(trueVec)) == true);
    \n+
    1500 DUNE_SIMD_CHECK(anyTrue (static_cast<M&>(trueVec)) == true);
    \n+
    1501 DUNE_SIMD_CHECK(allFalse(static_cast<M&>(trueVec)) == false);
    \n+
    1502 DUNE_SIMD_CHECK(anyFalse(static_cast<M&>(trueVec)) == false);
    \n+
    1503
    \n+
    1504 // const lvalue
    \n+
    1505 DUNE_SIMD_CHECK(allTrue (static_cast<const M&>(trueVec)) == true);
    \n+
    1506 DUNE_SIMD_CHECK(anyTrue (static_cast<const M&>(trueVec)) == true);
    \n+
    1507 DUNE_SIMD_CHECK(allFalse(static_cast<const M&>(trueVec)) == false);
    \n+
    1508 DUNE_SIMD_CHECK(anyFalse(static_cast<const M&>(trueVec)) == false);
    \n+
    1509
    \n+
    1510 // rvalue
    \n+
    1511 DUNE_SIMD_CHECK(allTrue (M(true)) == true);
    \n+
    1512 DUNE_SIMD_CHECK(anyTrue (M(true)) == true);
    \n+
    1513 DUNE_SIMD_CHECK(allFalse(M(true)) == false);
    \n+
    1514 DUNE_SIMD_CHECK(anyFalse(M(true)) == false);
    \n+
    1515
    \n+
    1516 M falseVec(false);
    \n+
    1517
    \n+
    1518 // mutable lvalue
    \n+
    1519 DUNE_SIMD_CHECK(allTrue (static_cast<M&>(falseVec)) == false);
    \n+
    1520 DUNE_SIMD_CHECK(anyTrue (static_cast<M&>(falseVec)) == false);
    \n+
    1521 DUNE_SIMD_CHECK(allFalse(static_cast<M&>(falseVec)) == true);
    \n+
    1522 DUNE_SIMD_CHECK(anyFalse(static_cast<M&>(falseVec)) == true);
    \n+
    1523
    \n+
    1524 // const lvalue
    \n+
    1525 DUNE_SIMD_CHECK(allTrue (static_cast<const M&>(falseVec)) == false);
    \n+
    1526 DUNE_SIMD_CHECK(anyTrue (static_cast<const M&>(falseVec)) == false);
    \n+
    1527 DUNE_SIMD_CHECK(allFalse(static_cast<const M&>(falseVec)) == true);
    \n+
    1528 DUNE_SIMD_CHECK(anyFalse(static_cast<const M&>(falseVec)) == true);
    \n+
    1529
    \n+
    1530 // rvalue
    \n+
    1531 DUNE_SIMD_CHECK(allTrue (M(false)) == false);
    \n+
    1532 DUNE_SIMD_CHECK(anyTrue (M(false)) == false);
    \n+
    1533 DUNE_SIMD_CHECK(allFalse(M(false)) == true);
    \n+
    1534 DUNE_SIMD_CHECK(anyFalse(M(false)) == true);
    \n+
    1535
    \n+
    1536 auto mixedVec = broadcast<M>(0);
    \n+
    1537 for(std::size_t l = 0; l < lanes(mixedVec); ++l)
    \n+
    1538 lane(l, mixedVec) = (l % 2);
    \n+
    1539
    \n+
    1540 // mutable lvalue
    \n+\n+
    1542 (allTrue (static_cast<M&>(mixedVec)) == false);
    \n+\n+
    1544 (anyTrue (static_cast<M&>(mixedVec)) == (lanes<M>() > 1));
    \n+\n+
    1546 (allFalse(static_cast<M&>(mixedVec)) == (lanes<M>() == 1));
    \n+\n+
    1548 (anyFalse(static_cast<M&>(mixedVec)) == true);
    \n+
    1549
    \n+
    1550 // const lvalue
    \n+\n+
    1552 (allTrue (static_cast<const M&>(mixedVec)) == false);
    \n+\n+
    1554 (anyTrue (static_cast<const M&>(mixedVec)) == (lanes<M>() > 1));
    \n+\n+
    1556 (allFalse(static_cast<const M&>(mixedVec)) == (lanes<M>() == 1));
    \n+\n+
    1558 (anyFalse(static_cast<const M&>(mixedVec)) == true);
    \n+
    1559
    \n+
    1560 // rvalue
    \n+
    1561 DUNE_SIMD_CHECK(allTrue (M(mixedVec)) == false);
    \n+
    1562 DUNE_SIMD_CHECK(anyTrue (M(mixedVec)) == (lanes<M>() > 1));
    \n+
    1563 DUNE_SIMD_CHECK(allFalse(M(mixedVec)) == (lanes<M>() == 1));
    \n+
    1564 DUNE_SIMD_CHECK(anyFalse(M(mixedVec)) == true);
    \n+
    1565 }
    \n
    1566
    \n-
    1567 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1569 : rList_(other.rList_), indexSet_(other.indexSet_),
    \n-
    1570 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_(other.end_),
    \n-
    1571 first_(other.first_), last_(other.last_)
    \n-
    1572 {}
    \n-
    \n-
    1573
    \n-
    1574 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1576 {
    \n-
    1577 if(MODIFYINDEXSET) {
    \n-
    1578 // repair pointers to local index set.
    \n-
    1579#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1580 if(indexSet_->state()!=GROUND)
    \n-
    1581 DUNE_THROW(InvalidIndexSetState, "Index has to be in ground mode for repairing pointers to indices");
    \n-
    1582#endif
    \n-
    1583 auto giter = glist_.begin();
    \n-
    1584 auto index = indexSet_->begin();
    \n-
    1585
    \n-
    1586 for(auto iter=rList_->begin(); iter != end_; ++iter) {
    \n-
    1587 while(index->global()<*giter) {
    \n-
    1588 ++index;
    \n-
    1589#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1590 if(index == indexSet_->end())
    \n-
    1591 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n-
    1592#endif
    \n-
    1593 }
    \n+
    1567 template<class V>
    \n+
    1568 void checkCond()
    \n+
    1569 {
    \n+
    1570 using M = Mask<V>;
    \n+
    1571
    \n+
    1572 static_assert
    \n+
    1573 (std::is_same<decltype(cond(std::declval<M>(), std::declval<V>(),
    \n+
    1574 std::declval<V>())), V>::value,
    \n+
    1575 "The result of cond(M, V, V) should have exactly the type V");
    \n+
    1576
    \n+
    1577 static_assert
    \n+
    1578 (std::is_same<decltype(cond(std::declval<const M&>(),
    \n+
    1579 std::declval<const V&>(),
    \n+
    1580 std::declval<const V&>())), V>::value,
    \n+
    1581 "The result of cond(const M&, const V&, const V&) should have "
    \n+
    1582 "exactly the type V");
    \n+
    1583
    \n+
    1584 static_assert
    \n+
    1585 (std::is_same<decltype(cond(std::declval<M&>(), std::declval<V&>(),
    \n+
    1586 std::declval<V&>())), V>::value,
    \n+
    1587 "The result of cond(M&, V&, V&) should have exactly the type V");
    \n+
    1588
    \n+
    1589 V vec1 = leftVector<V>();
    \n+
    1590 V vec2 = rightVector<V>();
    \n+
    1591
    \n+
    1592 DUNE_SIMD_CHECK(allTrue(cond(M(true), vec1, vec2) == vec1));
    \n+
    1593 DUNE_SIMD_CHECK(allTrue(cond(M(false), vec1, vec2) == vec2));
    \n
    1594
    \n-
    1595#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1596 if(index->global() != *giter)
    \n-
    1597 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n-
    1598#endif
    \n-
    1599 iter->localIndex_ = &(*index);
    \n-
    1600 }
    \n-
    1601 }
    \n-
    1602 }
    \n-
    \n-
    1603
    \n-
    1604 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1606 {
    \n-
    1607 static_assert(!mode,"Not allowed if the mode indicates that new indices"
    \n-
    1608 "might be added to the underlying index set. Use "
    \n-
    1609 "insert(const RemoteIndex&, const GlobalIndex&) instead");
    \n-
    1610
    \n-
    1611#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1612 if(!first_ && index.localIndexPair().global()<last_)
    \n-
    1613 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n-
    1614#endif
    \n-
    1615 // Move to the correct position
    \n-
    1616 while(iter_ != end_ && iter_->localIndexPair().global() < index.localIndexPair().global()) {
    \n-
    1617 ++iter_;
    \n-
    1618 }
    \n-
    1619
    \n-
    1620 // No duplicate entries allowed
    \n-
    1621 assert(iter_==end_ || iter_->localIndexPair().global() != index.localIndexPair().global());
    \n-
    1622 iter_.insert(index);
    \n-
    1623 last_ = index.localIndexPair().global();
    \n-
    1624 first_ = false;
    \n-
    1625 }
    \n-
    \n+
    1595 auto mixedResult = broadcast<V>(0);
    \n+
    1596 auto mixedMask = broadcast<M>(false);
    \n+
    1597 for(std::size_t l = 0; l < lanes(mixedMask); ++l)
    \n+
    1598 {
    \n+
    1599 lane(l, mixedMask ) = (l % 2);
    \n+
    1600 lane(l, mixedResult) = lane(l, (l % 2) ? vec1 : vec2);
    \n+
    1601 }
    \n+
    1602
    \n+
    1603 DUNE_SIMD_CHECK(allTrue(cond(mixedMask, vec1, vec2) == mixedResult));
    \n+
    1604 }
    \n+
    1605
    \n+
    1606 template<class V>
    \n+
    1607 void checkBoolCond()
    \n+
    1608 {
    \n+
    1609 static_assert
    \n+
    1610 (std::is_same<decltype(cond(std::declval<bool>(), std::declval<V>(),
    \n+
    1611 std::declval<V>())), V>::value,
    \n+
    1612 "The result of cond(bool, V, V) should have exactly the type V");
    \n+
    1613
    \n+
    1614 static_assert
    \n+
    1615 (std::is_same<decltype(cond(std::declval<const bool&>(),
    \n+
    1616 std::declval<const V&>(),
    \n+
    1617 std::declval<const V&>())), V>::value,
    \n+
    1618 "The result of cond(const bool&, const V&, const V&) should have "
    \n+
    1619 "exactly the type V");
    \n+
    1620
    \n+
    1621 static_assert
    \n+
    1622 (std::is_same<decltype(cond(std::declval<bool&>(),
    \n+
    1623 std::declval<V&>(),
    \n+
    1624 std::declval<V&>())), V>::value,
    \n+
    1625 "The result of cond(bool&, V&, V&) should have exactly the type V");
    \n
    1626
    \n-
    1627 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1629 {
    \n-
    1630 static_assert(mode,"Not allowed if the mode indicates that no new indices"
    \n-
    1631 "might be added to the underlying index set. Use "
    \n-
    1632 "insert(const RemoteIndex&) instead");
    \n-
    1633#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1634 if(!first_ && global<last_)
    \n-
    1635 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n-
    1636#endif
    \n-
    1637 // Move to the correct position
    \n-
    1638 while(iter_ != end_ && *giter_ < global) {
    \n-
    1639 ++giter_;
    \n-
    1640 ++iter_;
    \n-
    1641 }
    \n-
    1642
    \n-
    1643 // No duplicate entries allowed
    \n-
    1644 assert(iter_->localIndexPair().global() != global);
    \n-
    1645 iter_.insert(index);
    \n-
    1646 giter_.insert(global);
    \n-
    1647
    \n-
    1648 last_ = global;
    \n-
    1649 first_ = false;
    \n-
    1650 }
    \n-
    \n-
    1651
    \n-
    1652 template<typename T, typename A, bool mode>
    \n-
    \n-\n-
    1654 {
    \n-
    1655#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1656 if(!first_ && global<last_)
    \n-
    1657 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n-
    1658#endif
    \n+
    1627 V vec1 = leftVector<V>();
    \n+
    1628 V vec2 = rightVector<V>();
    \n+
    1629
    \n+
    1630 DUNE_SIMD_CHECK(allTrue(cond(true, vec1, vec2) == vec1));
    \n+
    1631 DUNE_SIMD_CHECK(allTrue(cond(false, vec1, vec2) == vec2));
    \n+
    1632 }
    \n+
    1633
    \n+
    1634 template<class V>
    \n+
    1635 std::enable_if_t<!Impl::LessThenComparable<Scalar<V> >::value>
    \n+
    1636 checkHorizontalMinMax() {}
    \n+
    1637
    \n+
    1638 template<class V>
    \n+
    1639 std::enable_if_t<Impl::LessThenComparable<Scalar<V> >::value>
    \n+
    1640 checkHorizontalMinMax()
    \n+
    1641 {
    \n+
    1642 static_assert
    \n+
    1643 (std::is_same<decltype(max(std::declval<V>())), Scalar<V> >::value,
    \n+
    1644 "The result of max(V) should be exactly Scalar<V>");
    \n+
    1645
    \n+
    1646 static_assert
    \n+
    1647 (std::is_same<decltype(min(std::declval<V>())), Scalar<V> >::value,
    \n+
    1648 "The result of min(V) should be exactly Scalar<V>");
    \n+
    1649
    \n+
    1650 static_assert
    \n+
    1651 (std::is_same<decltype(max(std::declval<V&>())), Scalar<V> >::value,
    \n+
    1652 "The result of max(V) should be exactly Scalar<V>");
    \n+
    1653
    \n+
    1654 static_assert
    \n+
    1655 (std::is_same<decltype(min(std::declval<V&>())), Scalar<V> >::value,
    \n+
    1656 "The result of min(V) should be exactly Scalar<V>");
    \n+
    1657
    \n+
    1658 const V vec1 = leftVector<V>();
    \n
    1659
    \n-
    1660 bool found= false;
    \n-
    1661
    \n-
    1662 if(MODIFYINDEXSET) {
    \n-
    1663 // Move to the correct position
    \n-
    1664 while(iter_!=end_ && *giter_< global) {
    \n-
    1665 ++giter_;
    \n-
    1666 ++iter_;
    \n-
    1667 }
    \n-
    1668 if(*giter_ == global) {
    \n-
    1669 giter_.remove();
    \n-
    1670 iter_.remove();
    \n-
    1671 found=true;
    \n-
    1672 }
    \n-
    1673 }else{
    \n-
    1674 while(iter_!=end_ && iter_->localIndexPair().global() < global)
    \n-
    1675 ++iter_;
    \n-
    1676
    \n-
    1677 if(iter_->localIndexPair().global()==global) {
    \n-
    1678 iter_.remove();
    \n-
    1679 found = true;
    \n-
    1680 }
    \n-
    1681 }
    \n-
    1682
    \n-
    1683 last_ = global;
    \n-
    1684 first_ = false;
    \n-
    1685 return found;
    \n-
    1686 }
    \n-
    \n-
    1687
    \n-
    1688 template<typename T, typename A>
    \n-
    1689 template<bool send>
    \n-
    \n-\n-
    1691 {
    \n-
    1692 return CollectiveIterator<T,A>(remoteIndices_, send);
    \n-
    1693 }
    \n-
    \n-
    1694
    \n-
    1695 template<typename T, typename A>
    \n-
    \n-
    1696 inline MPI_Comm RemoteIndices<T,A>::communicator() const
    \n-
    1697 {
    \n-
    1698 return comm_;
    \n-
    1699
    \n-
    1700 }
    \n-
    \n-
    1701
    \n-
    1702 template<typename T, typename A>
    \n-
    \n-\n-
    1704 {
    \n-
    1705
    \n-
    1706 const auto end = pmap.end();
    \n-
    1707 for(auto process = pmap.begin(); process != end; ++process) {
    \n-
    1708 const RemoteIndexList* list = send ? process->second.first : process->second.second;
    \n-
    1709 using ri_iterator = typename RemoteIndexList::const_iterator;
    \n-
    1710 map_.insert(std::make_pair(process->first,
    \n-
    1711 std::pair<ri_iterator, const ri_iterator>(list->begin(), list->end())));
    \n-
    1712 }
    \n-
    1713 }
    \n-
    \n-
    1714
    \n-
    1715 template<typename T, typename A>
    \n-
    \n-
    1716 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index)
    \n-
    1717 {
    \n-
    1718 const auto end = map_.end();
    \n+
    1660 DUNE_SIMD_CHECK(max(vec1) == Scalar<V>(lanes(vec1)));
    \n+
    1661 DUNE_SIMD_CHECK(min(vec1) == Scalar<V>(1));
    \n+
    1662 }
    \n+
    1663
    \n+
    1664 template<class V>
    \n+
    1665 std::enable_if_t<!Impl::LessThenComparable<Scalar<V> >::value>
    \n+
    1666 checkBinaryMinMax() {}
    \n+
    1667
    \n+
    1668 template<class V>
    \n+
    1669 std::enable_if_t<Impl::LessThenComparable<Scalar<V> >::value>
    \n+
    1670 checkBinaryMinMax()
    \n+
    1671 {
    \n+
    1672 using std::max;
    \n+
    1673 using std::min;
    \n+
    1674
    \n+
    1675 static_assert
    \n+
    1676 (std::is_same<decltype(Simd::max(std::declval<V>(),
    \n+
    1677 std::declval<V>())), V>::value,
    \n+
    1678 "The result of Simd::max(V, V) should be exactly V");
    \n+
    1679 static_assert
    \n+
    1680 (std::is_same<decltype(Simd::min(std::declval<V>(),
    \n+
    1681 std::declval<V>())), V>::value,
    \n+
    1682 "The result of Simd::min(V, V) should be exactly V");
    \n+
    1683
    \n+
    1684 static_assert
    \n+
    1685 (std::is_same<decltype(Simd::max(std::declval<V&>(),
    \n+
    1686 std::declval<V&>())), V>::value,
    \n+
    1687 "The result of Simd::max(V&, V&) should be exactly V");
    \n+
    1688 static_assert
    \n+
    1689 (std::is_same<decltype(Simd::min(std::declval<V&>(),
    \n+
    1690 std::declval<V&>())), V>::value,
    \n+
    1691 "The result of Simd::min(V&, V&) should be exactly V");
    \n+
    1692
    \n+
    1693 const V arg1 = leftVector<V>();
    \n+
    1694 const V arg2 = rightVector<V>();
    \n+
    1695
    \n+
    1696 V maxExp(Scalar<V>(0)), minExp(Scalar<V>(0));
    \n+
    1697 for(auto l : range(lanes<V>()))
    \n+
    1698 {
    \n+
    1699 lane(l, maxExp) = max(lane(l, arg1), lane(l, arg2));
    \n+
    1700 lane(l, minExp) = min(lane(l, arg1), lane(l, arg2));
    \n+
    1701 }
    \n+
    1702
    \n+
    1703 DUNE_SIMD_CHECK(allTrue(maxExp == Simd::max(arg1, arg2)));
    \n+
    1704 DUNE_SIMD_CHECK(allTrue(minExp == Simd::min(arg1, arg2)));
    \n+
    1705 }
    \n+
    1706
    \n+
    1707 template<class V>
    \n+
    1708 void checkIO()
    \n+
    1709 {
    \n+
    1710 const V vec1 = leftVector<V>();
    \n+
    1711
    \n+
    1712 std::string reference;
    \n+
    1713 {
    \n+
    1714 const char *sep = "";
    \n+
    1715 for(auto l : range(lanes(vec1)))
    \n+
    1716 {
    \n+
    1717 std::ostringstream stream;
    \n+
    1718 stream << lane(l, vec1);
    \n
    1719
    \n-
    1720 for(auto iter = map_.begin(); iter != end;) {
    \n-
    1721 // Step the iterator until we are >= index
    \n-
    1722 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n-
    1723 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n-
    1724 RemoteIndex remoteIndex;
    \n-
    1725 if(current != rend)
    \n-
    1726 remoteIndex = *current;
    \n-
    1727
    \n-
    1728 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n-
    1729 ++(iter->second.first);
    \n-
    1730
    \n-
    1731 // erase from the map if there are no more entries.
    \n-
    1732 if(iter->second.first == iter->second.second)
    \n-
    1733 map_.erase(iter++);
    \n-
    1734 else{
    \n-
    1735 ++iter;
    \n-
    1736 }
    \n-
    1737 }
    \n-
    1738 index_=index;
    \n-
    1739 noattribute=true;
    \n-
    1740 }
    \n-
    \n+
    1720 reference += sep;
    \n+
    1721 reference += stream.str();
    \n+
    1722 sep = ", ";
    \n+
    1723 }
    \n+
    1724 }
    \n+
    1725
    \n+
    1726 {
    \n+
    1727 std::ostringstream stream;
    \n+
    1728 stream << io(vec1);
    \n+
    1729 if(lanes(vec1) == 1)
    \n+
    1730 DUNE_SIMD_CHECK(stream.str() == reference);
    \n+
    1731 else
    \n+
    1732 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">");
    \n+
    1733 }
    \n+
    1734
    \n+
    1735 {
    \n+
    1736 std::ostringstream stream;
    \n+
    1737 stream << vio(vec1);
    \n+
    1738 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">");
    \n+
    1739 }
    \n+
    1740 }
    \n
    1741
    \n-
    1742 template<typename T, typename A>
    \n-
    \n-
    1743 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index,
    \n-
    1744 const Attribute& attribute)
    \n-
    1745 {
    \n-
    1746 const auto end = map_.end();
    \n-
    1747
    \n-
    1748 for(auto iter = map_.begin(); iter != end;) {
    \n-
    1749 // Step the iterator until we are >= index
    \n-
    1750 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n-
    1751 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n-
    1752 RemoteIndex remoteIndex;
    \n-
    1753 if(current != rend)
    \n-
    1754 remoteIndex = *current;
    \n-
    1755
    \n-
    1756 // Move to global index or bigger
    \n-
    1757 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n-
    1758 ++(iter->second.first);
    \n-
    1759
    \n-
    1760 // move to attribute or bigger
    \n-
    1761 while(iter->second.first!=iter->second.second
    \n-
    1762 && iter->second.first->localIndexPair().global()==index
    \n-
    1763 && iter->second.first->localIndexPair().local().attribute()<attribute)
    \n-
    1764 ++(iter->second.first);
    \n-
    1765
    \n-
    1766 // erase from the map if there are no more entries.
    \n-
    1767 if(iter->second.first == iter->second.second)
    \n-
    1768 map_.erase(iter++);
    \n-
    1769 else{
    \n-
    1770 ++iter;
    \n-
    1771 }
    \n-
    1772 }
    \n-
    1773 index_=index;
    \n-
    1774 attribute_=attribute;
    \n-
    1775 noattribute=false;
    \n-
    1776 }
    \n-
    \n-
    1777
    \n-
    1778 template<typename T, typename A>
    \n-
    \n-\n-
    1780 {
    \n-
    1781 const auto end = map_.end();
    \n-
    1782
    \n-
    1783 for(auto iter = map_.begin(); iter != end;) {
    \n-
    1784 // Step the iterator until we are >= index
    \n-
    1785 auto current = iter->second.first;
    \n-
    1786 auto rend = iter->second.second;
    \n-
    1787
    \n-
    1788 // move all iterators pointing to the current global index to next value
    \n-
    1789 if(iter->second.first->localIndexPair().global()==index_ &&
    \n-
    1790 (noattribute || iter->second.first->localIndexPair().local().attribute() == attribute_))
    \n-
    1791 ++(iter->second.first);
    \n-
    1792
    \n-
    1793 // erase from the map if there are no more entries.
    \n-
    1794 if(iter->second.first == iter->second.second)
    \n-
    1795 map_.erase(iter++);
    \n-
    1796 else{
    \n-
    1797 ++iter;
    \n-
    1798 }
    \n-
    1799 }
    \n-
    1800 return *this;
    \n-
    1801 }
    \n-
    \n-
    1802
    \n-
    1803 template<typename T, typename A>
    \n-
    \n-\n-
    1805 {
    \n-
    1806 return map_.empty();
    \n-
    1807 }
    \n-
    \n-
    1808
    \n-
    1809 template<typename T, typename A>
    \n-
    1810 inline typename CollectiveIterator<T,A>::iterator
    \n-
    \n-\n-
    1812 {
    \n-
    1813 if(noattribute)
    \n-
    1814 return iterator(map_.begin(), map_.end(), index_);
    \n-
    1815 else
    \n-
    1816 return iterator(map_.begin(), map_.end(), index_,
    \n-
    1817 attribute_);
    \n-
    1818 }
    \n-
    \n+
    1742#undef DUNE_SIMD_CHECK
    \n+
    1743
    \n+
    1744 public:
    \n+
    1807 template<class V> void checkType();
    \n+
    1808 template<class V> void checkNonOps();
    \n+
    1809 template<class V> void checkUnaryOps();
    \n+
    1810 template<class V> void checkBinaryOps();
    \n+
    1811 template<class V> void checkBinaryOpsVectorVector();
    \n+
    1812 template<class V> void checkBinaryOpsScalarVector();
    \n+
    1813 template<class V> void checkBinaryOpsVectorScalar();
    \n+
    1814 template<class V> void checkBinaryOpsProxyVector();
    \n+
    1815 template<class V> void checkBinaryOpsVectorProxy();
    \n
    1819
    \n-
    1820 template<typename T, typename A>
    \n-
    1821 inline typename CollectiveIterator<T,A>::iterator
    \n-
    \n-\n-
    1823 {
    \n-
    1824 return iterator(map_.end(), map_.end(), index_);
    \n-
    1825 }
    \n-
    \n-
    1826
    \n-
    1827 template<typename TG, typename TA>
    \n-
    \n-
    1828 inline std::ostream& operator<<(std::ostream& os, const RemoteIndex<TG,TA>& index)
    \n-
    1829 {
    \n-
    1830 os<<"[global="<<index.localIndexPair().global()<<", remote attribute="<<index.attribute()<<" local attribute="<<index.localIndexPair().local().attribute()<<"]";
    \n-
    1831 return os;
    \n-
    1832 }
    \n-
    \n-
    1833
    \n-
    1834 template<typename T, typename A>
    \n-
    \n-
    1835 inline std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices)
    \n-
    1836 {
    \n-
    1837 int rank;
    \n-
    1838 MPI_Comm_rank(indices.comm_, &rank);
    \n-
    1839 const auto rend = indices.remoteIndices_.end();
    \n-
    1840
    \n-
    1841 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex) {
    \n-
    1842 os<<rank<<": Process "<<rindex->first<<":";
    \n-
    1843
    \n-
    1844 if(!rindex->second.first->empty()) {
    \n-
    1845 os<<" send:";
    \n+
    1836 template<class V, class Rebinds,
    \n+
    1837 template<class> class RebindPrune = IsLoop,
    \n+
    1838 template<class> class RebindAccept = Dune::AlwaysTrue>
    \n+
    \n+
    1839 void check() {
    \n+
    1840 // check whether the test for this type already started
    \n+
    1841 if(seen_.emplace(typeid (V)).second == false)
    \n+
    1842 {
    \n+
    1843 // type already seen, nothing to do
    \n+
    1844 return;
    \n+
    1845 }
    \n
    1846
    \n-
    1847 const auto send= rindex->second.first->end();
    \n-
    1848
    \n-
    1849 for(auto index = rindex->second.first->begin();
    \n-
    1850 index != send; ++index)
    \n-
    1851 os<<*index<<" ";
    \n-
    1852 os<<std::endl;
    \n-
    1853 }
    \n-
    1854 if(!rindex->second.second->empty()) {
    \n-
    1855 os<<rank<<": Process "<<rindex->first<<": "<<"receive: ";
    \n-
    1856
    \n-
    1857 for(const auto& index : *(rindex->second.second))
    \n-
    1858 os << index << " ";
    \n-
    1859 }
    \n-
    1860 os<<std::endl<<std::flush;
    \n-
    1861 }
    \n-
    1862 return os;
    \n-
    1863 }
    \n-
    \n-
    1865}
    \n-
    1866
    \n-
    1867#endif // HAVE_MPI
    \n-
    1868
    \n-
    1869#endif
    \n-
    Standard Dune debug streams.
    \n-
    Traits classes for mapping types onto MPI_Datatype.
    \n-
    Provides classes for use as the local index in ParallelIndexSet for distributed computing.
    \n-
    Provides a map between global and local indices.
    \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-
    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-
    TL LocalIndex
    The type of the local index, e.g. ParallelLocalIndex.
    Definition indexset.hh:239
    \n-
    const GlobalIndex & global() const
    Get the global index.
    \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-
    @ 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:95
    \n+
    1847 // do these first so everything that appears after "Checking SIMD type
    \n+
    1848 // ..." really pertains to that type
    \n+
    1849 auto recurse = [this](auto w) {
    \n+
    1850 using W = typename decltype(w)::type;
    \n+
    1851 this->template check<W, Rebinds, RebindPrune, RebindAccept>();
    \n+
    1852 };
    \n+
    1853 checkRebindOf<V, Rebinds, RebindPrune, RebindAccept>(recurse);
    \n+
    1854
    \n+
    1855 checkType<V>();
    \n+
    1856 }
    \n+
    \n+
    1857
    \n+
    \n+
    1859 bool good() const
    \n+
    1860 {
    \n+
    1861 return good_;
    \n+
    1862 }
    \n+
    \n+
    1863
    \n+
    1864 }; // class UnitTest
    \n+
    \n+
    1865
    \n+
    \n+
    1866 template<class V> void UnitTest::checkType()
    \n+
    1867 {
    \n+
    1868 static_assert(std::is_same<V, std::decay_t<V> >::value, "Simd types "
    \n+
    1869 "must not be references, and must not include "
    \n+
    1870 "cv-qualifiers");
    \n+
    1871
    \n+
    1872 log_ << "Checking SIMD type " << className<V>() << std::endl;
    \n+
    1873
    \n+
    1874 checkNonOps<V>();
    \n+
    1875 checkUnaryOps<V>();
    \n+
    1876 checkBinaryOps<V>();
    \n+
    1877 }
    \n+
    \n+
    \n+
    1878 template<class V> void UnitTest::checkNonOps()
    \n+
    1879 {
    \n+
    1880 constexpr auto isMask = typename std::is_same<Scalar<V>, bool>::type{};
    \n+
    1881
    \n+
    1882 checkLanes<V>();
    \n+
    1883 checkScalar<V>();
    \n+
    1884
    \n+
    1885 checkDefaultConstruct<V>();
    \n+
    1886 checkLane<V>();
    \n+
    1887 checkCopyMoveConstruct<V>();
    \n+
    1888 checkImplCast<V>();
    \n+
    1889 checkBroadcast<V>();
    \n+
    1890 if constexpr (isMask)
    \n+
    1891 this->template checkBroadcastMaskConstruct<V>();
    \n+
    1892 else
    \n+
    1893 this->template checkBroadcastVectorConstruct<V>();
    \n+
    1894 checkBracedAssign<V>();
    \n+
    1895 checkBracedBroadcastAssign<V>();
    \n+
    1896
    \n+
    1897 checkAutoCopy<V>();
    \n+
    1898 checkCond<V>();
    \n+
    1899 checkBoolCond<V>();
    \n+
    1900
    \n+
    1901 if constexpr (isMask)
    \n+
    1902 this->template checkBoolReductions<V>();
    \n+
    1903 // checkBoolReductions() is not applicable for non-masks
    \n+
    1904
    \n+
    1905 checkHorizontalMinMax<V>();
    \n+
    1906 checkBinaryMinMax<V>();
    \n+
    1907 checkIO<V>();
    \n+
    1908 }
    \n+
    \n+
    \n+
    1909 template<class V> void UnitTest::checkUnaryOps()
    \n+
    1910 {
    \n+
    1911 if constexpr (std::is_same_v<Scalar<V>, bool>) {
    \n+
    1912 // check mask
    \n+
    1913 auto check = [this](auto op) {
    \n+
    1914 this->template checkUnaryOpsV<V>(op);
    \n+
    1915 };
    \n+
    1916
    \n+
    1917 // postfix
    \n+
    1918 // check(OpPostfixDecrement{});
    \n+
    1919 // clang deprecation warning if bool++ is tested
    \n+
    1920 // check(OpPostfixIncrement{});
    \n+
    1921
    \n+
    1922 // prefix
    \n+
    1923 // check(OpPrefixDecrement{});
    \n+
    1924 // clang deprecation warning if ++bool is tested
    \n+
    1925 // check(OpPrefixIncrement{});
    \n+
    1926
    \n+
    1927 // check(OpPrefixPlus{});
    \n+
    1928 // check(OpPrefixMinus{});
    \n+
    1929 check(OpPrefixLogicNot{});
    \n+
    1930 // check(OpPrefixBitNot{});
    \n+
    1931 }
    \n+
    1932 else {
    \n+
    1933 // check vector
    \n+
    1934 auto check = [this](auto op) {
    \n+
    1935 this->template checkUnaryOpsV<V>(op);
    \n+
    1936 };
    \n+
    1937
    \n+
    1938 // postfix
    \n+
    1939 // check(OpPostfixDecrement{});
    \n+
    1940 // check(OpPostfixIncrement{});
    \n+
    1941
    \n+
    1942 // prefix
    \n+
    1943 // check(OpPrefixDecrement{});
    \n+
    1944 // check(OpPrefixIncrement{});
    \n+
    1945
    \n+
    1946 // check(OpPrefixPlus{});
    \n+
    1947 check(OpPrefixMinus{});
    \n+
    1948 check(OpPrefixLogicNot{});
    \n+
    1949 check(OpPrefixBitNot{});
    \n+
    1950 }
    \n+
    1951 }
    \n+
    \n+
    \n+
    1952 template<class V> void UnitTest::checkBinaryOps()
    \n+
    1953 {
    \n+
    1954 checkBinaryOpsVectorVector<V>();
    \n+
    1955 checkBinaryOpsScalarVector<V>();
    \n+
    1956 checkBinaryOpsVectorScalar<V>();
    \n+
    1957 checkBinaryOpsProxyVector<V>();
    \n+
    1958 checkBinaryOpsVectorProxy<V>();
    \n+
    1959 }
    \n+
    \n+
    \n+\n+
    1961 {
    \n+
    1962 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n+
    1963 auto check = [this,op](auto t1, auto t2) {
    \n+
    1964 this->checkBinaryOpVV(t1, t2, op);
    \n+
    1965 };
    \n+
    1966 this->checkBinaryRefQual<V, V, doVV>(check);
    \n+
    1967 };
    \n+
    1968 checkBinaryOps<V>(checker);
    \n+
    1969 }
    \n+
    \n+
    \n+\n+
    1971 {
    \n+
    1972 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n+
    1973 auto check = [this,op](auto t1, auto t2) {
    \n+
    1974 this->checkBinaryOpSV(t1, t2, op);
    \n+
    1975 };
    \n+
    1976 this->checkBinaryRefQual<Scalar<V>, V, doSV>(check);
    \n+
    1977
    \n+
    1978 auto crossCheck = [this,op](auto t1, auto t2) {
    \n+
    1979 this->checkBinaryOpVVAgainstSV(t1, t2, op);
    \n+
    1980 };
    \n+
    1981 this->checkBinaryRefQual<Scalar<V>, V, doSV && doVV>(crossCheck);
    \n+
    1982 };
    \n+
    1983 checkBinaryOps<V>(checker);
    \n+
    1984 }
    \n+
    \n+
    \n+\n+
    1986 {
    \n+
    1987 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n+
    1988 auto check = [this,op](auto t1, auto t2) {
    \n+
    1989 this->checkBinaryOpVS(t1, t2, op);
    \n+
    1990 };
    \n+
    1991 this->checkBinaryRefQual<V, Scalar<V>, doVS>(check);
    \n+
    1992
    \n+
    1993 auto crossCheck = [this,op](auto t1, auto t2) {
    \n+
    1994 this->checkBinaryOpVVAgainstVS(t1, t2, op);
    \n+
    1995 };
    \n+
    1996 this->checkBinaryRefQual<V, Scalar<V>, doVV && doVS>(crossCheck);
    \n+
    1997 };
    \n+
    1998 checkBinaryOps<V>(checker);
    \n+
    1999 }
    \n+
    \n+
    \n+\n+
    2001 {
    \n+
    2002 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n+
    2003 auto check = [this,op](auto t1, auto t2) {
    \n+
    2004 this->checkBinaryOpPV(t1, t2, op);
    \n+
    2005 };
    \n+
    2006 this->checkBinaryRefQual<V, V, doSV>(check);
    \n+
    2007 };
    \n+
    2008 checkBinaryOps<V>(checker);
    \n+
    2009 }
    \n+
    \n+
    \n+\n+
    2011 {
    \n+
    2012 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n+
    2013 auto check = [this,op](auto t1, auto t2) {
    \n+
    2014 this->checkBinaryOpVP(t1, t2, op);
    \n+
    2015 };
    \n+
    2016 this->checkBinaryRefQual<V, V, doVS>(check);
    \n+
    2017 };
    \n+
    2018 checkBinaryOps<V>(checker);
    \n+
    2019 }
    \n+
    \n+
    2020
    \n+
    2021 } // namespace Simd
    \n+
    2022} // namespace Dune
    \n+
    2023
    \n+
    2024#endif // DUNE_COMMON_SIMD_TEST_HH
    \n+\n+\n+
    IO interface of the SIMD abstraction.
    \n+
    #define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL)
    Definition test.hh:670
    \n+
    #define DUNE_SIMD_INFIX_OP(NAME, SYMBOL)
    Definition test.hh:784
    \n+
    #define DUNE_SIMD_CHECK_OP(expr)
    Definition test.hh:191
    \n+
    #define DUNE_SIMD_CHECK(expr)
    Definition test.hh:186
    \n+
    #define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL)
    Definition test.hh:818
    \n+
    #define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL)
    Definition test.hh:805
    \n+
    #define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL)
    Definition test.hh:681
    \n+
    #define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)
    \n+\n+
    Traits for type conversions and type information.
    \n+
    Utilities for reduction like operations on ranges.
    \n+
    A free function to provide the demangled class name of a given object or type as a string.
    \n+\n+
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n+
    std::tuple< MetaType< T >... > TypeList
    A simple type list.
    Definition typelist.hh:87
    \n+
    constexpr void forEach(Range &&range, F &&f)
    Range based for loop.
    Definition hybridutilities.hh:268
    \n+
    constexpr AutonomousValue< T > autoCopy(T &&v)
    Autonomous copy of an expression's value for use in auto type deduction.
    Definition typetraits.hh:642
    \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+
    bool anyTrue(const Mask &mask)
    Whether any entry is true
    Definition simd/interface.hh:429
    \n+
    auto maskOr(const V1 &v1, const V2 &v2)
    Logic or of masks.
    Definition simd/interface.hh:499
    \n+
    V cond(M &&mask, const V &ifTrue, const V &ifFalse)
    Like the ?: operator.
    Definition simd/interface.hh:386
    \n+
    auto io(const V &v)
    construct a stream inserter
    Definition io.hh:106
    \n+
    bool allTrue(const Mask &mask)
    Whether all entries are true
    Definition simd/interface.hh:439
    \n+
    auto vio(const V &v)
    construct a stream inserter
    Definition io.hh:90
    \n+
    auto max(const V &v1, const V &v2)
    The binary maximum value over two simd objects.
    Definition simd/interface.hh:409
    \n+
    bool anyFalse(const Mask &mask)
    Whether any entry is false
    Definition simd/interface.hh:449
    \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+
    bool allFalse(const Mask &mask)
    Whether all entries are false
    Definition simd/interface.hh:459
    \n+
    auto maskAnd(const V1 &v1, const V2 &v2)
    Logic and of masks.
    Definition simd/interface.hh:509
    \n+
    typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
    Element type of some SIMD type.
    Definition simd/interface.hh:235
    \n+
    auto min(const V &v1, const V &v2)
    The binary minimum value over two simd objects.
    Definition simd/interface.hh:419
    \n
    STL namespace.
    \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-
    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:41
    \n-
    Base class of all classes representing a communication interface.
    Definition parallel/interface.hh:35
    \n-
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:49
    \n-
    The indices present on remote processes.
    Definition remoteindices.hh:189
    \n-
    const std::set< int > & getNeighbours() const
    Definition remoteindices.hh:307
    \n-
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:231
    \n-
    RemoteIndices()
    Definition remoteindices.hh:977
    \n-
    friend void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm)
    \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:984
    \n-
    void free()
    Free the index lists.
    Definition remoteindices.hh:1429
    \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:215
    \n-
    void rebuild()
    Rebuilds the set of remote indices.
    Definition remoteindices.hh:1453
    \n-
    T ParallelIndexSet
    Type of the index set we use, e.g. ParallelLocalIndexSet.
    Definition remoteindices.hh:206
    \n-
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1696
    \n-
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:226
    \n-
    CollectiveIteratorT iterator() const
    Get an iterator for colletively iterating over the remote indices of all remote processes.
    Definition remoteindices.hh:1690
    \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:971
    \n-
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1529
    \n-
    bool operator==(const RemoteIndices &ri) const
    Definition remoteindices.hh:1536
    \n-
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:245
    \n-
    void setNeighbours(const C &neighbours)
    Definition remoteindices.hh:300
    \n-
    RemoteIndexListModifier< T, A, mode > getModifier(int process)
    Get a modifier for a remote index list.
    Definition remoteindices.hh:1480
    \n-
    const ParallelIndexSet & sourceIndexSet() const
    Get the index set at the source.
    Definition remoteindices.hh:999
    \n-
    ~RemoteIndices()
    Destructor.
    Definition remoteindices.hh:1014
    \n-
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:241
    \n-
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1446
    \n-
    CollectiveIterator< T, A > CollectiveIteratorT
    The type of the collective iterator over all remote indices.
    Definition remoteindices.hh:210
    \n-
    const ParallelIndexSet & destinationIndexSet() const
    Get the index set at destination.
    Definition remoteindices.hh:1007
    \n-
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:237
    \n-
    const_iterator find(int proc) const
    Find an iterator over the remote index lists of a specific process.
    Definition remoteindices.hh:1515
    \n-
    bool isSynced() const
    Checks whether the remote indices are synced with the indexsets.
    Definition remoteindices.hh:1473
    \n-
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1522
    \n-
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:221
    \n-
    RemoteIndexMap::const_iterator const_iterator
    Definition remoteindices.hh:247
    \n-
    Information about an index residing on another processor.
    Definition remoteindices.hh:73
    \n-
    const Attribute attribute() const
    Get the attribute of the index on the remote process.
    Definition remoteindices.hh:946
    \n-
    friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T, A1 > &, const T &)
    \n-
    bool operator==(const RemoteIndex &ri) const
    Definition remoteindices.hh:934
    \n-
    T1 GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition remoteindices.hh:90
    \n-
    T2 Attribute
    The type of the attributes. Normally this will be an enumeration like.
    Definition remoteindices.hh:99
    \n-
    IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType
    The type of the index pair.
    Definition remoteindices.hh:105
    \n-
    const PairType & localIndexPair() const
    Get the corresponding local index pair.
    Definition remoteindices.hh:952
    \n-
    RemoteIndex()
    Parameterless Constructor.
    Definition remoteindices.hh:930
    \n-
    bool operator!=(const RemoteIndex &ri) const
    Definition remoteindices.hh:940
    \n-
    Modifier for adding and/or deleting remote indices from the remote index list.
    Definition remoteindices.hh:551
    \n-
    void repairLocalIndexPointers()
    Repair the pointers to the local index pairs.
    Definition remoteindices.hh:1575
    \n-
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:602
    \n-
    A Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:598
    \n-
    void insert(const RemoteIndex &index)
    Insert an index to the list.
    Definition remoteindices.hh:1605
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:578
    \n-
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:583
    \n-
    RemoteIndexList::const_iterator ConstIterator
    The type of the remote index list iterator.
    Definition remoteindices.hh:612
    \n-
    SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator
    The type of the modifying iterator of the remote index list.
    Definition remoteindices.hh:607
    \n-
    bool remove(const GlobalIndex &global)
    Remove a remote index.
    Definition remoteindices.hh:1653
    \n-
    T ParallelIndexSet
    Type of the index set we use.
    Definition remoteindices.hh:573
    \n-
    RemoteIndexListModifier()
    Default constructor.
    Definition remoteindices.hh:676
    \n-
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:588
    \n-
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:593
    \n-
    static constexpr bool MODIFYINDEXSET
    If true the index set corresponding to the remote indices might get modified.
    Definition remoteindices.hh:568
    \n-
    A collective iterator for moving over the remote indices for all processes collectively.
    Definition remoteindices.hh:708
    \n-
    CollectiveIterator & operator++()
    Definition remoteindices.hh:1779
    \n-
    iterator end()
    Definition remoteindices.hh:1822
    \n-
    CollectiveIterator(const RemoteIndexMap &map_, bool send)
    Constructor.
    Definition remoteindices.hh:1703
    \n-
    bool empty() const
    Checks whether there are still iterators in the map.
    Definition remoteindices.hh:1804
    \n-
    void advance(const GlobalIndex &global)
    Advances all underlying iterators.
    Definition remoteindices.hh:1716
    \n-
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:748
    \n-
    iterator begin()
    Definition remoteindices.hh:1811
    \n-
    Definition remoteindices.hh:167
    \n-
    Definition remoteindices.hh:558
    \n-
    Iterator over the valid underlying iterators.
    Definition remoteindices.hh:792
    \n-
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex &index)
    Definition remoteindices.hh:799
    \n-
    iterator(const iterator &other)
    Definition remoteindices.hh:817
    \n-
    const RemoteIndex & operator*() const
    Definition remoteindices.hh:838
    \n-
    Map::iterator ConstRealIterator
    Definition remoteindices.hh:795
    \n-
    iterator & operator++()
    Definition remoteindices.hh:822
    \n-
    const RemoteIndex * operator->() const
    Definition remoteindices.hh:850
    \n-
    bool operator==(const iterator &other) const
    Definition remoteindices.hh:856
    \n-
    int process() const
    Definition remoteindices.hh:844
    \n-
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex index, Attribute attribute)
    Definition remoteindices.hh:807
    \n-
    bool operator!=(const iterator &other) const
    Definition remoteindices.hh:862
    \n-
    Map::iterator RealIterator
    Definition remoteindices.hh:794
    \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+
    typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type RebindList
    A list of types with the final element removed.
    Definition test.hh:158
    \n+
    typename Impl::IsLoop< T >::type IsLoop
    check whether a type is an instance of LoopSIMD
    Definition test.hh:162
    \n+
    Definition loop.hh:65
    \n+
    final element marker for RebindList
    Definition test.hh:145
    \n+
    Definition test.hh:164
    \n+
    void checkUnaryOps()
    Definition test.hh:1909
    \n+
    void checkBinaryOps()
    Definition test.hh:1952
    \n+
    void checkBinaryOpsScalarVector()
    Definition test.hh:1970
    \n+
    void checkType()
    Definition test.hh:1866
    \n+
    void check()
    run unit tests for simd vector type V
    Definition test.hh:1839
    \n+
    void checkBinaryOpsVectorScalar()
    Definition test.hh:1985
    \n+
    bool good() const
    whether all tests succeeded
    Definition test.hh:1859
    \n+
    void checkBinaryOpsVectorVector()
    Definition test.hh:1960
    \n+
    void checkNonOps()
    Definition test.hh:1878
    \n+
    void checkBinaryOpsVectorProxy()
    Definition test.hh:2010
    \n+
    void checkBinaryOpsProxyVector()
    Definition test.hh:2000
    \n+
    template which always yields a true value
    Definition typetraits.hh:134
    \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,1925 +1,2096 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bi_\bm_\bd\n+test.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_REMOTEINDICES_HH\n-6#define DUNE_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\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#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/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-24#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-25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-26#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-27\n-28namespace _\bD_\bu_\bn_\be {\n-40 template\n-_\b4_\b1 class _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br > >\n-42 {\n-43 public:\n-44 inline static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n-45 private:\n-46 static MPI_Datatype type;\n-47 };\n-48\n-49\n-50 template\n-51 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-52\n-53 template\n-54 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n-55\n-56 // forward declaration needed for friend declaration.\n-57 template\n-58 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-59\n-60 template\n-_\b6_\b1 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-62\n-63\n-64 template\n-65 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-66\n+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3#ifndef DUNE_COMMON_SIMD_TEST_HH\n+4#define DUNE_COMMON_SIMD_TEST_HH\n+5\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\n+23#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+24#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+25#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+26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bi_\bo_\b._\bh_\bh>\n+27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bl_\bo_\bo_\bp_\b._\bh_\bh>\n+28#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+29#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+30#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+31#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+32\n+33namespace _\bD_\bu_\bn_\be {\n+34 namespace Simd {\n+35\n+36 namespace Impl {\n+37\n+38 template\n+39 struct LessThenComparable : std::false_type {};\n+40 template\n+41 struct LessThenComparable()\n+42 < std::declval())> > :\n+43 std::true_type\n+44 {};\n+45\n+46 template\n+47 struct CopyConstHelper\n+48 {\n+49 using type = Dst;\n+50 };\n+51 template\n+52 struct CopyConstHelper\n+53 {\n+54 using type = std::add_const_t;\n+55 };\n+56\n+57 template\n+58 struct CopyVolatileHelper\n+59 {\n+60 using type = Dst;\n+61 };\n+62 template\n+63 struct CopyVolatileHelper\n+64 {\n+65 using type = std::add_volatile_t;\n+66 };\n 67\n-71 template\n-_\b7_\b2 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-73 {\n-74 template\n-_\b7_\b5 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-76\n-77 template\n-_\b7_\b8 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-79 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>&,\n-80 const T&);\n-81\n-82 template\n-_\b8_\b3 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+68 template\n+69 struct CopyReferenceHelper\n+70 {\n+71 using type = Dst;\n+72 };\n+73 template\n+74 struct CopyReferenceHelper\n+75 {\n+76 using type = std::add_lvalue_reference_t;\n+77 };\n+78\n+79 template\n+80 struct CopyReferenceHelper\n+81 {\n+82 using type = std::add_rvalue_reference_t;\n+83 };\n 84\n-85 public:\n-_\b9_\b0 typedef T1 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-_\b9_\b9 typedef T2 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-100\n-104 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_\b5 _\bP_\ba_\bi_\br_\bT_\by_\bp_\be;\n-106\n-111 const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n+85 template\n+86 using CopyRefQual = typename CopyReferenceHelper<\n+87 typename CopyVolatileHelper<\n+88 typename CopyConstHelper<\n+89 std::decay_t,\n+90 std::remove_reference_t\n+91 >::type,\n+92 std::remove_reference_t\n+93 >::type,\n+94 Src\n+95 >::type;\n+96\n+97 template::value - 1> >\n+100 struct RemoveEnd;\n+101 template\n+102 struct RemoveEnd>\n+103 {\n+104 using Back = TypeListEntry_t::value - 1, Types>;\n+105 static_assert(std::is_same::value,\n+106 \"TypeList not terminated by proper EndMark\");\n+107 using type = TypeList...>;\n+108 };\n+109\n+110 template\n+111 struct TypeInList;\n 112\n-118 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-119\n-123 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx();\n+113 template\n+114 struct TypeInList > : std::false_type {};\n+115\n+116 template\n+117 struct TypeInList > : std::true_type {};\n+118\n+119 template\n+120 struct TypeInList,\n+121 _\bs_\bt_\bd::enable_if_t::value> > :\n+122 TypeInList >::type\n+123 {};\n 124\n-125\n-131 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be,\n-132 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* local);\n-133\n-134\n-140 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be);\n+125 template\n+126 struct _\bI_\bs_\bL_\bo_\bo_\bp : std::false_type {};\n+127 template\n+128 struct _\bI_\bs_\bL_\bo_\bo_\bp > : std::true_type {};\n+129\n+130 // used inside static_assert to trick the compiler into printing a list\n+131 // of types:\n+132 //\n+133 // static_assert(debugTypes(Std::bool_constant{}), \"msg\");\n+134 //\n+135 // Should include what the type `V` expands to in the error message.\n+136 template\n+137 constexpr bool debugTypes(std::true_type) { return true; }\n+138 template\n+139 [[deprecated]]\n+140 constexpr bool debugTypes(std::false_type) { return false; }\n 141\n-142 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+142 } // namespace Impl\n 143\n-144 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-145 private:\n-147 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* localIndex_;\n-148\n-150 char attribute_;\n-151 };\n-152\n-153 template\n-154 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-155\n-156 class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n-157\n-158 template\n-159 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-160\n-161 // forward declaration needed for friend declaration.\n-162 template\n-163 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-164\n-165 // forward declaration needed for friend declaration.\n-166 template\n-_\b1_\b6_\b7 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-168\n-169\n-186 template > >\n-_\b1_\b8_\b8 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-189 {\n-_\b1_\b9_\b0 friend class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n-191 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n-192 template\n-_\b1_\b9_\b3 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-194 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b1_\b,_\bA_\b1_\b>&,\n-195 const T1&);\n-196\n-197 template\n-_\b1_\b9_\b8 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-_\b1_\b9_\b9 friend std::ostream& operator<<<>(std::ostream&, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b>&);\n-200\n-201 public:\n-202\n-_\b2_\b0_\b6 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+_\b1_\b4_\b5 struct _\bE_\bn_\bd_\bM_\ba_\br_\bk {};\n+147\n+156 template\n+_\b1_\b5_\b7 using _\bR_\be_\bb_\bi_\bn_\bd_\bL_\bi_\bs_\bt =\n+158 typename Impl::RemoveEnd<_\bE_\bn_\bd_\bM_\ba_\br_\bk, _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt >::type;\n+159\n+161 template\n+_\b1_\b6_\b2 using _\bI_\bs_\bL_\bo_\bo_\bp = typename Impl::IsLoop::type;\n+163\n+_\b1_\b6_\b4 class _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt {\n+165 bool good_ = true;\n+166 std::ostream &log_ = std::cerr;\n+167 // records the types for which checks have started running to avoid\n+168 // infinite recursion\n+169 std::unordered_set seen_;\n+170\n+172 //\n+173 // Helper functions\n+174 //\n+175\n+176 void complain(const char *file, int line, const char *func,\n+177 const char *expr);\n+178\n+179 void complain(const char *file, int line, const char *func,\n+180 const std::string &opname, const char *expr);\n+181\n+182 // This macro is defined only within this file, do not use anywhere\n+183 // else. Doing the actual printing in an external function dramatically\n+184 // reduces memory use during compilation. Defined in such a way that\n+185 // the call will only happen for failed checks.\n+_\b1_\b8_\b6#define DUNE_SIMD_CHECK(expr) \\\n+187 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))\n+188\n+189 // the function using this macro must define a way to compute the\n+190 // operator name in DUNE_SIMD_OPNAME\n+_\b1_\b9_\b1#define DUNE_SIMD_CHECK_OP(expr) \\\n+192 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\\n+193 DUNE_SIMD_OPNAME, #expr))\n+194\n+195 // \"cast\" into a prvalue\n+196 template\n+197 static std::decay_t prvalue(T &&t)\n+198 {\n+199 return std::forward(t);\n+200 }\n+201\n+202 // whether the vector is 42 in all lanes\n+203 template\n+204 static bool is42(const V &v)\n+205 {\n+206 bool _\bg_\bo_\bo_\bd = true;\n 207\n-_\b2_\b1_\b0 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+208 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(v); ++l)\n+209 // need to cast in case we have a mask type\n+210 _\bg_\bo_\bo_\bd &= (_\bl_\ba_\bn_\be(l, v) == Scalar(42));\n 211\n-_\b2_\b1_\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-216\n-217\n-_\b2_\b2_\b1 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-222\n-_\b2_\b2_\b6 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-227\n-_\b2_\b3_\b1 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-232\n-233\n-_\b2_\b3_\b7 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n-rebind_alloc;\n+212 return _\bg_\bo_\bo_\bd;\n+213 }\n+214\n+215 // make a vector that contains the sequence { 1, 2, ... }\n+216 template\n+217 static V make123()\n+218 {\n+219 // initialize to avoid undefined behaviour if assigning to lane()\n+220 // involves lvalue-to-rvalue conversions, e.g. due to bitmask\n+221 // operations. Avoid using broadcast() for initialization to avoid\n+222 // test interdependencies.\n+223 V vec(Scalar(0));\n+224 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n+225 _\bl_\ba_\bn_\be(l, vec) = l + 1;\n+226 return vec;\n+227 }\n+228\n+229 // whether the vector contains the sequence { 1, 2, ... }\n+230 template\n+231 static bool is123(const V &v)\n+232 {\n+233 bool _\bg_\bo_\bo_\bd = true;\n+234\n+235 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(v); ++l)\n+236 // need to cast in case we have a mask type\n+237 _\bg_\bo_\bo_\bd &= (_\bl_\ba_\bn_\be(l, v) == Scalar(l+1));\n 238\n-240 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_\b1 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n-242\n-244 typedef std::map >\n-_\b2_\b4_\b5 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n-246\n-_\b2_\b4_\b7 typedef typename RemoteIndexMap::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-248\n-266 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-267 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n-(), bool includeSelf=false);\n-268\n-269 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n-270\n-278 void _\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf(bool includeSelf);\n+239 return _\bg_\bo_\bo_\bd;\n+240 }\n+241\n+242 template\n+243 static V leftVector()\n+244 {\n+245 // Avoid using broadcast() for initialization to avoid test\n+246 // interdependencies.\n+247 V res(Scalar(0));\n+248 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(res); ++l)\n+249 _\bl_\ba_\bn_\be(l, res) = Scalar(l+1);\n+250 return res;\n+251 }\n+252\n+253 template\n+254 static V rightVector()\n+255 {\n+256 // Avoid using broadcast() for initialization to avoid test\n+257 // interdependencies.\n+258 V res(Scalar(0));\n+259 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(res); ++l)\n+260 // do not exceed number of bits in char (for shifts)\n+261 // avoid 0 (for / and %)\n+262 _\bl_\ba_\bn_\be(l, res) = Scalar((l)%7+1);\n+263 return res;\n+264 }\n+265\n+266 template\n+267 static T leftScalar()\n+268 {\n+269 return T(42);\n+270 }\n+271\n+272 template\n+273 static T rightScalar()\n+274 {\n+275 // do not exceed number of bits in char (for shifts)\n+276 // avoid 0 (for / and %)\n+277 return T(5);\n+278 }\n 279\n-296 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-297 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n-());\n+280 template\n+281 using CopyRefQual = Impl::CopyRefQual;\n+282\n+283 // test whether the Op supports the operation on scalars. We do not use\n+284 // `lane()` to obtain the scalars, because that might return a proxy\n+285 // object, and we are interested in what exactly the scalar type can do,\n+286 // no a proxy that might have more overloads than needed. In addition,\n+287 // `lane()` may not preserve `const` and reference qualifiers.\n+288 template\n+289 using ScalarResult =\n+290 decltype(std::declval().\n+291 scalar(std::declval,\n+292 Vectors> >()...));\n+293\n+295 //\n+296 // Check associated types\n+297 //\n 298\n-299 template\n-_\b3_\b0_\b0 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+299 template\n+300 void checkScalar()\n 301 {\n-302 neighbourIds.clear();\n-303 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+302 // check that the type Scalar exists\n+303 using T = Scalar;\n 304\n-305 }\n-306\n-_\b3_\b0_\b7 const std::set& _\bg_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const\n-308 {\n-309 return neighbourIds;\n-310 }\n-311\n-315 _\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n-316\n-326 template\n-327 void _\br_\be_\bb_\bu_\bi_\bl_\bd();\n-328\n-329 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-330\n-338 inline bool _\bi_\bs_\bS_\by_\bn_\bc_\be_\bd() const;\n-339\n-343 inline MPI_Comm _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const;\n-344\n-359 template\n-360 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+305 static_assert(std::is_same >::value, \"Scalar types \"\n+306 \"must not be references, and must not include \"\n+307 \"cv-qualifiers\");\n+308 [[maybe_unused]] T a{};\n+309 }\n+310\n+311 template\n+312 [[deprecated(\"Warning: please include bool in the Rebinds for \"\n+313 \"simd type V, as Masks are not checked otherwise.\")]]\n+314 void warnMissingMaskRebind(std::true_type) {}\n+315 template\n+316 void warnMissingMaskRebind(std::false_type) {}\n+317\n+318 template class RebindPrune,\n+319 template class RebindAccept, class Recurse>\n+320 void checkRebindOf(Recurse recurse)\n+321 {\n+322 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(Rebinds{}, [this,recurse](auto target) {\n+323 using T = typename decltype(target)::type;\n+324\n+325 // check that the rebound type exists\n+326 using W = Rebind;\n+327 log_ << \"Type \" << className() << \" rebound to \"\n+328 << className() << \" is \" << className() << std::endl;\n+329\n+330 static_assert(std::is_same >::value, \"Rebound \"\n+331 \"types must not be references, and must not include \"\n+332 \"cv-qualifiers\");\n+333 static_assert(lanes() == lanes(), \"Rebound types must have \"\n+334 \"the same number of lanes as the original vector \"\n+335 \"types\");\n+336 static_assert(std::is_same >::value, \"Rebound types \"\n+337 \"must have the bound-to scalar type\");\n+338\n+339 if constexpr (RebindPrune{}) {\n+340 log_ << \"Pruning check of Simd type \" << className()\n+341 << std::endl;\n+342 }\n+343 else {\n+344 using Impl::debugTypes;\n+345 static_assert(debugTypes(RebindAccept{}),\n+346 \"Rebind is W, but that is not accepted \"\n+347 \"by RebindAccept\");\n+348 recurse(MetaType{});\n+349 }\n+350 });\n+351\n+352 static_assert(std::is_same, V>, V>::value, \"A type \"\n+353 \"rebound to its own scalar type must be the same type \"\n+354 \"as the original type\");\n+355 static_assert(std::is_same, Mask >::value, \"A type \"\n+356 \"rebound to bool must be the mask type for that type\");\n+357\n+358 constexpr bool hasBool = Impl::TypeInList::value;\n+359 warnMissingMaskRebind(Std::bool_constant{});\n+360 }\n 361\n-368 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd(int proc) const;\n-369\n-374 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+363 //\n+364 // Fundamental checks\n+365 //\n+366\n+367 template\n+368 void checkLanes()\n+369 {\n+370 // check lanes\n+371 static_assert(std::is_same())>::value,\n+372 \"return type of lanes() should be std::size_t\");\n+373 static_assert(std::is_same::value,\n+374 \"return type of lanes(V{}) should be std::size_t\");\n 375\n-380 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+376 // the result of lanes() must be constexpr\n+377 [[maybe_unused]] constexpr auto size = lanes();\n+378 // but the result of lanes(vec) does not need to be constexpr\n+379 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(lanes() == _\bl_\ba_\bn_\be_\bs(V{}));\n+380 }\n 381\n-385 template\n-386 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-387\n-391 inline void _\bf_\br_\be_\be();\n-392\n-397 inline int _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const;\n-398\n-400 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-401\n-403 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-404\n-405 private:\n-407 _\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+382 template\n+383 void checkDefaultConstruct()\n+384 {\n+385 { [[maybe_unused]] V vec; }\n+386 { [[maybe_unused]] V vec{}; }\n+387 { [[maybe_unused]] V vec = {}; }\n+388 }\n+389\n+390 template\n+391 void checkLane()\n+392 {\n+393 // Avoid using broadcast() for initialization to avoid test\n+394 // interdependencies.\n+395 V vec(Scalar(0));\n+396 // check lane() on mutable lvalues\n+397 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n+398 _\bl_\ba_\bn_\be(l, vec) = l + 1;\n+399 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n+400 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bl_\ba_\bn_\be(l, vec) == Scalar(l + 1));\n+401 using MLRes = decltype(_\bl_\ba_\bn_\be(0, vec));\n+402 static_assert(std::is_same&>::value ||\n+403 std::is_same >::value,\n+404 \"Result of lane() on a mutable lvalue vector must \"\n+405 \"either be a mutable reference to a scalar of that \"\n+406 \"vector or a proxy object (which itself may not be a \"\n+407 \"reference nor const).\");\n 408\n-410 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* source_;\n-411\n-413 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* target_;\n-414\n-416 MPI_Comm comm_;\n-417\n-420 std::set neighbourIds;\n-421\n-423 const static int commTag_=333;\n-424\n-429 int sourceSeqNo_;\n-430\n-435 int destSeqNo_;\n-436\n-440 bool publicIgnored;\n-441\n-445 bool firstBuild;\n-446\n-447 /*\n-448 * @brief If true, sending from indices of the processor to other\n-449 * indices on the same processor is enabled even if the same indexset is\n-used\n-450 * on both the\n-451 * sending and receiving side.\n-452 */\n-453 bool includeSelf;\n-454\n-456 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-457 PairType;\n-458\n-465 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp remoteIndices_;\n-466\n-477 template\n-478 inline void buildRemote(bool includeSelf);\n-479\n-485 inline int noPublic(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet);\n+409 // check lane() on const lvalues\n+410 const V &vec2 = vec;\n+411 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n+412 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bl_\ba_\bn_\be(l, vec2) == Scalar(l + 1));\n+413 using CLRes = decltype(_\bl_\ba_\bn_\be(0, vec2));\n+414 static_assert(std::is_same&>::value ||\n+415 std::is_same >::value,\n+416 \"Result of lane() on a const lvalue vector must \"\n+417 \"either be a const lvalue reference to a scalar of that \"\n+418 \"vector or a proxy object (which itself may not be a \"\n+419 \"reference nor const).\");\n+420 static_assert(!std::is_assignable >::value,\n+421 \"Result of lane() on a const lvalue vector must not be \"\n+422 \"assignable from a scalar.\");\n+423\n+424 // check lane() on rvalues\n+425 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n+426 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bl_\ba_\bn_\be(l, prvalue(vec)) == Scalar(l + 1));\n+427 using RRes = decltype(_\bl_\ba_\bn_\be(0, prvalue(vec)));\n+428 // TODO: do we really want to allow Scalar&& here? If we allow it,\n+429 // then `auto &&res = lane(0, vec*vec);` creates a dangling reference,\n+430 // and the scalar (and even the vector types) are small enough to be\n+431 // passed in registers anyway. On the other hand, the only comparable\n+432 // accessor function in the standard library that I can think of is\n+433 // std::get(), and that does return an rvalue reference in this\n+434 // situation. However, that cannot assume anything about the size of\n+435 // the returned types.\n+436 static_assert(std::is_same >::value ||\n+437 std::is_same&&>::value,\n+438 \"Result of lane() on a rvalue vector V must be \"\n+439 \"Scalar or Scalar&&.\");\n+440 // Can't assert non-assignable, fails for any typical class,\n+441 // e.g. std::complex<>. Would need to return const Scalar or const\n+442 // Scalar&&, which would inhibit moving from the return value.\n+443 // static_assert(!std::is_assignable >::value,\n+444 // \"Result of lane() on a rvalue vector must not be \"\n+445 // \"assignable from a scalar.\");\n+446 }\n+447\n+448 // check non-default constructors\n+449 template\n+450 void checkCopyMoveConstruct()\n+451 {\n+452 // elided copy/move constructors\n+453 { V vec (make123()); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+454 { V vec = make123() ; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+455 { V vec {make123()}; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+456 { V vec = {make123()}; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+457\n+458 // copy constructors\n+459 { V ref(make123()); V vec (ref);\n+460 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n+461 { V ref(make123()); V vec = ref ;\n+462 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n+463 { V ref(make123()); V vec {ref};\n+464 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n+465 { V ref(make123()); V vec = {ref};\n+466 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n+467 { const V ref(make123()); V vec (ref);\n+468 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+469 { const V ref(make123()); V vec = ref ;\n+470 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+471 { const V ref(make123()); V vec {ref};\n+472 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+473 { const V ref(make123()); V vec = {ref};\n+474 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+475\n+476 // move constructors\n+477 { V ref(make123()); V vec (std::move(ref));\n+478 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+479 { V ref(make123()); V vec = std::move(ref) ;\n+480 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+481 { V ref(make123()); V vec {std::move(ref)};\n+482 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+483 { V ref(make123()); V vec = {std::move(ref)};\n+484 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+485 }\n 486\n-498 template\n-499 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-500 char* p_out, MPI_Datatype type, int bufferSize,\n-501 int* position, int n);\n-502\n-516 inline void unpackIndices(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remote, int remoteEntries,\n-517 PairType** local, int localEntries, char* p_in,\n-518 MPI_Datatype type, int* position, int bufferSize,\n-519 bool fromOurself);\n-520\n-521 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-522 int remoteEntries, PairType** localSource,\n-523 int localSourceEntries, PairType** localDest,\n-524 int localDestEntries, char* p_in,\n-525 MPI_Datatype type, int* position, int bufferSize);\n-526\n-527 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType**\n-DestPairs,\n-528 int remoteProc, int sourcePublish, int destPublish,\n-529 int bufferSize, bool sendTwo, bool fromOurSelf=false);\n-530 };\n-531\n-549 template\n-_\b5_\b5_\b0 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-551 {\n-552\n-553 template\n-_\b5_\b5_\b4 friend class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-555\n-556 public:\n-_\b5_\b5_\b7 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-558 {};\n-559\n-_\b5_\b6_\b8 constexpr static bool _\bM_\bO_\bD_\bI_\bF_\bY_\bI_\bN_\bD_\bE_\bX_\bS_\bE_\bT = mode;\n-569\n-_\b5_\b7_\b3 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-574\n-_\b5_\b7_\b8 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-579\n-_\b5_\b8_\b3 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-584\n-_\b5_\b8_\b8 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-589\n-_\b5_\b9_\b3 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-594\n-_\b5_\b9_\b8 typedef A _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n-599\n-601 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_\b2 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n-603\n-_\b6_\b0_\b7 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-608\n-_\b6_\b1_\b2 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-613\n-627 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index);\n+487 template\n+488 void checkBroadcastVectorConstruct()\n+489 {\n+490 // broadcast copy constructors\n+491 { Scalar ref = 42; V vec (ref);\n+492 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n+493 { Scalar ref = 42; V vec = ref ;\n+494 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n+495 // { Scalar ref = 42; V vec {ref};\n+496 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n+497 // { Scalar ref = 42; V vec = {ref};\n+498 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n+499 { const Scalar ref = 42; V vec (ref);\n+500 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+501 { const Scalar ref = 42; V vec = ref ;\n+502 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+503 // { const Scalar ref = 42; V vec {ref};\n+504 // DUNE_SIMD_CHECK(is42(vec)); }\n+505 // { const Scalar ref = 42; V vec = {ref};\n+506 // DUNE_SIMD_CHECK(is42(vec)); }\n+507\n+508 // broadcast move constructors\n+509 { Scalar ref = 42; V vec (std::move(ref));\n+510 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+511 { Scalar ref = 42; V vec = std::move(ref) ;\n+512 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+513 // { Scalar ref = 42; V vec {std::move(ref)};\n+514 // DUNE_SIMD_CHECK(is42(vec)); }\n+515 // { Scalar ref = 42; V vec = {std::move(ref)};\n+516 // DUNE_SIMD_CHECK(is42(vec)); }\n+517 }\n+518\n+519 template\n+520 void checkBroadcastMaskConstruct()\n+521 {\n+522 // broadcast copy constructors\n+523 { Scalar ref = 42; V vec (ref);\n+524 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n+525 // { Scalar ref = 42; V vec = ref ;\n+526 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n+527 { Scalar ref = 42; V vec {ref};\n+528 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n+529 // { Scalar ref = 42; V vec = {ref};\n+530 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n+531 { const Scalar ref = 42; V vec (ref);\n+532 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+533 // { const Scalar ref = 42; V vec = ref ;\n+534 // DUNE_SIMD_CHECK(is42(vec)); }\n+535 { const Scalar ref = 42; V vec {ref};\n+536 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+537 // { const Scalar ref = 42; V vec = {ref};\n+538 // DUNE_SIMD_CHECK(is42(vec)); }\n+539\n+540 // broadcast move constructors\n+541 { Scalar ref = 42; V vec (std::move(ref));\n+542 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+543 // { Scalar ref = 42; V vec = std::move(ref) ;\n+544 // DUNE_SIMD_CHECK(is42(vec)); }\n+545 { Scalar ref = 42; V vec {std::move(ref)};\n+546 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n+547 // { Scalar ref = 42; V vec = {std::move(ref)};\n+548 // DUNE_SIMD_CHECK(is42(vec)); }\n+549 }\n+550\n+551 // check the implCast function\n+552 template\n+553 void checkImplCast()\n+554 {\n+555 { // lvalue arg\n+556 FromV fromVec = make123();\n+557 auto toVec = implCast(fromVec);\n+558 static_assert(std::is_same::value,\n+559 \"Unexpected result type for implCast(FromV&)\");\n+560 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(fromVec));\n+561 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(toVec));\n+562 }\n+563\n+564 { // const lvalue arg\n+565 const FromV fromVec = make123();\n+566 auto toVec = implCast(fromVec);\n+567 static_assert(std::is_same::value,\n+568 \"Unexpected result type for implCast(const \"\n+569 \"FromV&)\");\n+570 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(toVec));\n+571 }\n+572\n+573 { // rvalue arg\n+574 auto toVec = implCast(make123());\n+575 static_assert(std::is_same::value,\n+576 \"Unexpected result type for implCast(FromV&&)\");\n+577 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(toVec));\n+578 }\n+579 }\n+580\n+581 // check the implCast function\n+582 template\n+583 void checkImplCast()\n+584 {\n+585 // check against LoopSIMD\n+586 using LoopV = _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b>, lanes()>;\n+587\n+588 checkImplCast();\n+589 checkImplCast();\n+590 checkImplCast();\n+591 }\n+592\n+593 // check the broadcast function\n+594 template\n+595 void checkBroadcast()\n+596 {\n+597 // broadcast function\n+598 { // lvalue arg\n+599 Scalar ref = 42;\n+600 auto vec = broadcast(ref);\n+601 static_assert(std::is_same::value,\n+602 \"Unexpected result type for broadcast()\");\n+603 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n+604 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42));\n+605 }\n+606\n+607 { // const lvalue arg\n+608 const Scalar ref = 42;\n+609 auto vec = broadcast(ref);\n+610 static_assert(std::is_same::value,\n+611 \"Unexpected result type for broadcast()\");\n+612 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n+613 }\n+614\n+615 { // rvalue arg\n+616 auto vec = broadcast(Scalar(42));\n+617 static_assert(std::is_same::value,\n+618 \"Unexpected result type for broadcast()\");\n+619 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n+620 }\n+621\n+622 { // int arg\n+623 auto vec = broadcast(42);\n+624 static_assert(std::is_same::value,\n+625 \"Unexpected result type for broadcast()\");\n+626 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n+627 }\n 628\n-629\n-644 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+629 { // double arg\n+630 auto vec = broadcast(42.0);\n+631 static_assert(std::is_same::value,\n+632 \"Unexpected result type for broadcast()\");\n+633 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n+634 }\n+635 }\n+636\n+637 template\n+638 void checkBracedAssign()\n+639 {\n+640 // copy assignment\n+641 { V ref = make123(); V vec; vec = {ref};\n+642 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n+643 { const V ref = make123(); V vec; vec = {ref};\n+644 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n 645\n-653 bool _\br_\be_\bm_\bo_\bv_\be(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n-654\n-667 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-668\n+646 // move assignment\n+647 { V vec; vec = {make123()}; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n+648 }\n+649\n+650 template\n+651 void checkBracedBroadcastAssign()\n+652 {\n+653 // nothing works here\n+654 // // broadcast copy assignment\n+655 // { Scalar ref = 42; V vec; vec = {ref};\n+656 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n+657 // { const Scalar ref = 42; V vec; vec = {ref};\n+658 // DUNE_SIMD_CHECK(is42(vec)); }\n+659\n+660 // // broadcast move assignment\n+661 // { Scalar ref = 42; V vec; vec = {std::move(ref)};\n+662 // DUNE_SIMD_CHECK(is42(vec)); }\n+663 }\n+664\n+666 //\n+667 // checks for unary operators\n+668 //\n 669\n-670 _\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-671\n-_\b6_\b7_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br()\n-677 : glist_()\n-678 {}\n-679\n-680 private:\n-681\n-687 _\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-688 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList);\n-689\n-690 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-691 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-692 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* rList_;\n-693 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* indexSet_;\n-694 GlobalList glist_;\n-695 _\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n-696 GlobalModifyIterator giter_;\n-697 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n-698 bool first_;\n-699 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx last_;\n-700 };\n-701\n-706 template\n-_\b7_\b0_\b7 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-708 {\n-709\n-713 typedef T ParallelIndexSet;\n-714\n-718 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-719\n-723 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+_\b6_\b7_\b0#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL) \\\n+671 struct OpPostfix##NAME \\\n+672 { \\\n+673 template \\\n+674 auto operator()(V&& v) const \\\n+675 -> decltype(std::forward(v) SYMBOL) \\\n+676 { \\\n+677 return std::forward(v) SYMBOL; \\\n+678 } \\\n+679 }\n+680\n+_\b6_\b8_\b1#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL) \\\n+682 struct OpPrefix##NAME \\\n+683 { \\\n+684 template \\\n+685 auto operator()(V&& v) const \\\n+686 -> decltype(SYMBOL std::forward(v)) \\\n+687 { \\\n+688 return SYMBOL std::forward(v); \\\n+689 } \\\n+690 }\n+691\n+692 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(Decrement, -- );\n+693 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(Increment, ++ );\n+694\n+695 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Decrement, -- );\n+696 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Increment, ++ );\n+697\n+698 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Plus, + );\n+699 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Minus, - );\n+700 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (LogicNot, ! );\n+701 // Do not warn about ~ being applied to bool. (1) Yes, doing that is\n+702 // weird, but we do want to test the weird stuff too. (2) It avoids\n+703 // running into on\n+704 // g++-7.0 through 7.2. Also, ignore -Wpragmas to not warn about an\n+705 // unknown -Wbool-operation on compilers that do not know that option.\n+706#pragma GCC diagnostic push\n+707#pragma GCC diagnostic ignored \"-Wpragmas\"\n+708#pragma GCC diagnostic ignored \"-Wunknown-warning-option\" // clang 6.0.1\n+709#pragma GCC diagnostic ignored \"-Wbool-operation\"\n+710 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (BitNot, ~ );\n+711#pragma GCC diagnostic pop\n+712\n+713#undef DUNE_SIMD_POSTFIX_OP\n+714#undef DUNE_SIMD_PREFIX_OP\n+715\n+716 template\n+717 std::enable_if_t<\n+718 IsCallable())))>::value>\n+719 checkUnaryOpV(Op op)\n+720 {\n+721#define DUNE_SIMD_OPNAME (className())\n+722 // arguments\n+723 auto val = leftVector>();\n 724\n-728 typedef typename LocalIndex::Attribute Attribute;\n-729\n-731 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-732\n-734 using Allocator = typename std::allocator_traits::template\n-rebind_alloc;\n-735\n-737 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-738\n-740 typedef std::map >\n-742 Map;\n-743\n-744 public:\n-745\n-747 typedef std::map >\n-_\b7_\b4_\b8 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n-749\n-755 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-756\n-765 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global);\n-766\n-776 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global, const Attribute& attribute);\n+725 // copy the arguments in case V is a references\n+726 auto arg = val;\n+727 auto &&result = op(static_cast(arg));\n+728 using T = _\bS_\bc_\ba_\bl_\ba_\br >;\n+729 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(val); ++l)\n+730 {\n+731 // `op` might promote the argument. This is a problem if the\n+732 // argument of the operation on the right of the `==` is\n+733 // e.g. `(unsigned short)1` and the operation is e.g. unary `-`.\n+734 // Then the argument is promoted to `int` before applying the\n+735 // negation, and the result is `(int)-1`. However, the left side of\n+736 // the `==` is still `(unsigned short)-1`, which typically is the\n+737 // same as `(unsigned short)65535`. The `==` promotes the left side\n+738 // before comparing, so that becomes `(int)65535`. It will then\n+739 // compare `(int)65535` and `(int)-1` and rightly declare them to be\n+740 // not equal.\n+741\n+742 // To work around this, we explicitly convert the right side of the\n+743 // `==` to the scalar type before comparing.\n+744 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n+745 (_\bl_\ba_\bn_\be(l, result)\n+746 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(val)))));\n+747 }\n+748 // op might modify val, verify that any such modification also happens\n+749 // in the vector case\n+750 for(std::size_t l = 0; l < lanes >(); ++l)\n+751 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, val) == _\bl_\ba_\bn_\be(l, arg));\n+752#undef DUNE_SIMD_OPNAME\n+753 }\n+754\n+755 template\n+756 std::enable_if_t<\n+757 not IsCallable())))>::value>\n+758 checkUnaryOpV(Op op)\n+759 {\n+760 // log_ << \"No \" << className())))>()\n+761 // << std::endl\n+762 // << \" ==> Not checking \" << className() << std::endl;\n+763 }\n+764\n+765 template\n+766 void checkUnaryOpsV(Op op)\n+767 {\n+768 checkUnaryOpV(op);\n+769 checkUnaryOpV(op);\n+770 checkUnaryOpV(op);\n+771 }\n+772\n+774 //\n+775 // checks for binary operators\n+776 //\n 777\n-778 _\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-779\n-783 inline bool _\be_\bm_\bp_\bt_\by() const;\n-784\n-_\b7_\b9_\b1 class _\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-792 {\n-793 public:\n-_\b7_\b9_\b4 typedef typename Map::iterator _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b7_\b9_\b5 typedef typename Map::iterator _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+778 // The operators contain an `operator()`, which will be invoked for both\n+779 // scalar and vector arguments. The function `scalar()` is used the\n+780 // test whether the scalar types support the operation (via\n+781 // `ScalarResult`). The difference is that `scalar()` should only ever\n+782 // receive `const`-ref-qualified version of `Scalar`, while the\n+783 // `operator()` may also be called with proxies representing scalars.\n+_\b7_\b8_\b4#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL) \\\n+785 struct OpInfix##NAME \\\n+786 { \\\n+787 template \\\n+788 decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n+789 { \\\n+790 return std::forward(v1) SYMBOL std::forward(v2); \\\n+791 } \\\n+792 template \\\n+793 auto scalar(S1&& s1, S2&& s2) const \\\n+794 -> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n+795 }\n 796\n-797\n-_\b7_\b9_\b9 _\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-800 : iter_(iter), end_(_\be_\bn_\bd), index_(index), hasAttribute(false)\n-801 {\n-802 // Move to the first valid entry\n-803 while(iter_!=end_ && iter_->second.first->localIndexPair().global\n-()!=index_)\n-804 ++iter_;\n-805 }\n-806\n-_\b8_\b0_\b7 _\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-808 Attribute attribute)\n-809 : iter_(iter), end_(_\be_\bn_\bd), index_(index), attribute_(attribute),\n-hasAttribute(true)\n-810 {\n-811 // Move to the first valid entry or the end\n-812 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n-()!=index_\n-813 || iter_->second.first->localIndexPair().local().attribute()!=attribute))\n-814 ++iter_;\n-815 }\n-_\b8_\b1_\b7 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n-818 : iter_(other.iter_), end_(other.end_), index_(other.index_)\n-819 { }\n-820\n-_\b8_\b2_\b2 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-823 {\n-824 ++iter_;\n-825 // If entry is not valid move on\n-826 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n-()!=index_ ||\n-827 (hasAttribute &&\n-828 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))\n-829 ++iter_;\n-830 assert(iter_==end_ ||\n-831 (iter_->second.first->localIndexPair().global()==index_));\n-832 assert(iter_==end_ || !hasAttribute ||\n-833 (iter_->second.first->localIndexPair().local().attribute()==attribute_));\n-834 return *this;\n-835 }\n-836\n-_\b8_\b3_\b8 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n-839 {\n-840 return *(iter_->second.first);\n-841 }\n-842\n-_\b8_\b4_\b4 int _\bp_\br_\bo_\bc_\be_\bs_\bs() const\n-845 {\n-846 return iter_->first;\n-847 }\n+797 // for assign ops, accept only non-const lvalue arguments for scalars.\n+798 // This is needed for class scalars (e.g. std::complex) because\n+799 // non-const class rvalues are actually usually assignable. Though that\n+800 // assignment happens to a temporary, and thus is lost. Except that the\n+801 // tests would bind the result of the assignment to a reference. And\n+802 // because that result is returned from a function by reference, even\n+803 // though it is a temporary passed as an argument to that function,\n+804 // accessing the result later is undefined behaviour.\n+_\b8_\b0_\b5#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL) \\\n+806 struct OpInfix##NAME \\\n+807 { \\\n+808 template \\\n+809 decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n+810 { \\\n+811 return std::forward(v1) SYMBOL std::forward(v2); \\\n+812 } \\\n+813 template \\\n+814 auto scalar(S1& s1, S2&& s2) const \\\n+815 -> decltype(s1 SYMBOL std::forward(s2)); \\\n+816 }\n+817\n+_\b8_\b1_\b8#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL) \\\n+819 struct OpInfix##NAME \\\n+820 { \\\n+821 template \\\n+822 decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n+823 { \\\n+824 return Simd::REPLFN(std::forward(v1), std::forward(v2)); \\\n+825 } \\\n+826 template \\\n+827 auto scalar(S1&& s1, S2&& s2) const \\\n+828 -> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n+829 }\n+830\n+831 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Mul, * );\n+832 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Div, / );\n+833 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Remainder, % );\n+834\n+835 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Plus, + );\n+836 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Minus, - );\n+837\n+838 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(LeftShift, << );\n+839 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(RightShift, >> );\n+840\n+841 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Less, < );\n+842 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Greater, > );\n+843 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(LessEqual, <= );\n+844 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(GreaterEqual, >= );\n+845\n+846 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Equal, == );\n+847 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(NotEqual, != );\n 848\n-_\b8_\b5_\b0 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n-851 {\n-852 return iter_->second.first.operator->();\n-853 }\n-854\n-_\b8_\b5_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n-857 {\n-858 return other.iter_==iter_;\n-859 }\n-860\n-_\b8_\b6_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n-863 {\n-864 return other.iter_!=iter_;\n-865 }\n-866\n-867 private:\n-868 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br();\n+849 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(BitAnd, & );\n+850 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(BitXor, ^ );\n+851 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(BitOr, | );\n+852\n+853 // Those are not supported in any meaningful way by vectorclass\n+854 // We need to test replacement functions maskAnd() and maskOr() instead.\n+855 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP(LogicAnd, _\bm_\ba_\bs_\bk_\bA_\bn_\bd, && );\n+856 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP(LogicOr, _\bm_\ba_\bs_\bk_\bO_\br, || );\n+857\n+858 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(Assign, = );\n+859 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignMul, *= );\n+860 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignDiv, /= );\n+861 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignRemainder, %= );\n+862 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignPlus, += );\n+863 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignMinus, -= );\n+864 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignLeftShift, <<=);\n+865 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignRightShift, >>=);\n+866 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignAnd, &= );\n+867 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignXor, ^= );\n+868 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignOr, |= );\n 869\n-870 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n-871 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n-872 GlobalIndex index_;\n-873 Attribute attribute_;\n-874 bool hasAttribute;\n-875 };\n+870#undef DUNE_SIMD_INFIX_OP\n+871#undef DUNE_SIMD_REPL_OP\n+872#undef DUNE_SIMD_ASSIGN_OP\n+873\n+874 // just used as a tag\n+875 struct OpInfixComma {};\n 876\n-877 iterator _\bb_\be_\bg_\bi_\bn();\n-878\n-879 iterator _\be_\bn_\bd();\n-880\n-881 private:\n-882\n-883 Map map_;\n-884 GlobalIndex index_;\n-885 Attribute attribute_;\n-886 bool noattribute;\n-887 };\n-888\n-889 template\n-_\b8_\b9_\b0 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-891 {\n-892 if(type==MPI_DATATYPE_NULL) {\n-893 int length[2] = {1, 1};\n-894 MPI_Aint base;\n-895 MPI_Aint disp[2];\n-896 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-897 _\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-898 _\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-899 MPI_Get_address(&rep, &base); // lower bound of the datatype\n-900 MPI_Get_address(&(rep.global_), &disp[0]);\n-901 MPI_Get_address(&(rep.local_), &disp[1]);\n-902 for (MPI_Aint& d : disp)\n-903 d -= base;\n-904\n-905 MPI_Datatype tmp;\n-906 MPI_Type_create_struct(2, length, disp, types, &tmp);\n-907\n-908 MPI_Type_create_resized(tmp, 0, sizeof(_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n->), &type);\n-909 MPI_Type_commit(&type);\n-910\n-911 MPI_Type_free(&tmp);\n-912 }\n-913 return type;\n-914 }\n-915\n-916 template\n-917 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-918\n-919 template\n-_\b9_\b2_\b0 _\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-921 : localIndex_(local), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n-(attribute))\n-922 {}\n-923\n-924 template\n-_\b9_\b2_\b5 _\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-926 : localIndex_(0), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n-(attribute))\n-927 {}\n-928\n-929 template\n-_\b9_\b3_\b0 _\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-931 : localIndex_(0), attribute_()\n-932 {}\n-933 template\n-_\b9_\b3_\b4 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-935 {\n-936 return localIndex_==ri.localIndex_ && attribute_==ri._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-937 }\n-938\n-939 template\n-_\b9_\b4_\b0 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-941 {\n-942 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;\n-943 }\n-944\n-945 template\n-_\b9_\b4_\b6 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-947 {\n-948 return T2(attribute_);\n-949 }\n-950\n-951 template\n-_\b9_\b5_\b2 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-953 {\n-954 return *localIndex_;\n-955 }\n-956\n-957 template\n-_\b9_\b5_\b8 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-959 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n-960 const MPI_Comm& comm,\n-961 const std::vector& neighbours,\n-962 bool includeSelf_)\n-963 : source_(&source), target_(&destination), comm_(comm),\n-964 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n-965 includeSelf(includeSelf_)\n-966 {\n-967 _\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs);\n-968 }\n-969\n-970 template\n-_\b9_\b7_\b1 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-972 {\n-973 includeSelf=b;\n-974 }\n-975\n-976 template\n-_\b9_\b7_\b7 _\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-978 : source_(0), target_(0), sourceSeqNo_(-1),\n-979 destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n-980 includeSelf(false)\n-981 {}\n-982\n-983 template\n-_\b9_\b8_\b4 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-985 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n-986 const MPI_Comm& comm,\n-987 const std::vector& neighbours)\n-988 {\n-989 free();\n-990 source_ = &source;\n-991 target_ = &destination;\n-992 comm_ = comm;\n-993 firstBuild = true;\n-994 setNeighbours(neighbours);\n-995 }\n-996\n-997 template\n-998 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_\b9 _\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-1000 {\n-1001 return *source_;\n-1002 }\n-1003\n-1004\n-1005 template\n-1006 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_\b7 _\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-1008 {\n-1009 return *target_;\n-1010 }\n-1011\n-1012\n-1013 template\n-_\b1_\b0_\b1_\b4 _\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-1015 {\n-1016 free();\n-1017 }\n+877 template\n+878 void checkCommaOp(const std::decay_t &val1,\n+879 const std::decay_t &val2)\n+880 {\n+881#define DUNE_SIMD_OPNAME (className())\n+882 static_assert(std::is_same(),\n+883 std::declval())), T2>::value,\n+884 \"Type and value category of the comma operator must \"\n+885 \"match that of the second operand\");\n+886\n+887 // copy the arguments in case T1 or T2 are references\n+888 auto arg1 = val1;\n+889 auto arg2 = val2;\n+890 // Do not warn that the left side of the comma operator is unused.\n+891 // Seems to work for g++-4.9 and clang++-3.8. Appears to be harmless\n+892 // for icpc (14 and 17), and icpc does not seem to issue a warning\n+893 // anyway.\n+894#pragma GCC diagnostic push\n+895#pragma GCC diagnostic ignored \"-Wunused-value\"\n+896 auto &&result = (static_cast(arg1),\n+897 static_cast(arg2));\n+898#pragma GCC diagnostic pop\n+899 if(std::is_reference::value)\n+900 {\n+901 // comma should return the same object as the second argument for\n+902 // lvalues and xvalues\n+903 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(&result == &arg2);\n+904 // it should not modify any arguments\n+905 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(val1 == arg1));\n+906 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(val2 == arg2));\n+907 }\n+908 else\n+909 {\n+910 // comma should return the same value as the second argument for\n+911 // prvalues\n+912 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(result == arg2));\n+913 // it should not modify any arguments\n+914 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(val1 == arg1));\n+915 // second argument is a prvalue, any modifications happen to a\n+916 // temporary and we can't detect them\n+917 }\n+918#undef DUNE_SIMD_OPNAME\n+919 }\n+920\n+922 //\n+923 // checks for vector-vector binary operations\n+924 //\n+925\n+926 // We check the following candidate operation\n+927 //\n+928 // vopres = vop1 @ vop2\n+929 //\n+930 // against the reference operation\n+931 //\n+932 // arefres[l] = aref1[l] @ aref2[l] foreach l\n+933 //\n+934 // v... variables are simd-vectors and a... variables are arrays. The\n+935 // operation may modify the operands, but if is does the modification\n+936 // needs to happen in both the candidate and the reference.\n+937 //\n+938 // We do the following checks:\n+939 // 1. lanes(vopres) == lanes(vop1)\n+940 // 2. lane(l, vopres) == arefres[l] foreach l\n+941 // 3. lane(l, vop1) == aref1[l] foreach l\n+942 // 4. lane(l, vop2) == aref2[l] foreach l\n+943 template\n+944 std::enable_if_t >\n+945 checkBinaryOpVV(MetaType, MetaType, Op op)\n+946 {\n+947#define DUNE_SIMD_OPNAME (className())\n+948 static_assert(std::is_same, std::decay_t >::value,\n+949 \"Internal testsystem error: called with two types that \"\n+950 \"don't decay to the same thing\");\n+951\n+952 // reference arguments\n+953 auto vref1 = leftVector>();\n+954 auto vref2 = rightVector>();\n+955\n+956 // candidate arguments\n+957 auto vop1 = vref1;\n+958 auto vop2 = vref2;\n+959\n+960 // candidate operation\n+961 auto &&vopres = op(static_cast(vop1), static_cast(vop2));\n+962 using VR = decltype(vopres);\n+963\n+964 // check 1. lanes(vopres) == lanes(vop1)\n+965 static_assert(lanes >() == _\bl_\ba_\bn_\be_\bs >(),\n+966 \"The result must have the same number of lanes as the \"\n+967 \"operands.\");\n+968\n+969 // do the reference operation, and simultaneously\n+970 // check 2. lane(l, vopres) == arefres[l] foreach l\n+971 using T = Scalar >;\n+972 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vopres)))\n+973 {\n+974 // see the lengthy comment in `checkUnaryOpV()` as to why the\n+975 // `static_cast` around the `op()` is necessary\n+976 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n+977 (_\bl_\ba_\bn_\be(l, vopres)\n+978 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(vref1)),\n+979 _\bl_\ba_\bn_\be(l, static_cast(vref2)))));\n+980 }\n+981\n+982 // check 3. lane(l, vop1) == aref1[l] foreach l\n+983 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop1)))\n+984 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop1) == _\bl_\ba_\bn_\be(l, vref1));\n+985\n+986 // check 4. lane(l, vop2) == aref2[l] foreach l\n+987 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop2)))\n+988 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop2) == _\bl_\ba_\bn_\be(l, vref2));\n+989\n+990#undef DUNE_SIMD_OPNAME\n+991 }\n+992\n+993 template\n+994 std::enable_if_t >\n+995 checkBinaryOpVV(MetaType, MetaType, Op op)\n+996 {\n+997 // log_ << \"No \" << className())),\n+998 // decltype(lane(0, std::declval())))>()\n+999 // << std::endl\n+1000 // << \" ==> Not checking \" << className() << std::endl;\n+1001 }\n+1002\n+1003 template\n+1004 void checkBinaryOpVV(MetaType, MetaType, OpInfixComma)\n+1005 {\n+1006 static_assert(std::is_same, std::decay_t >::value,\n+1007 \"Internal testsystem error: called with two types that \"\n+1008 \"don't decay to the same thing\");\n+1009\n+1010 checkCommaOp(leftVector>(),\n+1011 rightVector>());\n+1012 }\n+1013\n+1015 //\n+1016 // checks for vector-scalar binary operations\n+1017 //\n 1018\n-1019 template\n-1020 template\n-_\b1_\b0_\b2_\b1 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-1022 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n-1023 char* p_out, MPI_Datatype type,\n-1024 int bufferSize,\n-1025 int *position,\n-1026 [[maybe_unused]] int n)\n-1027 {\n-1028 // fill with own indices\n-1029 const auto end = indexSet._\be_\bn_\bd();\n-1030\n-1031 //Now pack the source indices\n-1032 int i=0;\n-1033 for(auto index = indexSet.begin(); index != end; ++index)\n-1034 if(ignorePublic || index->local().isPublic()) {\n-1035\n-1036 MPI_Pack(const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index)), 1,\n-1037 type,\n-1038 p_out, bufferSize, position, comm_);\n-1039 pairs[i++] = const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index));\n-1040\n-1041 }\n-1042 assert(i==n);\n-1043 }\n-1044\n-1045 template\n-1046 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-1047 {\n-1048\n-1049 int noPublic=0;\n-1050\n-1051 const auto end=indexSet._\be_\bn_\bd();\n-1052 for(auto index=indexSet._\bb_\be_\bg_\bi_\bn(); index!=end; ++index)\n-1053 if(index->local().isPublic())\n-1054 noPublic++;\n-1055\n-1056 return noPublic;\n-1057\n-1058 }\n+1019 // We check the following candidate operation\n+1020 //\n+1021 // vopres = vop1 @ sop2\n+1022 //\n+1023 // against the reference operation\n+1024 //\n+1025 // arefres[l] = aref1[l] @ sref2 foreach l\n+1026 //\n+1027 // v... variables are simd-vectors, a... variables are arrays, and\n+1028 // s... variables are scalars. The operation may modify the left\n+1029 // operand, but if is does the modifications needs to happen in both the\n+1030 // candidate and the reference.\n+1031 //\n+1032 // We do the following checks:\n+1033 // 1. lanes(vopres) == lanes(vop1)\n+1034 // 2. lane(l, vopres) == arefres[l] foreach l\n+1035 // 3. lane(l, vop1) == aref1[l] foreach l\n+1036 // 4. sop2 is never modified\n+1037 // 5. sref2 is never modified\n+1038 //\n+1039 // In fact, if the property \"sref2 is never modified\" is violated that\n+1040 // means the operation is unsuitable for an automatic broadcast of the\n+1041 // second operand and should not be checked. There are no operations in\n+1042 // the standard where the second operand is modified like this, but\n+1043 // there are operations where the first operand is modified -- and this\n+1044 // check is used for those ops as well by exchanging the first and second\n+1045 // argument below.\n+1046\n+1047 template\n+1048 std::enable_if_t >\n+1049 checkBinaryOpVS(MetaType, MetaType, Op op)\n+1050 {\n+1051#define DUNE_SIMD_OPNAME (className())\n+1052 static_assert(std::is_same >,\n+1053 std::decay_t >::value,\n+1054 \"Internal testsystem error: called with a scalar that \"\n+1055 \"does not match the vector type.\");\n+1056\n+1057 // initial values\n+1058 auto sinit2 = rightScalar>();\n 1059\n-1060\n-1061 template\n-1062 inline void RemoteIndices::unpackCreateRemote(char* p_in, PairType**\n-sourcePairs,\n-1063 PairType** destPairs, int remoteProc,\n-1064 int sourcePublish, int destPublish,\n-1065 int bufferSize, bool sendTwo,\n-1066 bool fromOurSelf)\n-1067 {\n-1068\n-1069 // unpack the number of indices we received\n-1070 int noRemoteSource=-1, noRemoteDest=-1;\n-1071 char twoIndexSets=0;\n-1072 int position=0;\n-1073 // Did we receive two index sets?\n-1074 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR,\n-comm_);\n-1075 // The number of source indices received\n-1076 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT,\n-comm_);\n-1077 // The number of destination indices received\n-1078 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);\n+1060 // reference arguments\n+1061 auto vref1 = leftVector>();\n+1062 auto sref2 = sinit2;\n+1063\n+1064 // candidate arguments\n+1065 auto vop1 = vref1;\n+1066 auto sop2 = sref2;\n+1067\n+1068 // candidate operation\n+1069 auto &&vopres = op(static_cast(vop1), static_cast(sop2));\n+1070 using VR = decltype(vopres);\n+1071\n+1072 // check 1. lanes(vopres) == lanes(vop1)\n+1073 static_assert(lanes >() == _\bl_\ba_\bn_\be_\bs >(),\n+1074 \"The result must have the same number of lanes as the \"\n+1075 \"operands.\");\n+1076\n+1077 // check 4. sop2 is never modified\n+1078 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(sop2 == sinit2);\n 1079\n-1080\n-1081 // Indices for which we receive\n-1082 RemoteIndexList* receive= new RemoteIndexList();\n-1083 // Indices for which we send\n-1084 RemoteIndexList* send=0;\n-1085\n-1086 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-1087\n-1088 if(!twoIndexSets) {\n-1089 if(sendTwo) {\n-1090 send = new RemoteIndexList();\n-1091 // Create both remote index sets simultaneously\n-1092 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,\n-1093 destPairs, destPublish, p_in, type, &position, bufferSize);\n-1094 }else{\n-1095 // we only need one list\n-1096 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,\n-1097 p_in, type, &position, bufferSize, fromOurSelf);\n-1098 send=receive;\n-1099 }\n-1100 }else{\n+1080 // do the reference operation, and simultaneously check 2. and 5.\n+1081 using T = _\bS_\bc_\ba_\bl_\ba_\br >;\n+1082 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vopres)))\n+1083 {\n+1084 // check 2. lane(l, vopres) == arefres[l] foreach l\n+1085 // see the lengthy comment in `checkUnaryOpV()` as to why the\n+1086 // `static_cast` around the `op()` is necessary\n+1087 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n+1088 (_\bl_\ba_\bn_\be(l, vopres)\n+1089 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(vref1)),\n+1090 static_cast(sref2) )));\n+1091 // check 5. sref2 is never modified\n+1092 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(sref2 == sinit2);\n+1093 }\n+1094\n+1095 // check 3. lane(l, vop1) == aref1[l] foreach l\n+1096 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop1)))\n+1097 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop1) == _\bl_\ba_\bn_\be(l, vref1));\n+1098\n+1099#undef DUNE_SIMD_OPNAME\n+1100 }\n 1101\n-1102 int oldPos=position;\n-1103 // Two index sets received\n-1104 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,\n-1105 p_in, type, &position, bufferSize, fromOurSelf);\n-1106 if(!sendTwo)\n-1107 //unpack source entries again as destination entries\n-1108 position=oldPos;\n-1109\n-1110 send = new RemoteIndexList();\n-1111 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,\n-1112 p_in, type, &position, bufferSize, fromOurSelf);\n-1113 }\n-1114\n-1115 if(receive->empty() && send->empty()) {\n-1116 if(send==receive) {\n-1117 delete send;\n-1118 }else{\n-1119 delete send;\n-1120 delete receive;\n-1121 }\n-1122 }else{\n-1123 remoteIndices_.insert(std::make_pair(remoteProc,\n-1124 std::make_pair(send,receive)));\n-1125 }\n-1126 }\n-1127\n+1102 template\n+1103 std::enable_if_t >\n+1104 checkBinaryOpVS(MetaType, MetaType, Op op)\n+1105 {\n+1106 // log_ << \"No \"\n+1107 // << className())), T2)>()\n+1108 // << std::endl\n+1109 // << \" ==> Not checking \" << className() << std::endl;\n+1110 }\n+1111\n+1112 template\n+1113 void checkBinaryOpVS(MetaType, MetaType, OpInfixComma)\n+1114 {\n+1115 static_assert(std::is_same >,\n+1116 std::decay_t >::value,\n+1117 \"Internal testsystem error: called with a scalar that \"\n+1118 \"does not match the vector type.\");\n+1119\n+1120 checkCommaOp(leftVector>(),\n+1121 rightScalar>());\n+1122 }\n+1123\n+1125 //\n+1126 // cross-check scalar-vector binary operations against vector-vector\n+1127 //\n 1128\n-1129 template\n-1130 template\n-1131 inline void RemoteIndices::buildRemote(bool includeSelf_)\n-1132 {\n-1133 // Processor configuration\n-1134 int rank, procs;\n-1135 MPI_Comm_rank(comm_, &rank);\n-1136 MPI_Comm_size(comm_, &procs);\n-1137\n-1138 // number of local indices to publish\n-1139 // The indices of the destination will be send.\n-1140 int sourcePublish, destPublish;\n-1141\n-1142 // Do we need to send two index sets?\n-1143 char sendTwo = (source_ != target_);\n-1144\n-1145 if(procs==1 && !(sendTwo || includeSelf_))\n-1146 // Nothing to communicate\n-1147 return;\n-1148\n-1149 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);\n-1150\n-1151 if(sendTwo)\n-1152 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);\n-1153 else\n-1154 // we only need to send one set of indices\n-1155 destPublish = 0;\n-1156\n-1157 int maxPublish, publish=sourcePublish+destPublish;\n-1158\n-1159 // Calculate maximum number of indices send\n-1160 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);\n-1161\n-1162 // allocate buffers\n-1163 PairType** destPairs;\n-1164 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish :\n-1];\n-1165\n-1166 if(sendTwo)\n-1167 destPairs = new PairType*[destPublish>0 ? destPublish : 1];\n-1168 else\n-1169 destPairs=sourcePairs;\n+1129 // We check the following candidate operation\n+1130 //\n+1131 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)\n+1132 //\n+1133 // against the reference operation\n+1134 //\n+1135 // vrefres = vref1 @ sref2\n+1136 //\n+1137 // v... variables are simd-vectors, a... variables are arrays, and\n+1138 // s... variables are scalars.\n+1139 //\n+1140 // We could check the following properties\n+1141 // 1. lanes(vopres) == lanes(vop1)\n+1142 // 2. lane(l, vopres) == lane(l, vrefres) foreach l\n+1143 // 3. lane(l, vop1) == lane(l, vref1) foreach l\n+1144 // but these are given by checking the operation against the scalar\n+1145 // operation in the vector@vector and vector@scalar cases above.\n+1146 //\n+1147 // The only thing left to check is:\n+1148 // 4. lane(l, vop2) foreach l is never modified\n+1149\n+1150 template\n+1151 std::enable_if_t >\n+1152 checkBinaryOpVVAgainstVS(MetaType, MetaType, Op op)\n+1153 {\n+1154#define DUNE_SIMD_OPNAME (className())\n+1155 static_assert(std::is_same >,\n+1156 std::decay_t >::value,\n+1157 \"Internal testsystem error: called with a scalar that \"\n+1158 \"does not match the vector type.\");\n+1159\n+1160 // initial values\n+1161 auto sinit2 = rightScalar>();\n+1162\n+1163 // reference arguments\n+1164 auto vop1 = leftVector>();\n+1165 using V2 = CopyRefQual;\n+1166 std::decay_t vop2(sinit2);\n+1167\n+1168 // candidate operation\n+1169 op(static_cast(vop1), static_cast(vop2));\n 1170\n-1171 char** buffer = new char*[2];\n-1172 int bufferSize;\n-1173 int position=0;\n-1174 int intSize;\n-1175 int charSize;\n-1176\n-1177 // calculate buffer size\n-1178 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-1179\n-1180 MPI_Pack_size(maxPublish, type, comm_,\n-1181 &bufferSize);\n-1182 MPI_Pack_size(1, MPI_INT, comm_,\n-1183 &intSize);\n-1184 MPI_Pack_size(1, MPI_CHAR, comm_,\n-1185 &charSize);\n-1186 // Our message will contain the following:\n-1187 // a bool whether two index sets where sent\n-1188 // the size of the source and the dest indexset,\n-1189 // then the source and destination indices\n-1190 bufferSize += 2 * intSize + charSize;\n+1171 // 4. lane(l, vop2) foreach l is never modified\n+1172 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop2)))\n+1173 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop2) == sinit2);\n+1174\n+1175#undef DUNE_SIMD_OPNAME\n+1176 }\n+1177\n+1178 template\n+1179 std::enable_if_t >\n+1180 checkBinaryOpVVAgainstVS(MetaType, MetaType, Op op)\n+1181 {\n+1182 // log_ << \"No \"\n+1183 // << className())), T2)>()\n+1184 // << std::endl\n+1185 // << \" ==> Not checking \" << className() << std::endl;\n+1186 }\n+1187\n+1188 template\n+1189 void checkBinaryOpVVAgainstVS(MetaType, MetaType, OpInfixComma)\n+1190 { }\n 1191\n-1192 if(bufferSize<=0) bufferSize=1;\n-1193\n-1194 buffer[0] = new char[bufferSize];\n-1195 buffer[1] = new char[bufferSize];\n+1193 //\n+1194 // checks for vector-proxy binary operations\n+1195 //\n 1196\n-1197\n-1198 // pack entries into buffer[0], p_out below!\n-1199 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,\n-1200 comm_);\n-1201\n-1202 // The number of indices we send for each index set\n-1203 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n-1204 comm_);\n-1205 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n-1206 comm_);\n-1207\n-1208 // Now pack the source indices and setup the destination pairs\n-1209 packEntries(sourcePairs, *source_, buffer[0], type,\n-1210 bufferSize, &position, sourcePublish);\n-1211 // If necessary send the dest indices and setup the source pairs\n-1212 if(sendTwo)\n-1213 packEntries(destPairs, *target_, buffer[0], type,\n-1214 bufferSize, &position, destPublish);\n-1215\n-1216\n-1217 // Update remote indices for ourself\n-1218 if(sendTwo|| includeSelf_)\n-1219 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,\n-1220 destPublish, bufferSize, sendTwo, includeSelf_);\n-1221\n-1222 neighbourIds.erase(rank);\n-1223\n-1224 if(neighbourIds.size()==0)\n-1225 {\n-1226 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<::size_type size_type;\n-1262 size_type noNeighbours=neighbourIds.size();\n-1263\n-1264 // setup sends\n-1265 for(std::set::iterator neighbour=neighbourIds.begin();\n-1266 neighbour!= neighbourIds.end(); ++neighbour) {\n-1267 // Only send the information to the neighbouring processors\n-1268 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_,\n-req++);\n-1269 }\n-1270\n-1271 //Test for received messages\n-1272\n-1273 for(size_type received=0; received \n-1314 inline void RemoteIndices::unpackIndices(RemoteIndexList& remote,\n-1315 int remoteEntries,\n-1316 PairType** local,\n-1317 int localEntries,\n-1318 char* p_in,\n-1319 MPI_Datatype type,\n-1320 int* position,\n-1321 int bufferSize,\n-1322 bool fromOurSelf)\n-1323 {\n-1324 if(remoteEntries==0)\n-1325 return;\n-1326\n-1327 PairType index;\n-1328 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n-1329 type, comm_);\n-1330 GlobalIndex oldGlobal=index.global();\n-1331 int n_in=0, localIndex=0;\n-1332\n-1333 //Check if we know the global index\n-1334 while(localIndexglobal()==index.global()) {\n-1336 int oldLocalIndex=localIndex;\n+1197 // We check the following candidate operation\n+1198 //\n+1199 // vopres = vop1 @ pop2\n+1200 //\n+1201 // against the reference operation\n+1202 //\n+1203 // arefres[l] = aref1[l] @ sref2 foreach l\n+1204 //\n+1205 // v... variables are simd-vectors, a... variables are arrays,\n+1206 // p... variables are proxies of simd-vector entries and s... variables\n+1207 // are scalars. The operation may modify the left operand, but if is\n+1208 // does the modifications needs to happen in both the candidate and the\n+1209 // reference.\n+1210 //\n+1211 // We do the following checks:\n+1212 // 1. lanes(vopres) == lanes(vop1)\n+1213 // 2. lane(l, vopres) == arefres[l] foreach l\n+1214 // 3. lane(l, vop1) == aref1[l] foreach l\n+1215 // 4. pop2 is never modified\n+1216 // 5. sref2 is never modified\n+1217 //\n+1218 // In fact, if the property \"sref2 is never modified\" is violated that\n+1219 // means the operation is unsuitable for an automatic broadcast of the\n+1220 // second operand and should not be checked. There are no operations in\n+1221 // the standard where the second operand is modified like this, but\n+1222 // there are operations where the first operand is modified -- and this\n+1223 // check is used for those ops as well by exchanging the first and second\n+1224 // argument below.\n+1225\n+1226 template\n+1227 std::enable_if_t >\n+1228 checkBinaryOpVP(MetaType, MetaType, Op op)\n+1229 {\n+1230 using P2 = decltype(_\bl_\ba_\bn_\be(0, std::declval()));\n+1231 using T2 = CopyRefQual, V2>;\n+1232#define DUNE_SIMD_OPNAME (className())\n+1233 static_assert(std::is_same, Scalar >::value,\n+1234 \"Internal testsystem error: called with two vector \"\n+1235 \"types whose scalar types don't match.\");\n+1236\n+1237 // initial values\n+1238 auto sinit2 = rightScalar>();\n+1239\n+1240 // reference arguments\n+1241 auto vref1 = leftVector>();\n+1242 auto sref2 = sinit2;\n+1243\n+1244 // candidate arguments\n+1245 auto vop1 = vref1;\n+1246 auto vop2 = std::decay_t(Scalar(0));\n+1247 _\bl_\ba_\bn_\be(0, vop2) = sref2; // pop2 is just a name for `lane(0, vop2)`\n+1248\n+1249 // candidate operation\n+1250 auto &&vopres =\n+1251 op(static_cast(vop1), _\bl_\ba_\bn_\be(0, static_cast(vop2)));\n+1252 using VR = decltype(vopres);\n+1253\n+1254 // check 1. lanes(vopres) == lanes(vop1)\n+1255 static_assert(lanes >() == _\bl_\ba_\bn_\be_\bs >(),\n+1256 \"The result must have the same number of lanes as the \"\n+1257 \"operands.\");\n+1258\n+1259 // check 4. pop2 is never modified\n+1260 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(0, vop2) == sinit2);\n+1261\n+1262 // do the reference operation, and simultaneously check 2. and 5.\n+1263 using T = _\bS_\bc_\ba_\bl_\ba_\br;\n+1264 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vopres)))\n+1265 {\n+1266 // check 2. lane(l, vopres) == arefres[l] foreach l\n+1267 // see the lengthy comment in `checkUnaryOpV()` as to why the\n+1268 // `static_cast` around the `op()` is necessary\n+1269 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n+1270 (_\bl_\ba_\bn_\be(l, vopres)\n+1271 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(vref1)),\n+1272 static_cast(sref2) )));\n+1273 // check 5. sref2 is never modified\n+1274 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(sref2 == sinit2);\n+1275 }\n+1276\n+1277 // check 3. lane(l, vop1) == aref1[l] foreach l\n+1278 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop1)))\n+1279 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop1) == _\bl_\ba_\bn_\be(l, vref1));\n+1280\n+1281#undef DUNE_SIMD_OPNAME\n+1282 }\n+1283\n+1284 template\n+1285 std::enable_if_t >\n+1286 checkBinaryOpVP(MetaType, MetaType, Op op)\n+1287 {\n+1288 // log_ << \"No \"\n+1289 // << className())), T2)>()\n+1290 // << std::endl\n+1291 // << \" ==> Not checking \" << className() << std::endl;\n+1292 }\n+1293\n+1294 template\n+1295 void checkBinaryOpVP(MetaType, MetaType, OpInfixComma)\n+1296 {\n+1297 // Don't really know how to check comma operator for proxies\n+1298 }\n+1299\n+1301 //\n+1302 // checks for (scalar/proxy)-vector binary operations\n+1303 //\n+1304\n+1305 template\n+1306 struct OpInfixSwappedArgs\n+1307 {\n+1308 Op orig;\n+1309\n+1310 template\n+1311 decltype(auto) operator()(V1&& v1, V2&& v2) const\n+1312 {\n+1313 return orig(std::forward(v2), std::forward(v1));\n+1314 }\n+1315 template\n+1316 auto scalar(S1&& s1, S2&& s2) const\n+1317 -> decltype(orig.scalar(std::forward(s2), std::forward(s1)));\n+1318 };\n+1319\n+1320 template\n+1321 void checkBinaryOpSV(MetaType t1, MetaType v2, Op op)\n+1322 {\n+1323 checkBinaryOpVS(v2, t1, OpInfixSwappedArgs{op});\n+1324 }\n+1325\n+1326 template\n+1327 void checkBinaryOpSV(MetaType, MetaType, OpInfixComma)\n+1328 {\n+1329 static_assert(std::is_same,\n+1330 Scalar > >::value,\n+1331 \"Internal testsystem error: called with a scalar that \"\n+1332 \"does not match the vector type.\");\n+1333\n+1334 checkCommaOp(leftScalar>(),\n+1335 rightVector>());\n+1336 }\n 1337\n-1338 while(localIndexglobal()==index.global()) {\n-1340 if(!fromOurSelf || index.local().attribute() !=\n-1341 local[localIndex]->local().attribute())\n-1342 // if index is from us it has to have a different attribute\n-1343 remote.push_back(RemoteIndex(index.local().attribute(),\n-1344 local[localIndex]));\n-1345 localIndex++;\n-1346 }\n-1347\n-1348 // unpack next remote index\n-1349 if((++n_in) < remoteEntries) {\n-1350 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n-1351 type, comm_);\n-1352 if(index.global()==oldGlobal)\n-1353 // Restart comparison for the same global indices\n-1354 localIndex=oldLocalIndex;\n-1355 else\n-1356 oldGlobal=index.global();\n-1357 }else{\n-1358 // No more received indices\n-1359 break;\n-1360 }\n-1361 continue;\n-1362 }\n-1363\n-1364 if (local[localIndex]->global()\n+1339 void checkBinaryOpPV(MetaType v1, MetaType v2, Op op)\n+1340 {\n+1341 checkBinaryOpVP(v2, v1, OpInfixSwappedArgs{op});\n+1342 }\n+1343\n+1344 template\n+1345 void checkBinaryOpPV(MetaType, MetaType, OpInfixComma)\n+1346 {\n+1347 // Don't really know how to check comma operator for proxies\n+1348 }\n+1349\n+1351 //\n+1352 // cross-check scalar-vector binary operations against vector-vector\n+1353 //\n+1354\n+1355 // We check the following candidate operation\n+1356 //\n+1357 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)\n+1358 //\n+1359 // against the reference operation\n+1360 //\n+1361 // vrefres = vref1 @ sref2\n+1362 //\n+1363 // v... variables are simd-vectors, a... variables are arrays, and\n+1364 // s... variables are scalars.\n+1365 //\n+1366 // We could check the following properties\n+1367 // 1. lanes(vopres) == lanes(vop1)\n+1368 // 2. lane(l, vopres) == lane(l, vrefres) foreach l\n+1369 // 3. lane(l, vop1) == lane(l, vref1) foreach l\n+1370 // but these are given by checking the operation against the scalar\n+1371 // operation in the vector@vector and vector@scalar cases above.\n+1372 //\n+1373 // The only thing left to check is:\n+1374 // 4. lane(l, vop2) foreach l is never modified\n+1375\n+1376 template\n+1377 void checkBinaryOpVVAgainstSV(MetaType t1, MetaType v2, Op op)\n+1378 {\n+1379 checkBinaryOpVVAgainstVS(v2, t1, OpInfixSwappedArgs{op});\n+1380 }\n+1381\n+1382 template\n+1383 void checkBinaryOpVVAgainstSV(MetaType, MetaType, OpInfixComma)\n+1384 { }\n 1385\n-1386 template\n-1387 inline void RemoteIndices::unpackIndices(RemoteIndexList& send,\n-1388 RemoteIndexList& receive,\n-1389 int remoteEntries,\n-1390 PairType** localSource,\n-1391 int localSourceEntries,\n-1392 PairType** localDest,\n-1393 int localDestEntries,\n-1394 char* p_in,\n-1395 MPI_Datatype type,\n-1396 int* position,\n-1397 int bufferSize)\n-1398 {\n-1399 int n_in=0, sourceIndex=0, destIndex=0;\n-1400\n-1401 //Check if we know the global index\n-1402 while(n_in= than the\n-one in the unpacked index\n-1410 while(sourceIndexglobal\n-()global\n-()global\n-()==index.global())\n-1418 send.push_back(RemoteIndex(index.local().attribute(),\n-1419 localSource[sourceIndex]));\n+1387 //\n+1388 // Invoke the checks for all combinations\n+1389 //\n+1390\n+1391 template\n+1392 void checkBinaryRefQual(Checker checker)\n+1393 {\n+1394 if constexpr (condition) {\n+1395 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(TypeList{}, [=] (auto t1) {\n+1396 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(TypeList{}, [=] (auto t2) {\n+1397 checker(t1, t2);\n+1398 });\n+1399 });\n+1400 }\n+1401 }\n+1402\n+1403 template\n+1404 void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs(Checker checker)\n+1405 {\n+1406 using Std::bool_constant;\n+1407\n+1408 constexpr bool isMask = std::is_same, bool>::value;\n+1409\n+1410 constexpr bool do_ = false;\n+1411 constexpr bool do_SV = true;\n+1412 constexpr bool do_VV = true;\n+1413 constexpr bool do_VS = true;\n+1414\n+1415#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) \\\n+1416 checker(bool_constant{}, \\\n+1417 bool_constant{}, \\\n+1418 bool_constant{}, \\\n+1419 Op##NAME{})\n 1420\n-1421 if(destIndex < localDestEntries && localDest[destIndex]->global() ==\n-index.global())\n-1422 receive.push_back(RemoteIndex(index.local().attribute(),\n-1423 localDest[sourceIndex]));\n-1424 }\n-1425\n-1426 }\n-1427\n-1428 template\n-_\b1_\b4_\b2_\b9 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-1430 {\n-1431 auto lend = remoteIndices_.end();\n-1432 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {\n-1433 if(lists->second.first==lists->second.second) {\n-1434 // there is only one remote index list.\n-1435 delete lists->second.first;\n-1436 }else{\n-1437 delete lists->second.first;\n-1438 delete lists->second.second;\n-1439 }\n-1440 }\n-1441 remoteIndices_.clear();\n-1442 firstBuild=true;\n-1443 }\n+1421 // (Mask , Vector , Name );\n+1422\n+1423 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixMul );\n+1424 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixDiv );\n+1425 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixRemainder );\n+1426\n+1427 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixPlus );\n+1428 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixMinus );\n+1429\n+1430 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixLeftShift );\n+1431 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixRightShift );\n+1432\n+1433 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixLess );\n+1434 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixGreater );\n+1435 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixLessEqual );\n+1436 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixGreaterEqual );\n+1437\n+1438 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixEqual );\n+1439 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixNotEqual );\n+1440\n+1441 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , SV, VV, VS, InfixBitAnd );\n+1442 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , SV, VV, VS, InfixBitXor );\n+1443 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , SV, VV, VS, InfixBitOr );\n 1444\n-1445 template\n-_\b1_\b4_\b4_\b6 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-1447 {\n-1448 return remoteIndices_.size();\n-1449 }\n-1450\n-1451 template\n-1452 template\n-_\b1_\b4_\b5_\b3 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-1454 {\n-1455 // Test whether a rebuild is Needed.\n-1456 if(firstBuild ||\n-1457 ignorePublic!=publicIgnored || !\n-1458 isSynced()) {\n-1459 free();\n-1460\n-1461 buildRemote(includeSelf);\n-1462\n-1463 sourceSeqNo_ = source_->seqNo();\n-1464 destSeqNo_ = target_->seqNo();\n-1465 firstBuild=false;\n-1466 publicIgnored=ignorePublic;\n-1467 }\n-1468\n+1445 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(SV, VV, VS, SV, VV, VS, InfixLogicAnd );\n+1446 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(SV, VV, VS, SV, VV, VS, InfixLogicOr );\n+1447\n+1448 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssign );\n+1449 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignMul );\n+1450 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignDiv );\n+1451 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignRemainder );\n+1452 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignPlus );\n+1453 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignMinus );\n+1454 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignLeftShift );\n+1455 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignRightShift);\n+1456 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssignAnd );\n+1457 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssignXor );\n+1458 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssignOr );\n+1459\n+1460 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(SV, VV, VS, SV, , VS, InfixComma );\n+1461\n+1462#undef DUNE_SIMD_DO\n+1463 }\n+1464\n+1466 //\n+1467 // SIMD interface functions\n+1468 //\n 1469\n-1470 }\n-1471\n-1472 template\n-_\b1_\b4_\b7_\b3 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-1474 {\n-1475 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();\n-1476 }\n-1477\n-1478 template\n-1479 template\n-_\b1_\b4_\b8_\b0 _\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-1481 {\n-1482\n-1483 // The user are on their own now!\n-1484 // We assume they know what they are doing and just set the\n-1485 // remote indices to synced status.\n-1486 sourceSeqNo_ = source_->seqNo();\n-1487 destSeqNo_ = target_->seqNo();\n-1488\n-1489 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);\n-1490\n-1491 if(found == remoteIndices_.end())\n-1492 {\n-1493 if(source_ != target_)\n-1494 found = remoteIndices_._\bi_\bn_\bs_\be_\br_\bt(found, std::make_pair(process,\n-1495 std::make_pair(new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt(),\n-1496 new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt())));\n-1497 else{\n-1498 _\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-1499 found = remoteIndices_.insert(found,\n-1500 std::make_pair(process,\n-1501 std::make_pair(rlist, rlist)));\n-1502 }\n-1503 }\n-1504\n-1505 firstBuild = false;\n-1506\n-1507 if(send)\n-1508 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-1509 else\n-1510 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-1511 }\n-1512\n-1513 template\n-1514 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_\b5 _\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-1516 {\n-1517 return remoteIndices_.find(proc);\n-1518 }\n-1519\n-1520 template\n-1521 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_\b2 _\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-1523 {\n-1524 return remoteIndices_.begin();\n-1525 }\n-1526\n-1527 template\n-1528 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_\b9 _\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-1530 {\n-1531 return remoteIndices_.end();\n-1532 }\n-1533\n-1534\n-1535 template\n-_\b1_\b5_\b3_\b6 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-1537 {\n-1538 if(neighbours()!=ri._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs())\n-1539 return false;\n-1540\n-1541 const auto rend = remoteIndices_.end();\n-1542\n-1543 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin\n-(); rindex!=rend; ++rindex, ++rindex1) {\n-1544 if(rindex->first != rindex1->first)\n-1545 return false;\n-1546 if(*(rindex->second.first) != *(rindex1->second.first))\n-1547 return false;\n-1548 if(*(rindex->second.second) != *(rindex1->second.second))\n-1549 return false;\n-1550 }\n-1551 return true;\n-1552 }\n-1553\n-1554 template\n-1555 _\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-1556 RemoteIndexList& rList)\n-1557 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_\n-(rList.end()), first_(true)\n-1558 {\n-1559 if(MODIFYINDEXSET) {\n-1560 assert(indexSet_);\n-1561 for(ConstIterator iter=iter_; iter != end_; ++iter)\n-1562 glist_.push_back(iter->localIndexPair().global());\n-1563 giter_ = glist_.beginModify();\n-1564 }\n+1470 template\n+1471 void checkAutoCopy()\n+1472 {\n+1473 using RValueResult = decltype(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(0, std::declval())));\n+1474 static_assert(std::is_same >::value,\n+1475 \"Result of autoCopy() must always be Scalar\");\n+1476\n+1477 using MutableLValueResult =\n+1478 decltype(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(0, std::declval())));\n+1479 static_assert(std::is_same >::value,\n+1480 \"Result of autoCopy() must always be Scalar\");\n+1481\n+1482 using ConstLValueResult =\n+1483 decltype(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(0, std::declval())));\n+1484 static_assert(std::is_same >::value,\n+1485 \"Result of autoCopy() must always be Scalar\");\n+1486\n+1487 V vec = make123();\n+1488 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n+1489 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(l, vec)) == Scalar(l+1));\n+1490 }\n+1491\n+1492 // may only be called for mask types\n+1493 template\n+1494 void checkBoolReductions()\n+1495 {\n+1496 M trueVec(true);\n+1497\n+1498 // mutable lvalue\n+1499 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n+1500 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n+1501 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n+1502 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n+1503\n+1504 // const lvalue\n+1505 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n+1506 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n+1507 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n+1508 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n+1509\n+1510 // rvalue\n+1511 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (M(true)) == true);\n+1512 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (M(true)) == true);\n+1513 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(M(true)) == false);\n+1514 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(M(true)) == false);\n+1515\n+1516 M falseVec(false);\n+1517\n+1518 // mutable lvalue\n+1519 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n+1520 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n+1521 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n+1522 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n+1523\n+1524 // const lvalue\n+1525 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n+1526 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n+1527 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n+1528 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n+1529\n+1530 // rvalue\n+1531 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (M(false)) == false);\n+1532 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (M(false)) == false);\n+1533 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(M(false)) == true);\n+1534 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(M(false)) == true);\n+1535\n+1536 auto mixedVec = broadcast(0);\n+1537 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(mixedVec); ++l)\n+1538 _\bl_\ba_\bn_\be(l, mixedVec) = (l % 2);\n+1539\n+1540 // mutable lvalue\n+1541 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1542 (_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(mixedVec)) == false);\n+1543 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1544 (_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(mixedVec)) == (lanes() > 1));\n+1545 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1546 (_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == (lanes() == 1));\n+1547 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1548 (_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == true);\n+1549\n+1550 // const lvalue\n+1551 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1552 (_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(mixedVec)) == false);\n+1553 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1554 (_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(mixedVec)) == (lanes() > 1));\n+1555 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1556 (_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == (lanes() == 1));\n+1557 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+1558 (_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == true);\n+1559\n+1560 // rvalue\n+1561 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (M(mixedVec)) == false);\n+1562 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (M(mixedVec)) == (lanes() > 1));\n+1563 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(M(mixedVec)) == (lanes() == 1));\n+1564 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(M(mixedVec)) == true);\n 1565 }\n 1566\n-1567 template\n-_\b1_\b5_\b6_\b8 _\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-1569 : rList_(other.rList_), indexSet_(other.indexSet_),\n-1570 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_\n-(other.end_),\n-1571 first_(other.first_), last_(other.last_)\n-1572 {}\n-1573\n-1574 template\n-_\b1_\b5_\b7_\b5 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-1576 {\n-1577 if(MODIFYINDEXSET) {\n-1578 // repair pointers to local index set.\n-1579#ifdef DUNE_ISTL_WITH_CHECKING\n-1580 if(indexSet_->state()!=_\bG_\bR_\bO_\bU_\bN_\bD)\n-1581 _\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-1582#endif\n-1583 auto giter = glist_.begin();\n-1584 auto index = indexSet_->begin();\n-1585\n-1586 for(auto iter=rList_->begin(); iter != end_; ++iter) {\n-1587 while(index->global()<*giter) {\n-1588 ++index;\n-1589#ifdef DUNE_ISTL_WITH_CHECKING\n-1590 if(index == indexSet_->end())\n-1591 _\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-1592#endif\n-1593 }\n+1567 template\n+1568 void checkCond()\n+1569 {\n+1570 using M = Mask;\n+1571\n+1572 static_assert\n+1573 (std::is_same(), std::declval(),\n+1574 std::declval())), V>::value,\n+1575 \"The result of cond(M, V, V) should have exactly the type V\");\n+1576\n+1577 static_assert\n+1578 (std::is_same(),\n+1579 std::declval(),\n+1580 std::declval())), V>::value,\n+1581 \"The result of cond(const M&, const V&, const V&) should have \"\n+1582 \"exactly the type V\");\n+1583\n+1584 static_assert\n+1585 (std::is_same(), std::declval(),\n+1586 std::declval())), V>::value,\n+1587 \"The result of cond(M&, V&, V&) should have exactly the type V\");\n+1588\n+1589 V vec1 = leftVector();\n+1590 V vec2 = rightVector();\n+1591\n+1592 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(M(true), vec1, vec2) == vec1));\n+1593 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(M(false), vec1, vec2) == vec2));\n 1594\n-1595#ifdef DUNE_ISTL_WITH_CHECKING\n-1596 if(index->global() != *giter)\n-1597 _\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-1598#endif\n-1599 iter->localIndex_ = &(*index);\n-1600 }\n+1595 auto mixedResult = broadcast(0);\n+1596 auto mixedMask = broadcast(false);\n+1597 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(mixedMask); ++l)\n+1598 {\n+1599 _\bl_\ba_\bn_\be(l, mixedMask ) = (l % 2);\n+1600 _\bl_\ba_\bn_\be(l, mixedResult) = _\bl_\ba_\bn_\be(l, (l % 2) ? vec1 : vec2);\n 1601 }\n-1602 }\n-1603\n-1604 template\n-_\b1_\b6_\b0_\b5 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-1606 {\n-1607 static_assert(!mode,\"Not allowed if the mode indicates that new indices\"\n-1608 \"might be added to the underlying index set. Use \"\n-1609 \"insert(const RemoteIndex&, const GlobalIndex&) instead\");\n-1610\n-1611#ifdef DUNE_ISTL_WITH_CHECKING\n-1612 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-1617 ++iter_;\n-1618 }\n-1619\n-1620 // No duplicate entries allowed\n-1621 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-1622 iter_.insert(index);\n-1623 last_ = index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl();\n-1624 first_ = false;\n-1625 }\n+1602\n+1603 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(mixedMask, vec1, vec2) == mixedResult));\n+1604 }\n+1605\n+1606 template\n+1607 void checkBoolCond()\n+1608 {\n+1609 static_assert\n+1610 (std::is_same(), std::declval(),\n+1611 std::declval())), V>::value,\n+1612 \"The result of cond(bool, V, V) should have exactly the type V\");\n+1613\n+1614 static_assert\n+1615 (std::is_same(),\n+1616 std::declval(),\n+1617 std::declval())), V>::value,\n+1618 \"The result of cond(const bool&, const V&, const V&) should have \"\n+1619 \"exactly the type V\");\n+1620\n+1621 static_assert\n+1622 (std::is_same(),\n+1623 std::declval(),\n+1624 std::declval())), V>::value,\n+1625 \"The result of cond(bool&, V&, V&) should have exactly the type V\");\n 1626\n-1627 template\n-_\b1_\b6_\b2_\b8 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-1629 {\n-1630 static_assert(mode,\"Not allowed if the mode indicates that no new indices\"\n-1631 \"might be added to the underlying index set. Use \"\n-1632 \"insert(const RemoteIndex&) instead\");\n-1633#ifdef DUNE_ISTL_WITH_CHECKING\n-1634 if(!first_ && globallocalIndexPair().global() != global);\n-1645 iter_.insert(index);\n-1646 giter_.insert(global);\n-1647\n-1648 last_ = global;\n-1649 first_ = false;\n-1650 }\n-1651\n-1652 template\n-_\b1_\b6_\b5_\b3 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-1654 {\n-1655#ifdef DUNE_ISTL_WITH_CHECKING\n-1656 if(!first_ && global();\n+1628 V vec2 = rightVector();\n+1629\n+1630 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(true, vec1, vec2) == vec1));\n+1631 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(false, vec1, vec2) == vec2));\n+1632 }\n+1633\n+1634 template\n+1635 std::enable_if_t >::value>\n+1636 checkHorizontalMinMax() {}\n+1637\n+1638 template\n+1639 std::enable_if_t >::value>\n+1640 checkHorizontalMinMax()\n+1641 {\n+1642 static_assert\n+1643 (std::is_same())), Scalar >::value,\n+1644 \"The result of max(V) should be exactly Scalar\");\n+1645\n+1646 static_assert\n+1647 (std::is_same())), Scalar >::value,\n+1648 \"The result of min(V) should be exactly Scalar\");\n+1649\n+1650 static_assert\n+1651 (std::is_same())), Scalar >::value,\n+1652 \"The result of max(V) should be exactly Scalar\");\n+1653\n+1654 static_assert\n+1655 (std::is_same())), Scalar >::value,\n+1656 \"The result of min(V) should be exactly Scalar\");\n+1657\n+1658 const V vec1 = leftVector();\n 1659\n-1660 bool found= false;\n-1661\n-1662 if(MODIFYINDEXSET) {\n-1663 // Move to the correct position\n-1664 while(iter_!=end_ && *giter_< global) {\n-1665 ++giter_;\n-1666 ++iter_;\n-1667 }\n-1668 if(*giter_ == global) {\n-1669 giter_.remove();\n-1670 iter_.remove();\n-1671 found=true;\n-1672 }\n-1673 }else{\n-1674 while(iter_!=end_ && iter_->localIndexPair().global() < global)\n-1675 ++iter_;\n-1676\n-1677 if(iter_->localIndexPair().global()==global) {\n-1678 iter_.remove();\n-1679 found = true;\n-1680 }\n-1681 }\n-1682\n-1683 last_ = global;\n-1684 first_ = false;\n-1685 return found;\n-1686 }\n-1687\n-1688 template\n-1689 template\n-_\b1_\b6_\b9_\b0 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-1691 {\n-1692 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-1693 }\n-1694\n-1695 template\n-_\b1_\b6_\b9_\b6 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-1697 {\n-1698 return comm_;\n-1699\n-1700 }\n-1701\n-1702 template\n-_\b1_\b7_\b0_\b3 _\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-1704 {\n-1705\n-1706 const auto end = pmap.end();\n-1707 for(auto process = pmap.begin(); process != end; ++process) {\n-1708 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-1709 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-1710 map_.insert(std::make_pair(process->first,\n-1711 std::pair(list->_\bb_\be_\bg_\bi_\bn(), list->_\be_\bn_\bd())));\n-1712 }\n-1713 }\n-1714\n-1715 template\n-_\b1_\b7_\b1_\b6 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-1717 {\n-1718 const auto end = map_.end();\n+1660 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bm_\ba_\bx(vec1) == Scalar(_\bl_\ba_\bn_\be_\bs(vec1)));\n+1661 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bm_\bi_\bn(vec1) == Scalar(1));\n+1662 }\n+1663\n+1664 template\n+1665 std::enable_if_t >::value>\n+1666 checkBinaryMinMax() {}\n+1667\n+1668 template\n+1669 std::enable_if_t >::value>\n+1670 checkBinaryMinMax()\n+1671 {\n+1672 using std::max;\n+1673 using std::min;\n+1674\n+1675 static_assert\n+1676 (std::is_same(),\n+1677 std::declval())), V>::value,\n+1678 \"The result of Simd::max(V, V) should be exactly V\");\n+1679 static_assert\n+1680 (std::is_same(),\n+1681 std::declval())), V>::value,\n+1682 \"The result of Simd::min(V, V) should be exactly V\");\n+1683\n+1684 static_assert\n+1685 (std::is_same(),\n+1686 std::declval())), V>::value,\n+1687 \"The result of Simd::max(V&, V&) should be exactly V\");\n+1688 static_assert\n+1689 (std::is_same(),\n+1690 std::declval())), V>::value,\n+1691 \"The result of Simd::min(V&, V&) should be exactly V\");\n+1692\n+1693 const V arg1 = leftVector();\n+1694 const V arg2 = rightVector();\n+1695\n+1696 V maxExp(Scalar(0)), minExp(Scalar(0));\n+1697 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs()))\n+1698 {\n+1699 _\bl_\ba_\bn_\be(l, maxExp) = _\bm_\ba_\bx(_\bl_\ba_\bn_\be(l, arg1), _\bl_\ba_\bn_\be(l, arg2));\n+1700 _\bl_\ba_\bn_\be(l, minExp) = _\bm_\bi_\bn(_\bl_\ba_\bn_\be(l, arg1), _\bl_\ba_\bn_\be(l, arg2));\n+1701 }\n+1702\n+1703 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(maxExp == _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bx(arg1, arg2)));\n+1704 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(minExp == _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\bi_\bn(arg1, arg2)));\n+1705 }\n+1706\n+1707 template\n+1708 void checkIO()\n+1709 {\n+1710 const V vec1 = leftVector();\n+1711\n+1712 std::string reference;\n+1713 {\n+1714 const char *sep = \"\";\n+1715 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vec1)))\n+1716 {\n+1717 std::ostringstream stream;\n+1718 stream << _\bl_\ba_\bn_\be(l, vec1);\n 1719\n-1720 for(auto iter = map_.begin(); iter != end;) {\n-1721 // Step the iterator until we are >= index\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 current = iter->second.first;\n-1723 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-1724 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n-1725 if(current != rend)\n-1726 remoteIndex = *current;\n-1727\n-1728 while(iter->second.first!=iter->second.second && iter->second.first-\n->localIndexPair().global()second.first);\n-1730\n-1731 // erase from the map if there are no more entries.\n-1732 if(iter->second.first == iter->second.second)\n-1733 map_.erase(iter++);\n-1734 else{\n-1735 ++iter;\n-1736 }\n-1737 }\n-1738 index_=index;\n-1739 noattribute=true;\n+1720 reference += sep;\n+1721 reference += stream.str();\n+1722 sep = \", \";\n+1723 }\n+1724 }\n+1725\n+1726 {\n+1727 std::ostringstream stream;\n+1728 stream << _\bi_\bo(vec1);\n+1729 if(_\bl_\ba_\bn_\be_\bs(vec1) == 1)\n+1730 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(stream.str() == reference);\n+1731 else\n+1732 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(stream.str() == \"<\" + reference + \">\");\n+1733 }\n+1734\n+1735 {\n+1736 std::ostringstream stream;\n+1737 stream << _\bv_\bi_\bo(vec1);\n+1738 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(stream.str() == \"<\" + reference + \">\");\n+1739 }\n 1740 }\n 1741\n-1742 template\n-_\b1_\b7_\b4_\b3 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-1744 const Attribute& attribute)\n-1745 {\n-1746 const auto end = map_.end();\n-1747\n-1748 for(auto iter = map_.begin(); iter != end;) {\n-1749 // Step the iterator until we are >= index\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 current = iter->second.first;\n-1751 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-1752 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n-1753 if(current != rend)\n-1754 remoteIndex = *current;\n-1755\n-1756 // Move to global index or bigger\n-1757 while(iter->second.first!=iter->second.second && iter->second.first-\n->localIndexPair().global()second.first);\n-1759\n-1760 // move to attribute or bigger\n-1761 while(iter->second.first!=iter->second.second\n-1762 && iter->second.first->localIndexPair().global()==index\n-1763 && iter->second.first->localIndexPair().local().attribute()second.first);\n-1765\n-1766 // erase from the map if there are no more entries.\n-1767 if(iter->second.first == iter->second.second)\n-1768 map_.erase(iter++);\n-1769 else{\n-1770 ++iter;\n-1771 }\n-1772 }\n-1773 index_=index;\n-1774 attribute_=attribute;\n-1775 noattribute=false;\n-1776 }\n-1777\n-1778 template\n-_\b1_\b7_\b7_\b9 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-1780 {\n-1781 const auto end = map_._\be_\bn_\bd();\n-1782\n-1783 for(auto iter = map_.begin(); iter != end;) {\n-1784 // Step the iterator until we are >= index\n-1785 auto current = iter->second.first;\n-1786 auto rend = iter->second.second;\n-1787\n-1788 // move all iterators pointing to the current global index to next value\n-1789 if(iter->second.first->localIndexPair().global()==index_ &&\n-1790 (noattribute || iter->second.first->localIndexPair().local().attribute()\n-== attribute_))\n-1791 ++(iter->second.first);\n-1792\n-1793 // erase from the map if there are no more entries.\n-1794 if(iter->second.first == iter->second.second)\n-1795 map_.erase(iter++);\n-1796 else{\n-1797 ++iter;\n-1798 }\n-1799 }\n-1800 return *this;\n-1801 }\n-1802\n-1803 template\n-_\b1_\b8_\b0_\b4 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-1805 {\n-1806 return map_.empty();\n-1807 }\n-1808\n-1809 template\n-1810 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_\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:_\bb_\be_\bg_\bi_\bn()\n-1812 {\n-1813 if(noattribute)\n-1814 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_);\n-1815 else\n-1816 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_,\n-1817 attribute_);\n-1818 }\n+1742#undef DUNE_SIMD_CHECK\n+1743\n+1744 public:\n+1807 template void _\bc_\bh_\be_\bc_\bk_\bT_\by_\bp_\be();\n+1808 template void _\bc_\bh_\be_\bc_\bk_\bN_\bo_\bn_\bO_\bp_\bs();\n+1809 template void _\bc_\bh_\be_\bc_\bk_\bU_\bn_\ba_\br_\by_\bO_\bp_\bs();\n+1810 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs();\n+1811 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bV_\be_\bc_\bt_\bo_\br();\n+1812 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br();\n+1813 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bS_\bc_\ba_\bl_\ba_\br();\n+1814 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bP_\br_\bo_\bx_\by_\bV_\be_\bc_\bt_\bo_\br();\n+1815 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bP_\br_\bo_\bx_\by();\n 1819\n-1820 template\n-1821 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_\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:_\be_\bn_\bd()\n-1823 {\n-1824 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.end(), map_.end(), index_);\n-1825 }\n-1826\n-1827 template\n-_\b1_\b8_\b2_\b8 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-1829 {\n-1830 os<<\"[global=\"<\n-_\b1_\b8_\b3_\b5 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-1836 {\n-1837 int rank;\n-1838 MPI_Comm_rank(indices.comm_, &rank);\n-1839 const auto rend = indices.remoteIndices_.end();\n-1840\n-1841 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex)\n-{\n-1842 os<first<<\":\";\n-1843\n-1844 if(!rindex->second.first->empty()) {\n-1845 os<<\" send:\";\n+1836 template class RebindPrune = _\bI_\bs_\bL_\bo_\bo_\bp,\n+1838 template class RebindAccept = _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bT_\br_\bu_\be>\n+_\b1_\b8_\b3_\b9 void _\bc_\bh_\be_\bc_\bk() {\n+1840 // check whether the test for this type already started\n+1841 if(seen_.emplace(typeid (V)).second == false)\n+1842 {\n+1843 // type already seen, nothing to do\n+1844 return;\n+1845 }\n 1846\n-1847 const auto send= rindex->second.first->end();\n-1848\n-1849 for(auto index = rindex->second.first->begin();\n-1850 index != send; ++index)\n-1851 os<<*index<<\" \";\n-1852 os<second.second->empty()) {\n-1855 os<first<<\": \"<<\"receive: \";\n-1856\n-1857 for(const auto& index : *(rindex->second.second))\n-1858 os << index << \" \";\n-1859 }\n-1860 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:_\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:_\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:_\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:_\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:_\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:95\n+1847 // do these first so everything that appears after \"Checking SIMD type\n+1848 // ...\" really pertains to that type\n+1849 auto recurse = [this](auto w) {\n+1850 using W = typename decltype(w)::type;\n+1851 this->template check();\n+1852 };\n+1853 checkRebindOf(recurse);\n+1854\n+1855 checkType();\n+1856 }\n+1857\n+_\b1_\b8_\b5_\b9 bool _\bg_\bo_\bo_\bd() const\n+1860 {\n+1861 return good_;\n+1862 }\n+1863\n+1864 }; // class UnitTest\n+1865\n+_\b1_\b8_\b6_\b6 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bT_\by_\bp_\be()\n+1867 {\n+1868 static_assert(std::is_same >::value, \"Simd types \"\n+1869 \"must not be references, and must not include \"\n+1870 \"cv-qualifiers\");\n+1871\n+1872 log_ << \"Checking SIMD type \" << className() << std::endl;\n+1873\n+1874 checkNonOps();\n+1875 checkUnaryOps();\n+1876 checkBinaryOps();\n+1877 }\n+_\b1_\b8_\b7_\b8 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bN_\bo_\bn_\bO_\bp_\bs()\n+1879 {\n+1880 constexpr auto isMask = typename std::is_same, bool>::type{};\n+1881\n+1882 checkLanes();\n+1883 checkScalar();\n+1884\n+1885 checkDefaultConstruct();\n+1886 checkLane();\n+1887 checkCopyMoveConstruct();\n+1888 checkImplCast();\n+1889 checkBroadcast();\n+1890 if constexpr (isMask)\n+1891 this->template checkBroadcastMaskConstruct();\n+1892 else\n+1893 this->template checkBroadcastVectorConstruct();\n+1894 checkBracedAssign();\n+1895 checkBracedBroadcastAssign();\n+1896\n+1897 checkAutoCopy();\n+1898 checkCond();\n+1899 checkBoolCond();\n+1900\n+1901 if constexpr (isMask)\n+1902 this->template checkBoolReductions();\n+1903 // checkBoolReductions() is not applicable for non-masks\n+1904\n+1905 checkHorizontalMinMax();\n+1906 checkBinaryMinMax();\n+1907 checkIO();\n+1908 }\n+_\b1_\b9_\b0_\b9 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bU_\bn_\ba_\br_\by_\bO_\bp_\bs()\n+1910 {\n+1911 if constexpr (std::is_same_v, bool>) {\n+1912 // check mask\n+1913 auto _\bc_\bh_\be_\bc_\bk = [this](auto op) {\n+1914 this->template checkUnaryOpsV(op);\n+1915 };\n+1916\n+1917 // postfix\n+1918 // check(OpPostfixDecrement{});\n+1919 // clang deprecation warning if bool++ is tested\n+1920 // check(OpPostfixIncrement{});\n+1921\n+1922 // prefix\n+1923 // check(OpPrefixDecrement{});\n+1924 // clang deprecation warning if ++bool is tested\n+1925 // check(OpPrefixIncrement{});\n+1926\n+1927 // check(OpPrefixPlus{});\n+1928 // check(OpPrefixMinus{});\n+1929 _\bc_\bh_\be_\bc_\bk(OpPrefixLogicNot{});\n+1930 // check(OpPrefixBitNot{});\n+1931 }\n+1932 else {\n+1933 // check vector\n+1934 auto _\bc_\bh_\be_\bc_\bk = [this](auto op) {\n+1935 this->template checkUnaryOpsV(op);\n+1936 };\n+1937\n+1938 // postfix\n+1939 // check(OpPostfixDecrement{});\n+1940 // check(OpPostfixIncrement{});\n+1941\n+1942 // prefix\n+1943 // check(OpPrefixDecrement{});\n+1944 // check(OpPrefixIncrement{});\n+1945\n+1946 // check(OpPrefixPlus{});\n+1947 _\bc_\bh_\be_\bc_\bk(OpPrefixMinus{});\n+1948 _\bc_\bh_\be_\bc_\bk(OpPrefixLogicNot{});\n+1949 _\bc_\bh_\be_\bc_\bk(OpPrefixBitNot{});\n+1950 }\n+1951 }\n+_\b1_\b9_\b5_\b2 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs()\n+1953 {\n+1954 checkBinaryOpsVectorVector();\n+1955 checkBinaryOpsScalarVector();\n+1956 checkBinaryOpsVectorScalar();\n+1957 checkBinaryOpsProxyVector();\n+1958 checkBinaryOpsVectorProxy();\n+1959 }\n+_\b1_\b9_\b6_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bV_\be_\bc_\bt_\bo_\br()\n+1961 {\n+1962 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n+1963 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n+1964 this->checkBinaryOpVV(t1, t2, op);\n+1965 };\n+1966 this->checkBinaryRefQual(_\bc_\bh_\be_\bc_\bk);\n+1967 };\n+1968 checkBinaryOps(checker);\n+1969 }\n+_\b1_\b9_\b7_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br()\n+1971 {\n+1972 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n+1973 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n+1974 this->checkBinaryOpSV(t1, t2, op);\n+1975 };\n+1976 this->checkBinaryRefQual, V, doSV>(_\bc_\bh_\be_\bc_\bk);\n+1977\n+1978 auto crossCheck = [this,op](auto t1, auto t2) {\n+1979 this->checkBinaryOpVVAgainstSV(t1, t2, op);\n+1980 };\n+1981 this->checkBinaryRefQual, V, doSV && doVV>(crossCheck);\n+1982 };\n+1983 checkBinaryOps(checker);\n+1984 }\n+_\b1_\b9_\b8_\b5 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bS_\bc_\ba_\bl_\ba_\br()\n+1986 {\n+1987 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n+1988 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n+1989 this->checkBinaryOpVS(t1, t2, op);\n+1990 };\n+1991 this->checkBinaryRefQual, doVS>(_\bc_\bh_\be_\bc_\bk);\n+1992\n+1993 auto crossCheck = [this,op](auto t1, auto t2) {\n+1994 this->checkBinaryOpVVAgainstVS(t1, t2, op);\n+1995 };\n+1996 this->checkBinaryRefQual, doVV && doVS>(crossCheck);\n+1997 };\n+1998 checkBinaryOps(checker);\n+1999 }\n+_\b2_\b0_\b0_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bP_\br_\bo_\bx_\by_\bV_\be_\bc_\bt_\bo_\br()\n+2001 {\n+2002 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n+2003 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n+2004 this->checkBinaryOpPV(t1, t2, op);\n+2005 };\n+2006 this->checkBinaryRefQual(_\bc_\bh_\be_\bc_\bk);\n+2007 };\n+2008 checkBinaryOps(checker);\n+2009 }\n+_\b2_\b0_\b1_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bP_\br_\bo_\bx_\by()\n+2011 {\n+2012 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n+2013 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n+2014 this->checkBinaryOpVP(t1, t2, op);\n+2015 };\n+2016 this->checkBinaryRefQual(_\bc_\bh_\be_\bc_\bk);\n+2017 };\n+2018 checkBinaryOps(checker);\n+2019 }\n+2020\n+2021 } // namespace Simd\n+2022} // namespace Dune\n+2023\n+2024#endif // DUNE_COMMON_SIMD_TEST_HH\n+_\bh_\by_\bb_\br_\bi_\bd_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n+_\bl_\bo_\bo_\bp_\b._\bh_\bh\n+_\bi_\bo_\b._\bh_\bh\n+IO interface of the SIMD abstraction.\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP\n+#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:670\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP\n+#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:784\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n+#define DUNE_SIMD_CHECK_OP(expr)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:191\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n+#define DUNE_SIMD_CHECK(expr)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:186\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP\n+#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:818\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n+#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:805\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP\n+#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:681\n+_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO\n+#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)\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+_\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+_\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+_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh\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:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt\n+std::tuple< MetaType< T >... > TypeList\n+A simple type list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:87\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:268\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:642\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_\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:_\bm_\ba_\bs_\bk_\bO_\br\n+auto maskOr(const V1 &v1, const V2 &v2)\n+Logic or of masks.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:499\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:_\bi_\bo\n+auto io(const V &v)\n+construct a stream inserter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:106\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:_\bv_\bi_\bo\n+auto vio(const V &v)\n+construct a stream inserter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bx\n+auto max(const V &v1, const V &v2)\n+The binary maximum value over two simd objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:409\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n+bool anyFalse(const Mask &mask)\n+Whether any entry is false\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:449\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:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n+bool allFalse(const Mask &mask)\n+Whether all entries are false\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:459\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\bA_\bn_\bd\n+auto maskAnd(const V1 &v1, const V2 &v2)\n+Logic and of masks.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:509\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br\n+typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n+Element type of some SIMD type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bm_\bi_\bn\n+auto min(const V &v1, const V &v2)\n+The binary minimum value over two simd objects.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:419\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:_\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:41\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:35\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:49\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:189\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:307\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:231\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:977\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:_\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:984\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:1429\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:215\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:1453\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:206\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:1696\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:226\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 colletively iterating over the remote indices of all remote\n-processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1690\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:971\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:1529\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:1536\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:245\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:300\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:1480\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:999\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:1014\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:241\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:1446\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:210\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:1007\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:237\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:1515\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:1473\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:1522\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:221\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:247\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:73\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:946\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:_\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:934\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:90\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:99\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:105\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:952\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:930\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:940\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:551\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:1575\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:602\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:598\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:1605\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:578\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:583\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:612\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:607\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:1653\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:573\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:676\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:588\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:593\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:568\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:708\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:1779\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:1822\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:1703\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:1804\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:1716\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:748\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:1811\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:167\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:558\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:792\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:799\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:817\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:838\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:795\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:822\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:850\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:856\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:844\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:807\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:862\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:794\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bL_\bi_\bs_\bt\n+typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type RebindList\n+A list of types with the final element removed.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bI_\bs_\bL_\bo_\bo_\bp\n+typename Impl::IsLoop< T >::type IsLoop\n+check whether a type is an instance of LoopSIMD\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bE_\bn_\bd_\bM_\ba_\br_\bk\n+final element marker for RebindList\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bU_\bn_\ba_\br_\by_\bO_\bp_\bs\n+void checkUnaryOps()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1909\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs\n+void checkBinaryOps()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1952\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br\n+void checkBinaryOpsScalarVector()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1970\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bT_\by_\bp_\be\n+void checkType()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1866\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk\n+void check()\n+run unit tests for simd vector type V\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1839\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bS_\bc_\ba_\bl_\ba_\br\n+void checkBinaryOpsVectorScalar()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1985\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bg_\bo_\bo_\bd\n+bool good() const\n+whether all tests succeeded\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1859\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bV_\be_\bc_\bt_\bo_\br\n+void checkBinaryOpsVectorVector()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1960\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bN_\bo_\bn_\bO_\bp_\bs\n+void checkNonOps()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1878\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bP_\br_\bo_\bx_\by\n+void checkBinaryOpsVectorProxy()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:2010\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bP_\br_\bo_\bx_\by_\bV_\be_\bc_\bt_\bo_\br\n+void checkBinaryOpsProxyVector()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:2000\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+_\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/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: mpidata.hh File Reference\n+dune-common: bigunsignedint.hh File Reference\n \n \n \n \n \n \n \n@@ -65,61 +65,102 @@\n
    \n
    \n \n \n \n \n \n
    \n \n-
    mpidata.hh File Reference
    \n+
    bigunsignedint.hh File Reference
    \n
    \n
    \n \n-

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

    Portable very large unsigned integers. \n More...

    \n-
    #include <vector>
    \n-#include <string>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/std/type_traits.hh>
    \n-#include <dune/common/parallel/mpitraits.hh>
    \n+
    #include <algorithm>
    \n+#include <iostream>
    \n+#include <limits>
    \n+#include <cstdint>
    \n+#include <cstdlib>
    \n+#include <type_traits>
    \n+#include <dune/common/exceptions.hh>
    \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 Classes

    struct  Dune::MPIData< T, Enable >
    class  Dune::bigunsignedint< k >
     Portable very large unsigned integers. More...
     
    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 > > >
    struct  Dune::IsNumber< bigunsignedint< k > >
     Declare big unsigned int is a number. More...
     
    \n \n \n \n \n+\n+\n+\n+

    \n Namespaces

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

    \n+Macros

    #define DUNE_BINOP(OP)
     
    \n \n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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 >
    auto Dune::getMPIData (T &t)
     
    template<int k>
    std::ostream & Dune::operator<< (std::ostream &s, const bigunsignedint< k > &x)
     
    template<int k>
    bigunsignedint< k > Dune::operator+ (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator- (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator* (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator/ (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator% (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator+ (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator- (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator* (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator/ (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator% (std::uintmax_t x, const bigunsignedint< k > &y)
     
    \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+

    Portable very large unsigned integers.

    \n+
    Author
    Peter Bastian
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,44 +1,86 @@\n dune-common\u00a02.9.0\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 <_\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 | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+bigunsignedint.hh File Reference\n+Portable very large unsigned integers. _\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/_\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/_\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-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+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\b _\bk_\b _\b>\n+\u00a0 Portable very large unsigned integers. _\bM_\bo_\br_\be_\b._\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\b _\bk_\b _\b>_\b _\b>\n+\u00a0 Declare big unsigned int is a number. _\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 _\bs_\bt_\bd\n+\u00a0 STL namespace.\n+\u00a0\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(OP)\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+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 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n+ > &x)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+ (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n+ uintmax_t y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b- (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n+ uintmax_t y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b* (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n+ uintmax_t y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/ (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n+ uintmax_t y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b% (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n+ uintmax_t y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+ (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n+ > &y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b- (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n+ > &y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b* (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n+ > &y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/ (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n+ > &y)\n+\u00a0\n+template\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b% (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n+ > &y)\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+Portable very large unsigned integers.\n+ Author\n+ Peter Bastian\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: mpidata.hh Source File\n+dune-common: bigunsignedint.hh Source File\n \n \n \n \n \n \n \n@@ -70,196 +70,803 @@\n
    \n
    \n \n \n \n \n \n
    \n-
    mpidata.hh
    \n+
    bigunsignedint.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 (C) 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+
    6#ifndef DUNE_BIGUNSIGNEDINT_HH
    \n+
    7#define DUNE_BIGUNSIGNEDINT_HH
    \n
    8
    \n-
    9#include <vector>
    \n-
    10#include <string>
    \n-
    11
    \n-
    12#if HAVE_MPI
    \n-
    13
    \n-\n-\n-\n+
    9#include <algorithm>
    \n+
    10#include <iostream>
    \n+
    11#include <limits>
    \n+
    12#include <cstdint>
    \n+
    13#include <cstdlib>
    \n+
    14#include <type_traits>
    \n+\n+
    16#include <dune/common/hash.hh>
    \n
    17
    \n-
    37namespace Dune{
    \n-
    38
    \n-
    39 template<class, class = void>
    \n-
    40 struct MPIData;
    \n-
    41
    \n-
    42 template<class T>
    \n-
    \n-
    43 auto getMPIData(T& t){
    \n-
    44 return MPIData<T>(t);
    \n-
    45 }
    \n-
    \n-
    46
    \n-
    47 // Default implementation for static datatypes
    \n-
    48 template<class T, class Enable>
    \n-
    \n-
    49 struct MPIData
    \n-
    50 {
    \n-
    51 friend auto getMPIData<T>(T&);
    \n-
    52 protected:
    \n-\n-
    54
    \n-
    \n-
    55 MPIData(T& t)
    \n-
    56 : data_(t)
    \n-
    57 {}
    \n-
    \n+
    24namespace Dune
    \n+
    25{
    \n+
    26#if HAVE_MPI
    \n+
    27 template<class K>
    \n+
    28 struct MPITraits;
    \n+
    29#endif
    \n+
    30
    \n+
    36 namespace Impl {
    \n+
    37
    \n+
    38 // numeric_limits_helper provides std::numeric_limits access to the internals
    \n+
    39 // of bigunsignedint. Previously, the correct specialization of std::numeric_limits
    \n+
    40 // was a friend of bigunsignedint, but that creates problems on recent versions
    \n+
    41 // of clang with the alternative libc++ library, because that library declares the
    \n+
    42 // base template of std::numeric_limits as a class and clang subsequently complains
    \n+
    43 // if the friend declaration uses 'struct'. Unfortunately, libstdc++ uses a struct,
    \n+
    44 // making it impossible to keep clang happy for both standard libraries.
    \n+
    45 // So we move the access helper functionality into a custom struct and simply let
    \n+
    46 // the numeric_limits specialization inherit from the helper.
    \n+
    47
    \n+
    48 template<typename T>
    \n+
    49 struct numeric_limits_helper
    \n+
    50 {
    \n+
    51
    \n+
    52 protected:
    \n+
    53
    \n+
    54 static std::uint16_t& digit(T& big_unsigned_int, std::size_t i)
    \n+
    55 {
    \n+
    56 return big_unsigned_int.digit[i];
    \n+
    57 }
    \n
    58
    \n-
    59 public:
    \n-
    \n-
    60 void* ptr() const {
    \n-
    61 return (void*)&data_;
    \n-
    62 }
    \n-
    \n-
    63
    \n-
    64 // indicates whether the datatype can be resized
    \n-
    65 static constexpr bool static_size = true;
    \n-
    66
    \n-
    \n-
    67 int size() const{
    \n-
    68 return 1;
    \n-
    69 }
    \n-
    \n-
    70
    \n-
    \n-
    71 MPI_Datatype type() const {
    \n-
    72 return MPITraits<std::decay_t<T>>::getType();
    \n-
    73 }
    \n-
    \n-
    74 };
    \n-
    \n+
    59 };
    \n+
    60
    \n+
    61 }
    \n+
    62
    \n+
    72 template<int k>
    \n+
    \n+\n+
    74 public:
    \n
    75
    \n-
    76 // dummy implementation for void
    \n-
    77 template<>
    \n-
    \n-
    78 struct MPIData<void>{
    \n-
    79 protected:
    \n-\n-
    81
    \n-
    82 public:
    \n-
    \n-
    83 void* ptr(){
    \n-
    84 return nullptr;
    \n-
    85 }
    \n-
    \n-
    \n-
    86 int size(){
    \n-
    87 return 0;
    \n-
    88 }
    \n-
    \n-
    89 void get(){}
    \n-
    \n-
    90 MPI_Datatype type() const{
    \n-
    91 return MPI_INT;
    \n-
    92 }
    \n-
    \n-
    93 };
    \n-
    \n-
    94
    \n-
    95 // specializations:
    \n-
    96 // std::vector of static sized elements or std::string
    \n-
    97 template<class T>
    \n-
    \n-
    98 struct MPIData<T, std::void_t<std::tuple<decltype(std::declval<T>().data()),
    \n-
    99 decltype(std::declval<T>().size()),
    \n-
    100 typename std::decay_t<T>::value_type>>>{
    \n-
    101 private:
    \n-
    102 template<class U>
    \n-
    103 using hasResizeOp = decltype(std::declval<U>().resize(0));
    \n+
    76 // unsigned short is 16 bits wide, n is the number of digits needed
    \n+
    77 constexpr static int bits = std::numeric_limits<std::uint16_t>::digits;
    \n+
    78 constexpr static int n = k/bits+(k%bits!=0);
    \n+
    79 constexpr static int hexdigits = 4;
    \n+
    80 constexpr static int bitmask = 0xFFFF;
    \n+
    81 constexpr static int compbitmask = 0xFFFF0000;
    \n+
    82 constexpr static int overflowmask = 0x1;
    \n+
    83
    \n+\n+
    86
    \n+
    88 template<typename Signed>
    \n+
    89 bigunsignedint (Signed x, typename std::enable_if<std::is_integral<Signed>::value && std::is_signed<Signed>::value>::type* = 0);
    \n+
    90
    \n+
    92 bigunsignedint (std::uintmax_t x);
    \n+
    93
    \n+
    95 void print (std::ostream& s) const ;
    \n+
    96
    \n+\n+\n+
    100
    \n+\n+\n
    104
    \n-
    105 protected:
    \n-
    106 friend auto getMPIData<T>(T&);
    \n-
    \n-\n-
    108 : data_(t)
    \n-
    109 {}
    \n-
    \n-
    110 public:
    \n-
    111 static constexpr bool static_size = std::is_const<T>::value || !Std::is_detected_v<hasResizeOp, T>;
    \n-
    \n-
    112 void* ptr() {
    \n-
    113 return (void*) data_.data();
    \n-
    114 }
    \n-
    \n-
    \n-
    115 int size() {
    \n-
    116 return data_.size();
    \n-
    117 }
    \n-
    \n-
    \n-
    118 MPI_Datatype type() const{
    \n-\n-
    120 }
    \n-
    \n-
    121
    \n-
    122 template<class S = T>
    \n-
    \n-
    123 auto /*void*/ resize(int size)
    \n-
    124 -> std::enable_if_t<!std::is_const<S>::value || !Std::is_detected_v<hasResizeOp, S>>
    \n-
    125 {
    \n-
    126 data_.resize(size);
    \n-
    127 }
    \n-
    \n-
    128
    \n-
    129 protected:
    \n-\n-
    131 };
    \n-
    \n-
    132
    \n-
    133}
    \n-
    134
    \n-
    139#endif
    \n-
    140#endif
    \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+\n+\n+
    108
    \n+\n+
    111
    \n+\n+\n+
    117
    \n+\n+\n+
    123
    \n+\n+\n+
    127
    \n+\n+\n+
    131
    \n+\n+\n+
    135
    \n+\n+
    138
    \n+
    139
    \n+
    141 bigunsignedint<k> operator<< (int i) const;
    \n+
    142
    \n+
    144 bigunsignedint<k> operator>> (int i) const;
    \n+
    145
    \n+
    146
    \n+
    148 bool operator< (const bigunsignedint<k>& x) const;
    \n+
    149
    \n+
    151 bool operator<= (const bigunsignedint<k>& x) const;
    \n+
    152
    \n+
    154 bool operator> (const bigunsignedint<k>& x) const;
    \n+
    155
    \n+
    157 bool operator>= (const bigunsignedint<k>& x) const;
    \n+
    158
    \n+
    160 bool operator== (const bigunsignedint<k>& x) const;
    \n+
    161
    \n+
    163 bool operator!= (const bigunsignedint<k>& x) const;
    \n+
    164
    \n+
    165
    \n+
    167 // operator unsigned int () const;
    \n+
    168 std::uint_least32_t touint() const;
    \n+
    174 double todouble() const;
    \n+
    175
    \n+
    176 friend class bigunsignedint<k/2>;
    \n+
    177 friend struct Impl::numeric_limits_helper< bigunsignedint<k> >;
    \n+
    178
    \n+
    \n+
    179 inline friend std::size_t hash_value(const bigunsignedint& arg)
    \n+
    180 {
    \n+
    181 return hash_range(arg.digit,arg.digit + arg.n);
    \n+
    182 }
    \n+
    \n+
    183
    \n+
    184 private:
    \n+
    185 std::uint16_t digit[n];
    \n+
    186#if HAVE_MPI
    \n+
    187 friend struct MPITraits<bigunsignedint<k> >;
    \n+
    188#endif
    \n+
    189 inline void assign(std::uintmax_t x);
    \n+
    190
    \n+
    191
    \n+
    192 } ;
    \n+
    \n+
    193
    \n+
    194 // Constructors
    \n+
    195 template<int k>
    \n+
    \n+\n+
    197 {
    \n+
    198 assign(0u);
    \n+
    199 }
    \n+
    \n+
    200
    \n+
    201 template<int k>
    \n+
    202 template<typename Signed>
    \n+
    \n+
    203 bigunsignedint<k>::bigunsignedint (Signed y, typename std::enable_if<std::is_integral<Signed>::value && std::is_signed<Signed>::value>::type*)
    \n+
    204 {
    \n+
    205 if (y < 0)
    \n+
    206 DUNE_THROW(Dune::Exception, "Trying to construct a Dune::bigunsignedint from a negative integer: " << y);
    \n+
    207 assign(y);
    \n+
    208 }
    \n+
    \n+
    209
    \n+
    210 template<int k>
    \n+
    \n+\n+
    212 {
    \n+
    213 assign(x);
    \n+
    214 }
    \n+
    \n+
    215 template<int k>
    \n+
    216 void bigunsignedint<k>::assign(std::uintmax_t x)
    \n+
    217 {
    \n+
    218 static const int no=std::min(static_cast<int>(n),
    \n+
    219 static_cast<int>(std::numeric_limits<std::uintmax_t>::digits/bits));
    \n+
    220
    \n+
    221 for(int i=0; i<no; ++i) {
    \n+
    222 digit[i] = (x&bitmask);
    \n+
    223 x=x>>bits;
    \n+
    224 }
    \n+
    225 for (unsigned int i=no; i<n; i++) digit[i]=0;
    \n+
    226 }
    \n+
    227
    \n+
    228 // export
    \n+
    229 template<int k>
    \n+
    \n+
    230 inline std::uint_least32_t bigunsignedint<k>::touint () const
    \n+
    231 {
    \n+
    232 return (digit[1]<<bits)+digit[0];
    \n+
    233 }
    \n+
    \n+
    234
    \n+
    235 template<int k>
    \n+
    \n+
    236 inline double bigunsignedint<k>::todouble() const
    \n+
    237 {
    \n+
    238 int firstInZeroRange=n;
    \n+
    239 for(int i=n-1; i>=0; --i)
    \n+
    240 if(digit[i]!=0)
    \n+
    241 break;
    \n+
    242 else
    \n+
    243 --firstInZeroRange;
    \n+
    244 int representableDigits=std::numeric_limits<double>::digits/bits;
    \n+
    245 int lastInRepresentableRange=0;
    \n+
    246 if(representableDigits<firstInZeroRange)
    \n+
    247 lastInRepresentableRange=firstInZeroRange-representableDigits;
    \n+
    248 double val=0;
    \n+
    249 for(int i=firstInZeroRange-1; i>=lastInRepresentableRange; --i)
    \n+
    250 val =val*(1<<bits)+digit[i];
    \n+
    251 return val*(1<<(bits*lastInRepresentableRange));
    \n+
    252 }
    \n+
    \n+
    253 // print
    \n+
    254 template<int k>
    \n+
    \n+
    255 inline void bigunsignedint<k>::print (std::ostream& s) const
    \n+
    256 {
    \n+
    257 bool leading=false;
    \n+
    258
    \n+
    259 // print from left to right
    \n+
    260 for (int i=n-1; i>=0; i--)
    \n+
    261 for (int d=hexdigits-1; d>=0; d--)
    \n+
    262 {
    \n+
    263 // extract one hex digit
    \n+
    264 int current = (digit[i]>>(d*4))&0xF;
    \n+
    265 if (current!=0)
    \n+
    266 {
    \n+
    267 // s.setf(std::ios::noshowbase);
    \n+
    268 s << std::hex << current;
    \n+
    269 leading = false;
    \n+
    270 }
    \n+
    271 else if (!leading) s << std::hex << current;
    \n+
    272 }
    \n+
    273 if (leading) s << "0";
    \n+
    274 s << std::dec;
    \n+
    275 }
    \n+
    \n+
    276
    \n+
    277 template <int k>
    \n+
    \n+
    278 inline std::ostream& operator<< (std::ostream& s, const bigunsignedint<k>& x)
    \n+
    279 {
    \n+
    280 x.print(s);
    \n+
    281 return s;
    \n+
    282 }
    \n+
    \n+
    283
    \n+
    \n+
    284 #define DUNE_BINOP(OP) \\
    \n+
    285 template <int k> \\
    \n+
    286 inline bigunsignedint<k> bigunsignedint<k>::operator OP (const bigunsignedint<k> &x) const \\
    \n+
    287 { \\
    \n+
    288 auto temp = *this; \\
    \n+
    289 temp OP##= x; \\
    \n+
    290 return temp; \\
    \n+
    291 }
    \n+
    \n+
    292
    \n+
    293 DUNE_BINOP(+)
    \n+
    294 DUNE_BINOP(-)
    \n+
    295 DUNE_BINOP(*)
    \n+
    296 DUNE_BINOP(/)
    \n+
    297 DUNE_BINOP(%)
    \n+
    298 DUNE_BINOP(&)
    \n+
    299 DUNE_BINOP(^)
    \n+
    300 DUNE_BINOP(|)
    \n+
    301
    \n+
    302 #undef DUNE_BINOP
    \n+
    303
    \n+
    304 template <int k>
    \n+
    \n+\n+
    306 {
    \n+
    307 std::uint_fast32_t overflow=0;
    \n+
    308
    \n+
    309 for (unsigned int i=0; i<n; i++)
    \n+
    310 {
    \n+
    311 std::uint_fast32_t sum = static_cast<std::uint_fast32_t>(digit[i]) + static_cast<std::uint_fast32_t>(x.digit[i]) + overflow;
    \n+
    312 digit[i] = sum&bitmask;
    \n+
    313 overflow = (sum>>bits)&overflowmask;
    \n+
    314 }
    \n+
    315 return *this;
    \n+
    316 }
    \n+
    \n+
    317
    \n+
    318 template <int k>
    \n+
    \n+\n+
    320 {
    \n+
    321 std::int_fast32_t overflow=0;
    \n+
    322
    \n+
    323 for (unsigned int i=0; i<n; i++)
    \n+
    324 {
    \n+
    325 std::int_fast32_t diff = static_cast<std::int_fast32_t>(digit[i]) - static_cast<std::int_fast32_t>(x.digit[i]) - overflow;
    \n+
    326 if (diff>=0)
    \n+
    327 {
    \n+
    328 digit[i] = static_cast<std::uint16_t>(diff);
    \n+
    329 overflow = 0;
    \n+
    330 }
    \n+
    331 else
    \n+
    332 {
    \n+
    333 digit[i] = static_cast<std::uint16_t>(diff+bitmask+1);
    \n+
    334 overflow = 1;
    \n+
    335 }
    \n+
    336 }
    \n+
    337 return *this;
    \n+
    338 }
    \n+
    \n+
    339
    \n+
    340 template <int k>
    \n+
    \n+\n+
    342 {
    \n+
    343 bigunsignedint<2*k> finalproduct(0);
    \n+
    344
    \n+
    345 for (unsigned int m=0; m<n; m++) // digit in right factor
    \n+
    346 {
    \n+
    347 bigunsignedint<2*k> singleproduct(0);
    \n+
    348 std::uint_fast32_t overflow(0);
    \n+
    349 for (unsigned int i=0; i<n; i++)
    \n+
    350 {
    \n+
    351 std::uint_fast32_t digitproduct = static_cast<std::uint_fast32_t>(digit[i])*static_cast<std::uint_fast32_t>(x.digit[m])+overflow;
    \n+
    352 singleproduct.digit[i+m] = static_cast<std::uint16_t>(digitproduct&bitmask);
    \n+
    353 overflow = (digitproduct>>bits)&bitmask;
    \n+
    354 }
    \n+
    355 finalproduct = finalproduct+singleproduct;
    \n+
    356 }
    \n+
    357
    \n+
    358 for (unsigned int i=0; i<n; i++) digit[i] = finalproduct.digit[i];
    \n+
    359 return *this;
    \n+
    360 }
    \n+
    \n+
    361
    \n+
    362 template <int k>
    \n+
    \n+\n+
    364 {
    \n+
    365 std::uint_fast32_t overflow=1;
    \n+
    366
    \n+
    367 for (unsigned int i=0; i<n; i++)
    \n+
    368 {
    \n+
    369 std::uint_fast32_t sum = static_cast<std::uint_fast32_t>(digit[i]) + overflow;
    \n+
    370 digit[i] = sum&bitmask;
    \n+
    371 overflow = (sum>>bits)&overflowmask;
    \n+
    372 }
    \n+
    373 return *this;
    \n+
    374 }
    \n+
    \n+
    375
    \n+
    376 template <int k>
    \n+
    \n+\n+
    378 {
    \n+
    379 if(x==0)
    \n+
    380 DUNE_THROW(Dune::MathError, "division by zero!");
    \n+
    381
    \n+
    382 // better slow than nothing
    \n+
    383 bigunsignedint<k> result(0);
    \n+
    384
    \n+
    385 while (*this>=x)
    \n+
    386 {
    \n+
    387 ++result;
    \n+
    388 *this -= x;
    \n+
    389 }
    \n+
    390
    \n+
    391 *this = result;
    \n+
    392 return *this;
    \n+
    393 }
    \n+
    \n+
    394
    \n+
    395 template <int k>
    \n+
    \n+\n+
    397 {
    \n+
    398 // better slow than nothing
    \n+
    399 while (*this>=x)
    \n+
    400 {
    \n+
    401 *this -= x;
    \n+
    402 }
    \n+
    403
    \n+
    404 return *this;
    \n+
    405 }
    \n+
    \n+
    406
    \n+
    407 template <int k>
    \n+
    \n+\n+
    409 {
    \n+
    410 for (unsigned int i=0; i<n; i++)
    \n+
    411 digit[i] = digit[i]&x.digit[i];
    \n+
    412 return *this;
    \n+
    413 }
    \n+
    \n+
    414
    \n+
    415 template <int k>
    \n+
    \n+\n+
    417 {
    \n+
    418 for (unsigned int i=0; i<n; i++)
    \n+
    419 digit[i] = digit[i]^x.digit[i];
    \n+
    420 return *this;
    \n+
    421 }
    \n+
    \n+
    422
    \n+
    423 template <int k>
    \n+
    \n+\n+
    425 {
    \n+
    426 for (unsigned int i=0; i<n; i++)
    \n+
    427 digit[i] = digit[i]|x.digit[i];
    \n+
    428 return *this;
    \n+
    429 }
    \n+
    \n+
    430
    \n+
    431 template <int k>
    \n+
    \n+\n+
    433 {
    \n+
    434 bigunsignedint<k> result;
    \n+
    435 for (unsigned int i=0; i<n; i++)
    \n+
    436 result.digit[i] = ~digit[i];
    \n+
    437 return result;
    \n+
    438 }
    \n+
    439
    \n+
    440 template <int k>
    \n+\n+
    442 {
    \n+
    443 bigunsignedint<k> result(0);
    \n+
    444
    \n+
    445 // multiples of bits
    \n+
    446 int j=shift/bits;
    \n+
    447 for (int i=n-1-j; i>=0; i--)
    \n+
    448 result.digit[i+j] = digit[i];
    \n+
    449
    \n+
    450 // remainder
    \n+
    451 j=shift%bits;
    \n+
    452 for (int i=n-1; i>=0; i--)
    \n+
    453 {
    \n+
    454 unsigned int temp = result.digit[i];
    \n+
    455 temp = temp<<j;
    \n+
    456 result.digit[i] = static_cast<std::uint16_t>(temp&bitmask);
    \n+
    457 temp = temp>>bits;
    \n+
    458 if (i+1<(int)n)
    \n+
    459 result.digit[i+1] = result.digit[i+1]|temp;
    \n+
    460 }
    \n+
    461
    \n+
    462 return result;
    \n+
    463 }
    \n+
    \n+
    464
    \n+
    465 template <int k>
    \n+
    \n+\n+
    467 {
    \n+
    468 bigunsignedint<k> result(0);
    \n+
    469
    \n+
    470 // multiples of bits
    \n+
    471 int j=shift/bits;
    \n+
    472 for (unsigned int i=0; i<n-j; i++)
    \n+
    473 result.digit[i] = digit[i+j];
    \n+
    474
    \n+
    475 // remainder
    \n+
    476 j=shift%bits;
    \n+
    477 for (unsigned int i=0; i<n; i++)
    \n+
    478 {
    \n+
    479 std::uint_fast32_t temp = result.digit[i];
    \n+
    480 temp = temp<<(bits-j);
    \n+
    481 result.digit[i] = static_cast<std::uint16_t>((temp&compbitmask)>>bits);
    \n+
    482 if (i>0)
    \n+
    483 result.digit[i-1] = result.digit[i-1] | (temp&bitmask);
    \n+
    484 }
    \n+
    485
    \n+
    486 return result;
    \n+
    487 }
    \n+
    \n+
    488
    \n+
    489 template <int k>
    \n+
    \n+\n+
    491 {
    \n+
    492 for (unsigned int i=0; i<n; i++)
    \n+
    493 if (digit[i]!=x.digit[i]) return true;
    \n+
    494 return false;
    \n+
    495 }
    \n+
    \n+
    496
    \n+
    497 template <int k>
    \n+
    \n+\n+
    499 {
    \n+
    500 return !((*this)!=x);
    \n+
    501 }
    \n+
    \n+
    502
    \n+
    503 template <int k>
    \n+
    \n+\n+
    505 {
    \n+
    506 for (int i=n-1; i>=0; i--)
    \n+
    507 if (digit[i]<x.digit[i]) return true;
    \n+
    508 else if (digit[i]>x.digit[i]) return false;
    \n+
    509 return false;
    \n+
    510 }
    \n+
    \n+
    511
    \n+
    512 template <int k>
    \n+
    \n+\n+
    514 {
    \n+
    515 for (int i=n-1; i>=0; i--)
    \n+
    516 if (digit[i]<x.digit[i]) return true;
    \n+
    517 else if (digit[i]>x.digit[i]) return false;
    \n+
    518 return true;
    \n+
    519 }
    \n+
    \n+
    520
    \n+
    521 template <int k>
    \n+
    \n+\n+
    523 {
    \n+
    524 return !((*this)<=x);
    \n+
    525 }
    \n+
    \n+
    526
    \n+
    527 template <int k>
    \n+
    \n+\n+
    529 {
    \n+
    530 return !((*this)<x);
    \n+
    531 }
    \n+
    \n+
    532
    \n+
    533
    \n+
    534 template <int k>
    \n+
    \n+
    535 inline bigunsignedint<k> operator+ (const bigunsignedint<k>& x, std::uintmax_t y)
    \n+
    536 {
    \n+
    537 bigunsignedint<k> temp(y);
    \n+
    538 return x+temp;
    \n+
    539 }
    \n+
    \n+
    540
    \n+
    541 template <int k>
    \n+
    \n+
    542 inline bigunsignedint<k> operator- (const bigunsignedint<k>& x, std::uintmax_t y)
    \n+
    543 {
    \n+
    544 bigunsignedint<k> temp(y);
    \n+
    545 return x-temp;
    \n+
    546 }
    \n+
    \n+
    547
    \n+
    548 template <int k>
    \n+
    \n+
    549 inline bigunsignedint<k> operator* (const bigunsignedint<k>& x, std::uintmax_t y)
    \n+
    550 {
    \n+
    551 bigunsignedint<k> temp(y);
    \n+
    552 return x*temp;
    \n+
    553 }
    \n+
    \n+
    554
    \n+
    555 template <int k>
    \n+
    \n+
    556 inline bigunsignedint<k> operator/ (const bigunsignedint<k>& x, std::uintmax_t y)
    \n+
    557 {
    \n+
    558 bigunsignedint<k> temp(y);
    \n+
    559 return x/temp;
    \n+
    560 }
    \n+
    \n+
    561
    \n+
    562 template <int k>
    \n+
    \n+
    563 inline bigunsignedint<k> operator% (const bigunsignedint<k>& x, std::uintmax_t y)
    \n+
    564 {
    \n+
    565 bigunsignedint<k> temp(y);
    \n+
    566 return x%temp;
    \n+
    567 }
    \n+
    \n+
    568
    \n+
    569 template <int k>
    \n+
    \n+
    570 inline bigunsignedint<k> operator+ (std::uintmax_t x, const bigunsignedint<k>& y)
    \n+
    571 {
    \n+
    572 bigunsignedint<k> temp(x);
    \n+
    573 return temp+y;
    \n+
    574 }
    \n+
    \n+
    575
    \n+
    576 template <int k>
    \n+
    \n+
    577 inline bigunsignedint<k> operator- (std::uintmax_t x, const bigunsignedint<k>& y)
    \n+
    578 {
    \n+
    579 bigunsignedint<k> temp(x);
    \n+
    580 return temp-y;
    \n+
    581 }
    \n+
    \n+
    582
    \n+
    583 template <int k>
    \n+
    \n+
    584 inline bigunsignedint<k> operator* (std::uintmax_t x, const bigunsignedint<k>& y)
    \n+
    585 {
    \n+
    586 bigunsignedint<k> temp(x);
    \n+
    587 return temp*y;
    \n+
    588 }
    \n+
    \n+
    589
    \n+
    590 template <int k>
    \n+
    \n+
    591 inline bigunsignedint<k> operator/ (std::uintmax_t x, const bigunsignedint<k>& y)
    \n+
    592 {
    \n+
    593 bigunsignedint<k> temp(x);
    \n+
    594 return temp/y;
    \n+
    595 }
    \n+
    \n+
    596
    \n+
    597 template <int k>
    \n+
    \n+
    598 inline bigunsignedint<k> operator% (std::uintmax_t x, const bigunsignedint<k>& y)
    \n+
    599 {
    \n+
    600 bigunsignedint<k> temp(x);
    \n+
    601 return temp%y;
    \n+
    602 }
    \n+
    \n+
    603
    \n+
    604 // Forward declare type-trait for numbers
    \n+
    605 template<class T> struct IsNumber;
    \n+
    606
    \n+
    608 template <int k>
    \n+
    609 struct IsNumber<bigunsignedint<k>> : public std::true_type {};
    \n+
    610
    \n+
    612}
    \n+
    613
    \n+
    614namespace std
    \n+
    615{
    \n+
    616 template<int k>
    \n+
    617 struct numeric_limits<Dune::bigunsignedint<k> >
    \n+
    618 : private Dune::Impl::numeric_limits_helper<Dune::bigunsignedint<k> > // for access to internal state of bigunsignedint
    \n+
    619 {
    \n+
    620 public:
    \n+
    621 static const bool is_specialized = true;
    \n+
    622
    \n+
    623 static Dune::bigunsignedint<k> min()
    \n+
    624 {
    \n+
    625 return static_cast<Dune::bigunsignedint<k> >(0);
    \n+
    626 }
    \n+
    627
    \n+\n+
    629 {
    \n+\n+
    631 for(std::size_t i=0; i < Dune::bigunsignedint<k>::n; ++i)
    \n+
    632 // access internal state via the helper base class
    \n+
    633 Dune::Impl::numeric_limits_helper<Dune::bigunsignedint<k> >::
    \n+
    634 digit(max_,i)=std::numeric_limits<std::uint16_t>::max();
    \n+
    635 return max_;
    \n+
    636 }
    \n+
    637
    \n+
    638
    \n+
    639 static const int digits = Dune::bigunsignedint<k>::bits *
    \n+\n+
    641 static const bool is_signed = false;
    \n+
    642 static const bool is_integer = true;
    \n+
    643 static const bool is_exact = true;
    \n+
    644 static const int radix = 2;
    \n+
    645
    \n+
    646 static Dune::bigunsignedint<k> epsilon()
    \n+
    647 {
    \n+
    648 return static_cast<Dune::bigunsignedint<k> >(0);
    \n+
    649 }
    \n+
    650
    \n+
    651 static Dune::bigunsignedint<k> round_error()
    \n+
    652 {
    \n+
    653 return static_cast<Dune::bigunsignedint<k> >(0);
    \n+
    654 }
    \n+
    655
    \n+
    656 static const int min_exponent = 0;
    \n+
    657 static const int min_exponent10 = 0;
    \n+
    658 static const int max_exponent = 0;
    \n+
    659 static const int max_exponent10 = 0;
    \n+
    660
    \n+
    661 static const bool has_infinity = false;
    \n+
    662 static const bool has_quiet_NaN = false;
    \n+
    663 static const bool has_signaling_NaN = false;
    \n+
    664
    \n+
    665 static const float_denorm_style has_denorm = denorm_absent;
    \n+
    666 static const bool has_denorm_loss = false;
    \n+
    667
    \n+
    668 static Dune::bigunsignedint<k> infinity() noexcept
    \n+
    669 {
    \n+
    670 return static_cast<Dune::bigunsignedint<k> >(0);
    \n+
    671 }
    \n+
    672
    \n+
    673 static Dune::bigunsignedint<k> quiet_NaN() noexcept
    \n+
    674 {
    \n+
    675 return static_cast<Dune::bigunsignedint<k> >(0);
    \n+
    676 }
    \n+
    677
    \n+
    678 static Dune::bigunsignedint<k> signaling_NaN() noexcept
    \n+
    679 {
    \n+
    680 return static_cast<Dune::bigunsignedint<k> >(0);
    \n+
    681 }
    \n+
    682
    \n+
    683 static Dune::bigunsignedint<k> denorm_min() noexcept
    \n+
    684 {
    \n+
    685 return static_cast<Dune::bigunsignedint<k> >(0);
    \n+
    686 }
    \n+
    687
    \n+
    688 static const bool is_iec559 = false;
    \n+
    689 static const bool is_bounded = true;
    \n+
    690 static const bool is_modulo = true;
    \n+
    691
    \n+
    692 static const bool traps = false;
    \n+
    693 static const bool tinyness_before = false;
    \n+
    694 static const float_round_style round_style = round_toward_zero;
    \n+
    695
    \n+
    696 };
    \n+
    697
    \n+
    698}
    \n+
    699
    \n+\n+
    701
    \n+
    702#endif
    \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+
    A few common exception classes.
    \n+
    bigunsignedint< k > & operator/=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:377
    \n+
    bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:549
    \n+
    bigunsignedint< k > operator<<(int i) const
    left shift
    Definition bigunsignedint.hh:441
    \n+
    bigunsignedint< k > & operator+=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:305
    \n+
    bigunsignedint< k > & operator^=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:416
    \n+
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    bool operator<=(const bigunsignedint< k > &x) const
    less than or equal
    Definition bigunsignedint.hh:513
    \n+
    void print(std::ostream &s) const
    Print number in hex notation.
    Definition bigunsignedint.hh:255
    \n+
    bool operator<(const bigunsignedint< k > &x) const
    less than
    Definition bigunsignedint.hh:504
    \n+
    bigunsignedint< k > operator/(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:556
    \n+
    bool operator==(const bigunsignedint< k > &x) const
    equal
    Definition bigunsignedint.hh:498
    \n+
    bool operator!=(const bigunsignedint< k > &x) const
    not equal
    Definition bigunsignedint.hh:490
    \n+
    bigunsignedint()
    Construct uninitialized.
    Definition bigunsignedint.hh:196
    \n+
    bigunsignedint< k > & operator&=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:408
    \n+
    bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:542
    \n+
    bool operator>=(const bigunsignedint< k > &x) const
    greater or equal
    Definition bigunsignedint.hh:528
    \n+
    bigunsignedint< k > operator>>(int i) const
    right shift
    Definition bigunsignedint.hh:466
    \n+
    bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:535
    \n+
    bigunsignedint< k > operator~() const
    bitwise complement
    Definition bigunsignedint.hh:432
    \n+
    bigunsignedint< k > & operator++()
    prefix increment
    Definition bigunsignedint.hh:363
    \n+
    bigunsignedint< k > & operator|=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:424
    \n+
    bigunsignedint< k > operator%(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:563
    \n+
    bigunsignedint< k > & operator%=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:396
    \n+
    double todouble() const
    Convert to a double.
    Definition bigunsignedint.hh:236
    \n+
    bigunsignedint< k > & operator-=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:319
    \n+
    bool operator>(const bigunsignedint< k > &x) const
    greater than
    Definition bigunsignedint.hh:522
    \n+
    bigunsignedint< k > & operator*=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:341
    \n+
    std::uint_least32_t touint() const
    export to other types
    Definition bigunsignedint.hh:230
    \n+
    #define DUNE_BINOP(OP)
    Definition bigunsignedint.hh:284
    \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:43
    \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 assign(T &dst, const T &src, bool mask)
    masked Simd assignment (scalar version)
    Definition simd.hh:447
    \n+
    auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:425
    \n
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n-
    Definition mpidata.hh:50
    \n-
    T & data_
    Definition mpidata.hh:53
    \n-
    MPI_Datatype type() const
    Definition mpidata.hh:71
    \n-
    void * ptr() const
    Definition mpidata.hh:60
    \n-
    int size() const
    Definition mpidata.hh:67
    \n-
    static constexpr bool static_size
    Definition mpidata.hh:65
    \n-
    MPIData(T &t)
    Definition mpidata.hh:55
    \n-
    void get()
    Definition mpidata.hh:89
    \n-
    MPIData()
    Definition mpidata.hh:80
    \n-
    int size()
    Definition mpidata.hh:86
    \n-
    void * ptr()
    Definition mpidata.hh:83
    \n-
    MPI_Datatype type() const
    Definition mpidata.hh:90
    \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:123
    \n-\n+
    Portable very large unsigned integers.
    Definition bigunsignedint.hh:73
    \n+
    static constexpr int overflowmask
    Definition bigunsignedint.hh:82
    \n+
    bigunsignedint< k > operator|(const bigunsignedint< k > &x) const
    bitwise or
    \n+
    static constexpr int hexdigits
    Definition bigunsignedint.hh:79
    \n+
    bigunsignedint< k > operator^(const bigunsignedint< k > &x) const
    bitwise exor
    \n+
    bigunsignedint< k > operator*(const bigunsignedint< k > &x) const
    multiply
    \n+
    bigunsignedint< k > operator%(const bigunsignedint< k > &x) const
    \n+
    static constexpr int n
    Definition bigunsignedint.hh:78
    \n+
    bigunsignedint< k > operator-(const bigunsignedint< k > &x) const
    subtract
    \n+
    static constexpr int compbitmask
    Definition bigunsignedint.hh:81
    \n+
    bigunsignedint< k > operator&(const bigunsignedint< k > &x) const
    bitwise and
    \n+
    static constexpr int bits
    Definition bigunsignedint.hh:77
    \n+
    bigunsignedint< k > operator/(const bigunsignedint< k > &x) const
    \n+
    bigunsignedint< k > operator+(const bigunsignedint< k > &x) const
    add
    \n+
    friend std::size_t hash_value(const bigunsignedint &arg)
    Definition bigunsignedint.hh:179
    \n+
    static constexpr int bitmask
    Definition bigunsignedint.hh:80
    \n+
    Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
    Definition typetraits.hh:194
    \n+
    Base class for Dune-Exceptions.
    Definition exceptions.hh:96
    \n+
    Default exception class for mathematical errors.
    Definition exceptions.hh:241
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,217 +1,897 @@\n dune-common\u00a02.9.0\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+bigunsignedint.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 (C) 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+6#ifndef DUNE_BIGUNSIGNEDINT_HH\n+7#define DUNE_BIGUNSIGNEDINT_HH\n 8\n-9#include \n-10#include \n-11\n-12#if HAVE_MPI\n-13\n-14#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-15#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-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+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \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/_\bh_\ba_\bs_\bh_\b._\bh_\bh>\n 17\n-37namespace _\bD_\bu_\bn_\be{\n-38\n-39 template\n-40 struct MPIData;\n-41\n-42 template\n-_\b4_\b3 auto _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t){\n-44 return _\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\bT_\b>(t);\n-45 }\n-46\n-47 // Default implementation for static datatypes\n-48 template\n-_\b4_\b9 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+24namespace _\bD_\bu_\bn_\be\n+25{\n+26#if HAVE_MPI\n+27 template\n+28 struct MPITraits;\n+29#endif\n+30\n+36 namespace Impl {\n+37\n+38 // numeric_limits_helper provides std::numeric_limits access to the\n+internals\n+39 // of bigunsignedint. Previously, the correct specialization of std::\n+numeric_limits\n+40 // was a friend of bigunsignedint, but that creates problems on recent\n+versions\n+41 // of clang with the alternative libc++ library, because that library\n+declares the\n+42 // base template of std::numeric_limits as a class and clang subsequently\n+complains\n+43 // if the friend declaration uses 'struct'. Unfortunately, libstdc++ uses a\n+struct,\n+44 // making it impossible to keep clang happy for both standard libraries.\n+45 // So we move the access helper functionality into a custom struct and\n+simply let\n+46 // the numeric_limits specialization inherit from the helper.\n+47\n+48 template\n+49 struct numeric_limits_helper\n 50 {\n-51 friend auto getMPIData(T&);\n+51\n 52 protected:\n-_\b5_\b3 T& _\bd_\ba_\bt_\ba_\b_;\n-54\n-_\b5_\b5 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n-56 : _\bd_\ba_\bt_\ba_\b_(t)\n-57 {}\n+53\n+54 static std::uint16_t& digit(T& big_unsigned_int, std::size_t i)\n+55 {\n+56 return big_unsigned_int.digit[i];\n+57 }\n 58\n-59 public:\n-_\b6_\b0 void* _\bp_\bt_\br() const {\n-61 return (void*)&_\bd_\ba_\bt_\ba_\b_;\n-62 }\n-63\n-64 // indicates whether the datatype can be resized\n-_\b6_\b5 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = true;\n-66\n-_\b6_\b7 int _\bs_\bi_\bz_\be() const{\n-68 return 1;\n-69 }\n-70\n-_\b7_\b1 MPI_Datatype _\bt_\by_\bp_\be() const {\n-72 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-73 }\n-74 };\n+59 };\n+60\n+61 }\n+62\n+72 template\n+_\b7_\b3 class _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt {\n+74 public:\n 75\n-76 // dummy implementation for void\n-77 template<>\n-_\b7_\b8 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba{\n-79 protected:\n-_\b8_\b0 _\bM_\bP_\bI_\bD_\ba_\bt_\ba() {}\n-81\n-82 public:\n-_\b8_\b3 void* _\bp_\bt_\br(){\n-84 return nullptr;\n-85 }\n-_\b8_\b6 int _\bs_\bi_\bz_\be(){\n-87 return 0;\n-88 }\n-_\b8_\b9 void _\bg_\be_\bt(){}\n-_\b9_\b0 MPI_Datatype _\bt_\by_\bp_\be() const{\n-91 return MPI_INT;\n-92 }\n-93 };\n-94\n-95 // specializations:\n-96 // std::vector of static sized elements or std::string\n-97 template\n-_\b9_\b8 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba().data()),\n-99 decltype(std::declval().size()),\n-100 typename std::decay_t::value_type>>>{\n-101 private:\n-102 template\n-103 using hasResizeOp = decltype(std::declval().resize(0));\n+76 // unsigned short is 16 bits wide, n is the number of digits needed\n+_\b7_\b7 constexpr static int _\bb_\bi_\bt_\bs = std::numeric_limits::digits;\n+_\b7_\b8 constexpr static int _\bn = k/_\bb_\bi_\bt_\bs+(k%_\bb_\bi_\bt_\bs!=0);\n+_\b7_\b9 constexpr static int _\bh_\be_\bx_\bd_\bi_\bg_\bi_\bt_\bs = 4;\n+_\b8_\b0 constexpr static int _\bb_\bi_\bt_\bm_\ba_\bs_\bk = 0xFFFF;\n+_\b8_\b1 constexpr static int _\bc_\bo_\bm_\bp_\bb_\bi_\bt_\bm_\ba_\bs_\bk = 0xFFFF0000;\n+_\b8_\b2 constexpr static int _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\bm_\ba_\bs_\bk = 0x1;\n+83\n+85 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt ();\n+86\n+88 template\n+89 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (Signed x, typename std::enable_if::\n+value && std::is_signed::value>::type* = 0);\n+90\n+92 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (std::uintmax_t x);\n+93\n+95 void _\bp_\br_\bi_\bn_\bt (std::ostream& s) const ;\n+96\n+_\b9_\b8 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+99 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n+100\n+_\b1_\b0_\b2 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+103 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n 104\n-105 protected:\n-106 friend auto getMPIData(T&);\n-_\b1_\b0_\b7 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n-108 : _\bd_\ba_\bt_\ba_\b_(t)\n-109 {}\n-110 public:\n-_\b1_\b1_\b1 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_\b2 void* _\bp_\bt_\br() {\n-113 return (void*) _\bd_\ba_\bt_\ba_\b_.data();\n-114 }\n-_\b1_\b1_\b5 int _\bs_\bi_\bz_\be() {\n-116 return _\bd_\ba_\bt_\ba_\b_.size();\n-117 }\n-_\b1_\b1_\b8 MPI_Datatype _\bt_\by_\bp_\be() const{\n-119 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-120 }\n-121\n-122 template\n-_\b1_\b2_\b3 auto /*void*/ _\br_\be_\bs_\bi_\bz_\be(int _\bs_\bi_\bz_\be)\n-124 -> std::enable_if_t::value || !Std::\n-is_detected_v>\n-125 {\n-126 _\bd_\ba_\bt_\ba_\b_.resize(_\bs_\bi_\bz_\be);\n-127 }\n-128\n-129 protected:\n-_\b1_\b3_\b0 T& _\bd_\ba_\bt_\ba_\b_;\n-131 };\n-132\n-133}\n-134\n-139#endif\n-140#endif\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+_\b1_\b0_\b6 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+107 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n+108\n+110 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+_\b ();\n+111\n+_\b1_\b1_\b5 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+116 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n+117\n+_\b1_\b2_\b1 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+122 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n+123\n+_\b1_\b2_\b5 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+126 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n+127\n+_\b1_\b2_\b9 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+130 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n+131\n+_\b1_\b3_\b3 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+134 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n+135\n+137 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~_\b () const;\n+138\n+139\n+141 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (int i) const;\n+142\n+144 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>_\b (int i) const;\n+145\n+146\n+148 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+149\n+151 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+152\n+154 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+155\n+157 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+158\n+160 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+161\n+163 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n+164\n+165\n+167 // operator unsigned int () const;\n+168 std::uint_least32_t _\bt_\bo_\bu_\bi_\bn_\bt() const;\n+_\b1_\b7_\b4 double _\bt_\bo_\bd_\bo_\bu_\bb_\bl_\be() const;\n+175\n+176 friend class _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt;\n+177 friend struct Impl::numeric_limits_helper< _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt >;\n+178\n+_\b1_\b7_\b9 inline friend std::size_t _\bh_\ba_\bs_\bh_\b__\bv_\ba_\bl_\bu_\be(const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt& arg)\n+180 {\n+181 return _\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be(arg.digit,arg.digit + arg._\bn);\n+182 }\n+183\n+184 private:\n+_\b1_\b8_\b5 std::uint16_t digit[_\bn];\n+186#if HAVE_MPI\n+187 friend struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt >;\n+188#endif\n+189 inline void assign(std::uintmax_t x);\n+190\n+191\n+192 } ;\n+193\n+194 // Constructors\n+195 template\n+_\b1_\b9_\b6 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt ()\n+197 {\n+198 _\ba_\bs_\bs_\bi_\bg_\bn(0u);\n+199 }\n+200\n+201 template\n+202 template\n+_\b2_\b0_\b3 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (Signed y, typename std::enable_if::value && std::is_signed::value>::type*)\n+204 {\n+205 if (y < 0)\n+206 _\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, \"Trying to construct a Dune::bigunsignedint\n+from a negative integer: \" << y);\n+207 _\ba_\bs_\bs_\bi_\bg_\bn(y);\n+208 }\n+209\n+210 template\n+_\b2_\b1_\b1 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (std::uintmax_t x)\n+212 {\n+213 _\ba_\bs_\bs_\bi_\bg_\bn(x);\n+214 }\n+215 template\n+216 void _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn(std::uintmax_t x)\n+217 {\n+218 static const int no=std::min(static_cast(n),\n+219 static_cast(std::numeric_limits::digits/bits));\n+220\n+221 for(int i=0; i>bits;\n+224 }\n+225 for (unsigned int i=no; i\n+_\b2_\b3_\b0 inline std::uint_least32_t _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bt_\bo_\bu_\bi_\bn_\bt () const\n+231 {\n+232 return (digit[1]<\n+_\b2_\b3_\b6 inline double _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bt_\bo_\bd_\bo_\bu_\bb_\bl_\be() const\n+237 {\n+238 int firstInZeroRange=n;\n+239 for(int i=n-1; i>=0; --i)\n+240 if(digit[i]!=0)\n+241 break;\n+242 else\n+243 --firstInZeroRange;\n+244 int representableDigits=std::numeric_limits::digits/bits;\n+245 int lastInRepresentableRange=0;\n+246 if(representableDigits=lastInRepresentableRange; --i)\n+250 val =val*(1<\n+_\b2_\b5_\b5 inline void _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt (std::ostream& s) const\n+256 {\n+257 bool leading=false;\n+258\n+259 // print from left to right\n+260 for (int i=n-1; i>=0; i--)\n+261 for (int d=hexdigits-1; d>=0; d--)\n+262 {\n+263 // extract one hex digit\n+264 int current = (digit[i]>>(d*4))&0xF;\n+265 if (current!=0)\n+266 {\n+267 // s.setf(std::ios::noshowbase);\n+268 s << std::hex << current;\n+269 leading = false;\n+270 }\n+271 else if (!leading) s << std::hex << current;\n+272 }\n+273 if (leading) s << \"0\";\n+274 s << std::dec;\n+275 }\n+276\n+277 template \n+_\b2_\b7_\b8 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>&\n+x)\n+279 {\n+280 x._\bp_\br_\bi_\bn_\bt(s);\n+281 return s;\n+282 }\n+283\n+_\b2_\b8_\b4 #define DUNE_BINOP(OP) \\\n+285 template \\\n+286 inline bigunsignedint bigunsignedint::operator OP (const\n+bigunsignedint &x) const \\\n+287 { \\\n+288 auto temp = *this; \\\n+289 temp OP##= x; \\\n+290 return temp; \\\n+291 }\n+292\n+293 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(+)\n+294 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(-)\n+295 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(*)\n+296 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(/)\n+297 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(%)\n+298 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(&)\n+299 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(^)\n+300 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(|)\n+301\n+302 #undef DUNE_BINOP\n+303\n+304 template \n+_\b3_\b0_\b5 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+306 {\n+307 std::uint_fast32_t overflow=0;\n+308\n+309 for (unsigned int i=0; i(digit[i]) +\n+static_cast(x.digit[i]) + overflow;\n+312 digit[i] = sum&bitmask;\n+313 overflow = (sum>>bits)&overflowmask;\n+314 }\n+315 return *this;\n+316 }\n+317\n+318 template \n+_\b3_\b1_\b9 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+320 {\n+321 std::int_fast32_t overflow=0;\n+322\n+323 for (unsigned int i=0; i(digit[i]) -\n+static_cast(x.digit[i]) - overflow;\n+326 if (diff>=0)\n+327 {\n+328 digit[i] = static_cast(diff);\n+329 overflow = 0;\n+330 }\n+331 else\n+332 {\n+333 digit[i] = static_cast(diff+bitmask+1);\n+334 overflow = 1;\n+335 }\n+336 }\n+337 return *this;\n+338 }\n+339\n+340 template \n+_\b3_\b4_\b1 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+342 {\n+343 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\b2_\b*_\bk_\b> finalproduct(0);\n+344\n+345 for (unsigned int m=0; m singleproduct(0);\n+348 std::uint_fast32_t overflow(0);\n+349 for (unsigned int i=0; i(digit\n+[i])*static_cast(x.digit[m])+overflow;\n+352 singleproduct.digit[i+m] = static_cast\n+(digitproduct&bitmask);\n+353 overflow = (digitproduct>>bits)&bitmask;\n+354 }\n+355 finalproduct = finalproduct+singleproduct;\n+356 }\n+357\n+358 for (unsigned int i=0; i\n+_\b3_\b6_\b3 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+_\b ()\n+364 {\n+365 std::uint_fast32_t overflow=1;\n+366\n+367 for (unsigned int i=0; i(digit[i]) +\n+overflow;\n+370 digit[i] = sum&bitmask;\n+371 overflow = (sum>>bits)&overflowmask;\n+372 }\n+373 return *this;\n+374 }\n+375\n+376 template \n+_\b3_\b7_\b7 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+378 {\n+379 if(x==0)\n+380 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bE_\br_\br_\bo_\br, \"division by zero!\");\n+381\n+382 // better slow than nothing\n+383 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result(0);\n+384\n+385 while (*this>=x)\n+386 {\n+387 ++result;\n+388 *this -= x;\n+389 }\n+390\n+391 *this = result;\n+392 return *this;\n+393 }\n+394\n+395 template \n+_\b3_\b9_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+397 {\n+398 // better slow than nothing\n+399 while (*this>=x)\n+400 {\n+401 *this -= x;\n+402 }\n+403\n+404 return *this;\n+405 }\n+406\n+407 template \n+_\b4_\b0_\b8 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+409 {\n+410 for (unsigned int i=0; i\n+_\b4_\b1_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+417 {\n+418 for (unsigned int i=0; i\n+_\b4_\b2_\b4 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=_\b (const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+425 {\n+426 for (unsigned int i=0; i\n+_\b4_\b3_\b2 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~_\b () const\n+433 {\n+434 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result;\n+435 for (unsigned int i=0; i\n+441 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (int shift) const\n+442 {\n+443 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result(0);\n+444\n+445 // multiples of bits\n+446 int j=shift/bits;\n+447 for (int i=n-1-j; i>=0; i--)\n+448 result.digit[i+j] = digit[i];\n+449\n+450 // remainder\n+451 j=shift%bits;\n+452 for (int i=n-1; i>=0; i--)\n+453 {\n+454 unsigned int temp = result.digit[i];\n+455 temp = temp<(temp&bitmask);\n+457 temp = temp>>bits;\n+458 if (i+1<(int)n)\n+459 result.digit[i+1] = result.digit[i+1]|temp;\n+460 }\n+461\n+462 return result;\n+463 }\n+464\n+465 template \n+_\b4_\b6_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>_\b (int shift) const\n+467 {\n+468 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result(0);\n+469\n+470 // multiples of bits\n+471 int j=shift/bits;\n+472 for (unsigned int i=0; i((temp&compbitmask)>>bits);\n+482 if (i>0)\n+483 result.digit[i-1] = result.digit[i-1] | (temp&bitmask);\n+484 }\n+485\n+486 return result;\n+487 }\n+488\n+489 template \n+_\b4_\b9_\b0 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+const\n+491 {\n+492 for (unsigned int i=0; i\n+_\b4_\b9_\b8 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+const\n+499 {\n+500 return !((*this)!=x);\n+501 }\n+502\n+503 template \n+_\b5_\b0_\b4 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const\n+505 {\n+506 for (int i=n-1; i>=0; i--)\n+507 if (digit[i]x.digit[i]) return false;\n+509 return false;\n+510 }\n+511\n+512 template \n+_\b5_\b1_\b3 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+const\n+514 {\n+515 for (int i=n-1; i>=0; i--)\n+516 if (digit[i]x.digit[i]) return false;\n+518 return true;\n+519 }\n+520\n+521 template \n+_\b5_\b2_\b2 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const\n+523 {\n+524 return !((*this)<=x);\n+525 }\n+526\n+527 template \n+_\b5_\b2_\b8 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n+const\n+529 {\n+530 return !((*this)\n+_\b5_\b3_\b5 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n+uintmax_t y)\n+536 {\n+537 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n+538 return x+temp;\n+539 }\n+540\n+541 template \n+_\b5_\b4_\b2 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n+uintmax_t y)\n+543 {\n+544 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n+545 return x-temp;\n+546 }\n+547\n+548 template \n+_\b5_\b4_\b9 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n+uintmax_t y)\n+550 {\n+551 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n+552 return x*temp;\n+553 }\n+554\n+555 template \n+_\b5_\b5_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n+uintmax_t y)\n+557 {\n+558 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n+559 return x/temp;\n+560 }\n+561\n+562 template \n+_\b5_\b6_\b3 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n+uintmax_t y)\n+564 {\n+565 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n+566 return x%temp;\n+567 }\n+568\n+569 template \n+_\b5_\b7_\b0 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b (std::uintmax_t x, const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n+571 {\n+572 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n+573 return temp+y;\n+574 }\n+575\n+576 template \n+_\b5_\b7_\b7 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b (std::uintmax_t x, const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n+578 {\n+579 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n+580 return temp-y;\n+581 }\n+582\n+583 template \n+_\b5_\b8_\b4 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (std::uintmax_t x, const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n+585 {\n+586 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n+587 return temp*y;\n+588 }\n+589\n+590 template \n+_\b5_\b9_\b1 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b (std::uintmax_t x, const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n+592 {\n+593 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n+594 return temp/y;\n+595 }\n+596\n+597 template \n+_\b5_\b9_\b8 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b (std::uintmax_t x, const\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n+599 {\n+600 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n+601 return temp%y;\n+602 }\n+603\n+604 // Forward declare type-trait for numbers\n+605 template struct IsNumber;\n+606\n+608 template \n+_\b6_\b0_\b9 struct _\bI_\bs_\bN_\bu_\bm_\bb_\be_\br<_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt> : public std::true_type {};\n+610\n+612}\n+613\n+614namespace _\bs_\bt_\bd\n+615{\n+616 template\n+617 struct numeric_limits<_\bD_\bu_\bn_\be::bigunsignedint >\n+618 : private Dune::Impl::numeric_limits_helper > /\n+/ for access to internal state of bigunsignedint\n+619 {\n+620 public:\n+621 static const bool is_specialized = true;\n+622\n+623 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> min()\n+624 {\n+625 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n+626 }\n+627\n+628 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bm_\ba_\bx()\n+629 {\n+630 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> max_;\n+631 for(std::size_t i=0; i < Dune::bigunsignedint::n; ++i)\n+632 // access internal state via the helper base class\n+633 Dune::Impl::numeric_limits_helper<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >::\n+634 digit(max_,i)=_\bs_\bt_\bd::numeric_limits<_\bs_\bt_\bd::uint16_t>::_\bm_\ba_\bx();\n+635 return max_;\n+636 }\n+637\n+638\n+639 static const int digits = _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bt_\bs *\n+640 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bn;\n+641 static const bool is_signed = false;\n+642 static const bool is_integer = true;\n+643 static const bool is_exact = true;\n+644 static const int radix = 2;\n+645\n+646 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> epsilon()\n+647 {\n+648 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n+649 }\n+650\n+651 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> round_error()\n+652 {\n+653 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n+654 }\n+655\n+656 static const int min_exponent = 0;\n+657 static const int min_exponent10 = 0;\n+658 static const int max_exponent = 0;\n+659 static const int max_exponent10 = 0;\n+660\n+661 static const bool has_infinity = false;\n+662 static const bool has_quiet_NaN = false;\n+663 static const bool has_signaling_NaN = false;\n+664\n+665 static const float_denorm_style has_denorm = denorm_absent;\n+666 static const bool has_denorm_loss = false;\n+667\n+668 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> infinity() noexcept\n+669 {\n+670 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n+671 }\n+672\n+673 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> quiet_NaN() noexcept\n+674 {\n+675 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n+676 }\n+677\n+678 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> signaling_NaN() noexcept\n+679 {\n+680 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n+681 }\n+682\n+683 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> denorm_min() noexcept\n+684 {\n+685 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n+686 }\n+687\n+688 static const bool is_iec559 = false;\n+689 static const bool is_bounded = true;\n+690 static const bool is_modulo = true;\n+691\n+692 static const bool traps = false;\n+693 static const bool tinyness_before = false;\n+694 static const float_round_style round_style = round_toward_zero;\n+695\n+696 };\n+697\n+698}\n+699\n+700_\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(int k),_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bY_\bP_\bE(_\bD_\bu_\bn_\be_\b:_\b:\n+_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>))\n+701\n+702#endif\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+_\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+bigunsignedint< k > & operator/=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:377\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+bigunsignedint< k > operator<<(int i) const\n+left shift\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:441\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+bigunsignedint< k > & operator+=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:305\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=\n+bigunsignedint< k > & operator^=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:416\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=\n+bool operator<=(const bigunsignedint< k > &x) const\n+less than or equal\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:513\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+void print(std::ostream &s) const\n+Print number in hex notation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:255\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n+bool operator<(const bigunsignedint< k > &x) const\n+less than\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:504\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:556\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const bigunsignedint< k > &x) const\n+equal\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:498\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const bigunsignedint< k > &x) const\n+not equal\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:490\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt\n+bigunsignedint()\n+Construct uninitialized.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=\n+bigunsignedint< k > & operator&=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:408\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=\n+bool operator>=(const bigunsignedint< k > &x) const\n+greater or equal\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:528\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+bigunsignedint< k > operator>>(int i) const\n+right shift\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:466\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~\n+bigunsignedint< k > operator~() const\n+bitwise complement\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:432\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+bigunsignedint< k > & operator++()\n+prefix increment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:363\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=\n+bigunsignedint< k > & operator|=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:424\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:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b=\n+bigunsignedint< k > & operator%=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:396\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bt_\bo_\bd_\bo_\bu_\bb_\bl_\be\n+double todouble() const\n+Convert to a double.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:236\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+bigunsignedint< k > & operator-=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:319\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>\n+bool operator>(const bigunsignedint< k > &x) const\n+greater than\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:522\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+bigunsignedint< k > & operator*=(const bigunsignedint< k > &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:341\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bt_\bo_\bu_\bi_\bn_\bt\n+std::uint_least32_t touint() const\n+export to other types\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:230\n+_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP\n+#define DUNE_BINOP(OP)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:284\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:43\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:_\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:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\ba_\bx\n+auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n+&b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:425\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:50\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:53\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:71\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:60\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:67\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:65\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:55\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:89\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:80\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:86\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:83\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:90\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:107\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:112\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:115\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:130\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:123\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:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt\n+Portable very large unsigned integers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\bm_\ba_\bs_\bk\n+static constexpr int overflowmask\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|\n+bigunsignedint< k > operator|(const bigunsignedint< k > &x) const\n+bitwise or\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bh_\be_\bx_\bd_\bi_\bg_\bi_\bt_\bs\n+static constexpr int hexdigits\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^\n+bigunsignedint< k > operator^(const bigunsignedint< k > &x) const\n+bitwise exor\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+bigunsignedint< k > operator*(const bigunsignedint< k > &x) const\n+multiply\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%\n+bigunsignedint< k > operator%(const bigunsignedint< k > &x) const\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n+bigunsignedint< k > operator-(const bigunsignedint< k > &x) const\n+subtract\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bc_\bo_\bm_\bp_\bb_\bi_\bt_\bm_\ba_\bs_\bk\n+static constexpr int compbitmask\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&\n+bigunsignedint< k > operator&(const bigunsignedint< k > &x) const\n+bitwise and\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bb_\bi_\bt_\bs\n+static constexpr int bits\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/\n+bigunsignedint< k > operator/(const bigunsignedint< k > &x) const\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n+bigunsignedint< k > operator+(const bigunsignedint< k > &x) const\n+add\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bv_\ba_\bl_\bu_\be\n+friend std::size_t hash_value(const bigunsignedint &arg)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bb_\bi_\bt_\bm_\ba_\bs_\bk\n+static constexpr int bitmask\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:80\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:_\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+_\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 ===============================================================================\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/a00080.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00080.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: communicator.hh File Reference\n+dune-common: type_traits.hh File Reference\n \n \n \n \n \n \n \n@@ -65,73 +65,102 @@\n \n \n \n \n \n \n \n \n+
    type_traits.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 <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 <type_traits>
    \n+#include <dune/common/typetraits.hh>
    \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-\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 > >
    struct  Dune::Std::nonesuch
     Type representing a lookup failure by std::detected_or and friends. More...
     
    class  Dune::CommPolicy< V >::CommunicationError
     Error thrown if there was a problem with the communication. More...
    struct  Dune::Std::conjunction< B >
     forms the logical conjunction of the type traits B... More...
     
    struct  Dune::CommPolicy< V >::CopyGatherScatter< T >
     GatherScatter default implementation that just copies data. More...
    struct  Dune::Std::disjunction< B >
     forms the logical disjunction of the type traits B... More...
     
    class  Dune::BufferedCommunicator
     A communicator that uses buffers to gather and scatter the data to be send or received. More...
    struct  Dune::Std::negation< B >
     forms the logical negation of the type traits B... 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+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+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Variables

    template<template< typename... > class Op, typename... Args>
    constexpr bool Dune::Std::is_detected_v = is_detected<Op,Args...>::value
     Detects whether Op<Args...> is valid and makes the result available as a value.
     
    template<typename Expected , template< typename... > class Op, typename... Args>
    constexpr bool Dune::Std::is_detected_exact_v = is_detected_exact<Expected,Op,Args...>::value
     Convenient access to the result value of is_detected_exact.
     
    template<typename Target , template< typename... > class Op, typename... Args>
    constexpr bool Dune::Std::is_detected_convertible_v = is_detected_convertible<Target,Op,Args...>::value
     Convenient access to the result value of is_detected_convertible.
     
    \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": "@@ -1,59 +1,97 @@\n dune-common\u00a02.9.0\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+ * _\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 | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+type_traits.hh File Reference\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/_\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 _\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:_\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 \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:_\bS_\bt_\bd_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bB_\b _\b>\n+\u00a0 forms the logical conjunction of the type traits B... _\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\bi_\bs_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bB_\b _\b>\n+\u00a0 forms the logical disjunction of the type traits B... _\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bn_\be_\bg_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bB_\b _\b>\n+\u00a0 forms the logical negation of the type traits B... _\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:_\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+\u00a0\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+template class Op, typename... Args>\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bv = _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd::value\n+\u00a0 Detects whether Op is valid and makes the result\n+ available as a value.\n+\u00a0\n+template class Op, typename...\n+Args>\n+constexpr bool\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_\b__\bv =\n+ _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt::value\n+\u00a0 Convenient access to the result value of is_detected_exact.\n+\u00a0\n+template class Op, typename... Args>\n+constexpr bool\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_\b__\bv =\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+\u00a0 Convenient access to the result value of\n+ is_detected_convertible.\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/a00080_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00080_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: type_traits.hh Source File\n \n \n \n \n \n \n \n@@ -70,1040 +70,223 @@\n \n \n \n \n \n \n \n
    \n-
    communicator.hh
    \n+
    type_traits.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 (C) 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_COMMUNICATOR
    \n-
    6#define DUNE_COMMUNICATOR
    \n+
    5#ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
    \n+
    6#define DUNE_COMMON_STD_TYPE_TRAITS_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+
    8#include <type_traits>
    \n+\n+\n+
    11
    \n+
    12#if __has_include(<experimental/type_traits>)
    \n+
    13#include <experimental/type_traits>
    \n+
    14#endif
    \n+
    15
    \n+
    16namespace Dune
    \n+
    17{
    \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-
    \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+
    20
    \n+
    29namespace Std
    \n+
    30{
    \n+
    31
    \n+
    34 using std::bool_constant;
    \n+
    35
    \n+
    36#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n+
    37
    \n+
    38 using std::experimental::nonesuch;
    \n+
    39 using std::experimental::detected_or;
    \n+
    40 using std::experimental::is_detected;
    \n+
    41 using std::experimental::detected_t;
    \n+
    42 using std::experimental::is_detected_v;
    \n+
    43 using std::experimental::detected_or_t;
    \n+
    44 using std::experimental::is_detected_exact;
    \n+
    45 using std::experimental::is_detected_exact_v;
    \n+
    46 using std::experimental::is_detected_convertible;
    \n+
    47 using std::experimental::is_detected_convertible_v;
    \n+
    48
    \n+
    49#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n+
    50
    \n+
    51 // fallback version of std::experimental::is_detected et al., heavily scribbled
    \n+
    52 // from cppreference.com (but there is actually not much implementation to the thing)
    \n+
    53
    \n+
    54#ifndef DOXYGEN
    \n+
    55
    \n+
    56 namespace Impl {
    \n+
    57
    \n+
    58 // default version of detector, this gets matched on failure
    \n+
    59 template<typename Default, typename Void, template<typename...> class Op, typename... Args>
    \n+
    60 struct detector
    \n+
    61 {
    \n+
    62 using value_t = std::false_type;
    \n+
    63 using type = Default;
    \n+
    64 };
    \n+
    65
    \n+
    66 // specialization of detector that matches if Op<Args...> can be instantiated
    \n+
    67 template<typename Default, template<typename...> class Op, typename... Args>
    \n+
    68 struct detector<Default, std::void_t<Op<Args...>>, Op, Args...>
    \n+
    69 {
    \n+
    70 using value_t = std::true_type;
    \n+
    71 using type = Op<Args...>;
    \n+
    72 };
    \n+
    73
    \n+
    74 }
    \n+
    75
    \n+
    76#endif // DOXYGEN
    \n+
    77
    \n+
    79
    \n+
    \n+
    87 struct nonesuch
    \n+
    88 {
    \n+
    89 nonesuch() = delete;
    \n+
    90 ~nonesuch() = delete;
    \n+
    91 nonesuch(const nonesuch&) = delete;
    \n+
    92 void operator=(const nonesuch&) = delete;
    \n+
    93 };
    \n+
    \n+
    94
    \n+
    96
    \n+
    127 template<typename Default, template<typename...> class Op, typename... Args>
    \n+
    128 using detected_or = Impl::detector<Default,void,Op,Args...>;
    \n+
    129
    \n+
    131
    \n+
    140 template<template<typename...> class Op, typename... Args>
    \n+
    141 using is_detected = typename detected_or<nonesuch,Op,Args...>::value_t;
    \n+
    142
    \n+
    143#ifdef __cpp_variable_templates
    \n+
    145
    \n+
    154 template<template<typename...> class Op, typename... Args>
    \n+
    155 constexpr bool is_detected_v = is_detected<Op,Args...>::value;
    \n+
    156#endif // __cpp_variable_templates
    \n+
    157
    \n+
    159
    \n+
    169 template<template<typename...> class Op, typename... Args>
    \n+
    170 using detected_t = typename detected_or<nonesuch,Op,Args...>::type;
    \n+
    171
    \n
    172
    \n-
    173 template<class K, int n> class FieldVector;
    \n
    174
    \n-
    175 template<class B, class A> class VariableBlockVector;
    \n-
    176
    \n-
    177 template<class K, class A, int n>
    \n-
    \n-\n-
    179 {
    \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+
    184 template<typename Default, template<typename...> class Op, typename... Args>
    \n+
    185 using detected_or_t = typename detected_or<Default,Op,Args...>::type;
    \n+
    186
    \n+
    188
    \n+
    194 template<typename Expected, template<typename...> class Op, typename... Args>
    \n+
    195 using is_detected_exact = std::is_same<Expected,detected_t<Op,Args...>>;
    \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+
    197#ifdef __cpp_variable_templates
    \n+
    199
    \n+
    205 template<typename Expected, template<typename...> class Op, typename... Args>
    \n+
    206 constexpr bool is_detected_exact_v = is_detected_exact<Expected,Op,Args...>::value;
    \n+
    207#endif // __cpp_variable_templates
    \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+
    216 template<typename Target, template<typename...> class Op, typename... Args>
    \n+
    217 using is_detected_convertible = std::is_convertible<Target,detected_t<Op,Args...>>;
    \n+
    218
    \n+
    219#ifdef __cpp_variable_templates
    \n+
    221
    \n+
    227 template<typename Target, template<typename...> class Op, typename... Args>
    \n+
    228 constexpr bool is_detected_convertible_v = is_detected_convertible<Target,Op,Args...>::value;
    \n+
    229#endif // __cpp_variable_templates
    \n+
    230
    \n+
    231#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n+
    232
    \n+
    233
    \n+
    234
    \n+
    235 // conjunction
    \n+
    236 // -----------
    \n+
    237
    \n+
    245 template< class... B >
    \n+
    \n+
    246 struct [[deprecated("Will be removed after release 2.8. Use std::conjunction instead.")]] conjunction
    \n+
    247 : std::conjunction<B...>
    \n+
    248 {};
    \n+
    \n+
    249
    \n+
    250
    \n+
    251 // disjunction
    \n+
    252 // -----------
    \n+
    253
    \n+
    261 template< class... B >
    \n+
    \n+
    262 struct [[deprecated("Will be removed after release 2.8. Use std::disjunction instead.")]] disjunction
    \n+
    263 : std::disjunction<B...>
    \n+
    264 {};
    \n+
    \n+
    265
    \n+
    266
    \n+
    267 // negation
    \n+
    268 // --------
    \n+
    269
    \n+
    277 template<class B>
    \n+
    \n+
    278 struct [[deprecated("Will be removed after release 2.8. Use std::negation instead.")]] negation
    \n+
    279 : std::negation<B>
    \n+
    280 {};
    \n+
    \n+
    281
    \n+
    282} // namespace Std
    \n+
    283
    \n+
    284
    \n+
    285namespace detail
    \n+
    286{
    \n+
    287 template <class Type>
    \n+
    288 [[deprecated("Type extraction of `TargetType` has failed. Inspect the code calling `detected_or_fallback_t` for getting the source of this warning!")]]
    \n+
    289 Type warningIfNotDefined(const Std::nonesuch*);
    \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
    \n-
    1534#endif
    \n-
    Standard Dune debug streams.
    \n-
    Classes describing a distributed indexset.
    \n-
    A few common exception classes.
    \n-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:95
    \n+
    291 template <class Type, class T>
    \n+
    292 Type warningIfNotDefined(const T*);
    \n+
    293}
    \n+
    294
    \n+
    296template <template<typename...> class Fallback,
    \n+
    297 template<typename...> class TargetType, typename... Args>
    \n+\n+
    299 detail::warningIfNotDefined<Std::detected_t<Fallback, Args...> >(std::declval<const Std::detected_t<TargetType, Args...>*>())),
    \n+
    300 TargetType, Args...>;
    \n+
    301
    \n+
    302
    \n+
    303} // namespace Dune
    \n+
    304
    \n+
    305#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
    \n+
    Traits for type conversions and type information.
    \n+
    Utilities for type computations, constraining overloads, ...
    \n+
    constexpr bool is_detected_exact_v
    Convenient access to the result value of is_detected_exact.
    Definition type_traits.hh:206
    \n+
    constexpr bool is_detected_convertible_v
    Convenient access to the result value of is_detected_convertible.
    Definition type_traits.hh:228
    \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:185
    \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:195
    \n+
    typename detected_or< nonesuch, Op, Args... >::type detected_t
    Returns Op<Args...> if that is valid; otherwise returns nonesuch.
    Definition type_traits.hh:170
    \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+
    constexpr bool is_detected_v
    Detects whether Op<Args...> is valid and makes the result available as a value.
    Definition type_traits.hh:155
    \n+
    typename detected_or< nonesuch, Op, Args... >::value_t is_detected
    Detects whether Op<Args...> is valid.
    Definition type_traits.hh:141
    \n+
    Impl::detector< Default, void, Op, Args... > detected_or
    Detects whether Op<Args...> is valid and makes the result available.
    Definition type_traits.hh:128
    \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:217
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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:35
    \n-
    Information describing an interface.
    Definition parallel/interface.hh:101
    \n-
    Communication interface between remote and local indices.
    Definition parallel/interface.hh:209
    \n-
    An index present on the local process.
    Definition localindex.hh:35
    \n-
    The indices present on remote processes.
    Definition remoteindices.hh:189
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:215
    \n-
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:226
    \n-
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:221
    \n-
    Provides classes for building the communication interface between remote indices.
    \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:300
    \n+
    Type representing a lookup failure by std::detected_or and friends.
    Definition type_traits.hh:88
    \n+\n+
    nonesuch(const nonesuch &)=delete
    \n+
    void operator=(const nonesuch &)=delete
    \n+\n+
    forms the logical conjunction of the type traits B...
    Definition type_traits.hh:248
    \n+
    forms the logical disjunction of the type traits B...
    Definition type_traits.hh:264
    \n+
    forms the logical negation of the type traits B...
    Definition type_traits.hh:280
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1202 +1,279 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bt_\bd\n+type_traits.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 (C) 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_COMMUNICATOR\n-6#define DUNE_COMMUNICATOR\n+5#ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH\n+6#define DUNE_COMMON_STD_TYPE_TRAITS_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+8#include \n+9#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+10#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+11\n+12#if __has_include()\n+13#include \n+14#endif\n+15\n+16namespace _\bD_\bu_\bn_\be\n+17{\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-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+20\n+29namespace Std\n+30{\n+31\n+34 using std::bool_constant;\n+35\n+36#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n+37\n+38 using std::experimental::nonesuch;\n+39 using std::experimental::detected_or;\n+40 using std::experimental::is_detected;\n+41 using std::experimental::detected_t;\n+42 using std::experimental::is_detected_v;\n+43 using std::experimental::detected_or_t;\n+44 using std::experimental::is_detected_exact;\n+45 using std::experimental::is_detected_exact_v;\n+46 using std::experimental::is_detected_convertible;\n+47 using std::experimental::is_detected_convertible_v;\n+48\n+49#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n+50\n+51 // fallback version of std::experimental::is_detected et al., heavily\n+scribbled\n+52 // from cppreference.com (but there is actually not much implementation to\n+the thing)\n+53\n+54#ifndef DOXYGEN\n+55\n+56 namespace Impl {\n+57\n+58 // default version of detector, this gets matched on failure\n+59 template class Op,\n+typename... Args>\n+60 struct detector\n+61 {\n+62 using value_t = std::false_type;\n+63 using type = Default;\n+64 };\n+65\n+66 // specialization of detector that matches if Op can be\n+instantiated\n+67 template class Op, typename... Args>\n+68 struct detector>, Op, Args...>\n+69 {\n+70 using value_t = std::true_type;\n+71 using type = Op;\n+72 };\n+73\n+74 }\n+75\n+76#endif // DOXYGEN\n+77\n+79\n+_\b8_\b7 struct _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh\n+88 {\n+_\b8_\b9 _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh() = delete;\n+_\b9_\b0 _\b~_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh() = delete;\n+_\b9_\b1 _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh(const _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh&) = delete;\n+_\b9_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh&) = delete;\n+93 };\n+94\n+96\n+127 template class Op, typename...\n+Args>\n+_\b1_\b2_\b8 using _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br = Impl::detector;\n+129\n+131\n+140 template class Op, typename... Args>\n+_\b1_\b4_\b1 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+142\n+143#ifdef __cpp_variable_templates\n+145\n+154 template class Op, typename... Args>\n+_\b1_\b5_\b5 constexpr bool _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bv = _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd::value;\n+156#endif // __cpp_variable_templates\n+157\n+159\n+169 template class Op, typename... Args>\n+_\b1_\b7_\b0 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+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-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-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+184 template class Op, typename...\n+Args>\n+_\b1_\b8_\b5 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+186\n+188\n+194 template class Op, typename...\n+Args>\n+_\b1_\b9_\b5 using _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt = std::is_same>;\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+197#ifdef __cpp_variable_templates\n+199\n+205 template class Op, typename...\n+Args>\n+_\b2_\b0_\b6 constexpr bool _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt_\b__\bv =\n+_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt::value;\n+207#endif // __cpp_variable_templates\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+216 template class Op, typename... Args>\n+_\b2_\b1_\b7 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+218\n+219#ifdef __cpp_variable_templates\n+221\n+227 template class Op, typename... Args>\n+_\b2_\b2_\b8 constexpr bool _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bc_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be_\b__\bv =\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+229#endif // __cpp_variable_templates\n+230\n+231#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n+232\n+233\n+234\n+235 // conjunction\n+236 // -----------\n+237\n+245 template< class... B >\n+_\b2_\b4_\b6 struct [[deprecated(\"Will be removed after release 2.8. Use std::\n+conjunction instead.\")]] _\bc_\bo_\bn_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+247 : std::conjunction\n+248 {};\n+249\n+250\n+251 // disjunction\n+252 // -----------\n+253\n+261 template< class... B >\n+_\b2_\b6_\b2 struct [[deprecated(\"Will be removed after release 2.8. Use std::\n+disjunction instead.\")]] _\bd_\bi_\bs_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+263 : std::disjunction\n+264 {};\n+265\n+266\n+267 // negation\n+268 // --------\n+269\n+277 template\n+_\b2_\b7_\b8 struct [[deprecated(\"Will be removed after release 2.8. Use std::negation\n+instead.\")]] _\bn_\be_\bg_\ba_\bt_\bi_\bo_\bn\n+279 : std::negation\n+280 {};\n+281\n+282} // namespace Std\n+283\n+284\n+285namespace detail\n+286{\n+287 template \n+288 [[deprecated(\"Type extraction of `TargetType` has failed. Inspect the code\n+calling `detected_or_fallback_t` for getting the source of this warning!\")]]\n+289 Type warningIfNotDefined(const _\bS_\bt_\bd_\b:_\b:_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh*);\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 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 >\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 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::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 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 _\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\n-1534#endif\n-_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n-Standard Dune debug streams.\n-_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-Classes describing a distributed indexset.\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:_\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:95\n+291 template \n+292 Type warningIfNotDefined(const T*);\n+293}\n+294\n+296template class Fallback,\n+297 template class TargetType, typename... Args>\n+_\b2_\b9_\b8using _\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+300 TargetType, Args...>;\n+301\n+302\n+303} // namespace Dune\n+304\n+305#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:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt_\b__\bv\n+constexpr bool is_detected_exact_v\n+Convenient access to the result value of is_detected_exact.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:206\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_\b__\bv\n+constexpr bool is_detected_convertible_v\n+Convenient access to the result value of is_detected_convertible.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:228\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:185\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:195\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:170\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_\b__\bv\n+constexpr bool is_detected_v\n+Detects whether Op is valid and makes the result available as a value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:155\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:141\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:128\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_\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:35\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:101\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:209\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:189\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:215\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:226\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:221\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:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bf_\ba_\bl_\bl_\bb_\ba_\bc_\bk_\b__\bt\n+Std::detected_or_t< decltype(detail::warningIfNotDefined< Std::detected_t<\n+Fallback, Args... > >(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: mpiguard.hh File Reference\n+dune-common: utility.hh File Reference\n \n \n \n \n \n \n \n@@ -65,52 +65,36 @@\n \n \n \n \n \n \n \n
    \n \n-
    mpiguard.hh File Reference
    \n+
    utility.hh File Reference
    \n
    \n
    \n-\n-

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

    \n-
    #include "mpihelper.hh"
    \n-#include "communication.hh"
    \n-#include "mpicommunication.hh"
    \n-#include <dune/common/exceptions.hh>
    \n+
    #include <utility>
    \n
    \n

    Go to the source code of this file.

    \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::MPIGuard
     detects a thrown exception and communicates to all other processes 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-

    Detailed Description

    \n-

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

    \n-
    Author
    Christian Engwer
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,20 @@\n dune-common\u00a02.9.0\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-#include \"_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh\"\n-#include \"_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \"_\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/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+ * _\bs_\bt_\bd\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+utility.hh File Reference\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:_\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-Implements a MPIGuard which detects an error on a remote process.\n- Author\n- Christian Engwer\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/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: mpiguard.hh Source File\n+dune-common: utility.hh Source File\n \n \n \n \n \n \n \n@@ -70,212 +70,49 @@\n \n \n \n \n \n \n \n
    \n-
    mpiguard.hh
    \n+
    utility.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 (C) 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 (C) 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_STD_UTILITY_HH
    \n+
    4#define DUNE_COMMON_STD_UTILITY_HH
    \n
    5
    \n-
    13#ifndef DUNE_COMMON_MPIGUARD_HH
    \n-
    14#define DUNE_COMMON_MPIGUARD_HH
    \n-
    15
    \n-
    16#include "mpihelper.hh"
    \n-
    17#include "communication.hh"
    \n-
    18#include "mpicommunication.hh"
    \n-\n-
    20
    \n-
    21namespace Dune
    \n-
    22{
    \n-
    23
    \n-
    24#ifndef DOXYGEN
    \n-
    25
    \n-
    26 /*
    \n-
    27 Interface class for the communication needed by MPIGuard
    \n-
    28 */
    \n-
    29 struct GuardCommunicator
    \n-
    30 {
    \n-
    31 // cleanup
    \n-
    32 virtual ~GuardCommunicator() {};
    \n-
    33 // all the communication methods we need
    \n-
    34 virtual int rank() = 0;
    \n-
    35 virtual int size() = 0;
    \n-
    36 virtual int sum(int i) = 0;
    \n-
    37 // create a new GuardCommunicator pointer
    \n-
    38 template <class C>
    \n-
    39 static GuardCommunicator * create(const Communication<C> & c);
    \n-
    40#if HAVE_MPI
    \n-
    41 inline
    \n-
    42 static GuardCommunicator * create(const MPI_Comm & c);
    \n-
    43#endif
    \n-
    44 };
    \n-
    45
    \n-
    46 namespace {
    \n-
    47 /*
    \n-
    48 templated implementation of different communication classes
    \n-
    49 */
    \n-
    50 // the default class will always fail, due to the missing implementation of "sum"
    \n-
    51 template <class Imp>
    \n-
    52 struct GenericGuardCommunicator
    \n-
    53 : public GuardCommunicator
    \n-
    54 {};
    \n-
    55 // specialization for Communication
    \n-
    56 template <class T>
    \n-
    57 struct GenericGuardCommunicator< Communication<T> >
    \n-
    58 : public GuardCommunicator
    \n-
    59 {
    \n-
    60 const Communication<T> comm;
    \n-
    61 GenericGuardCommunicator(const Communication<T> & c) :
    \n-
    62 comm(c) {}
    \n-
    63 int rank() override { return comm.rank(); };
    \n-
    64 int size() override { return comm.size(); };
    \n-
    65 int sum(int i) override { return comm.sum(i); }
    \n-
    66 };
    \n-
    67
    \n-
    68#if HAVE_MPI
    \n-
    69 // specialization for MPI_Comm
    \n-
    70 template <>
    \n-
    71 struct GenericGuardCommunicator<MPI_Comm>
    \n-
    72 : public GenericGuardCommunicator< Communication<MPI_Comm> >
    \n-
    73 {
    \n-
    74 GenericGuardCommunicator(const MPI_Comm & c) :
    \n-
    75 GenericGuardCommunicator< Communication<MPI_Comm> >(
    \n-
    76 Communication<MPI_Comm>(c)) {}
    \n-
    77 };
    \n-
    78#endif
    \n-
    79 } // anonymous namespace
    \n-
    80
    \n-
    81 template<class C>
    \n-
    82 GuardCommunicator * GuardCommunicator::create(const Communication<C> & comm)
    \n-
    83 {
    \n-
    84 return new GenericGuardCommunicator< Communication<C> >(comm);
    \n-
    85 }
    \n-
    86
    \n-
    87#if HAVE_MPI
    \n-
    88 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm)
    \n-
    89 {
    \n-
    90 return new GenericGuardCommunicator< Communication<MPI_Comm> >(comm);
    \n-
    91 }
    \n-
    92#endif
    \n-
    93
    \n-
    94#endif
    \n-
    95
    \n-
    99 class MPIGuardError : public ParallelError {};
    \n-
    100
    \n-
    \n-\n-
    134 {
    \n-
    135 GuardCommunicator * comm_;
    \n-
    136 bool active_;
    \n-
    137
    \n-
    138 // we don't want to copy this class
    \n-
    139 MPIGuard (const MPIGuard &);
    \n-
    140
    \n-
    141 public:
    \n-
    \n-
    146 MPIGuard (bool active=true) :
    \n-
    147 comm_(GuardCommunicator::create(
    \n-
    148 MPIHelper::getCommunication())),
    \n-
    149 active_(active)
    \n-
    150 {}
    \n-
    \n-
    151
    \n-
    \n-
    157 MPIGuard (MPIHelper & m, bool active=true) :
    \n-
    158 comm_(GuardCommunicator::create(
    \n-
    159 m.getCommunication())),
    \n-
    160 active_(active)
    \n-
    161 {}
    \n-
    \n-
    162
    \n-
    173 template <class C>
    \n-
    \n-
    174 MPIGuard (const C & comm, bool active=true) :
    \n-
    175 comm_(GuardCommunicator::create(comm)),
    \n-
    176 active_(active)
    \n-
    177 {}
    \n-
    \n-
    178
    \n-
    179#if HAVE_MPI
    \n-
    \n-
    180 MPIGuard (const MPI_Comm & comm, bool active=true) :
    \n-
    181 comm_(GuardCommunicator::create(comm)),
    \n-
    182 active_(active)
    \n-
    183 {}
    \n-
    \n-
    184#endif
    \n-
    185
    \n-
    \n-\n-
    189 {
    \n-
    190 if (active_)
    \n-
    191 {
    \n-
    192 active_ = false;
    \n-
    193 finalize(false);
    \n-
    194 }
    \n-
    195 delete comm_;
    \n-
    196 }
    \n-
    \n-
    197
    \n-
    \n-
    202 void reactivate() {
    \n-
    203 if (active_ == true)
    \n-
    204 finalize();
    \n-
    205 active_ = true;
    \n-
    206 }
    \n-
    \n-
    207
    \n-
    \n-
    218 void finalize(bool success = true)
    \n-
    219 {
    \n-
    220 int result = success ? 0 : 1;
    \n-
    221 bool was_active = active_;
    \n-
    222 active_ = false;
    \n-
    223 result = comm_->sum(result);
    \n-
    224 if (result>0 && was_active)
    \n-
    225 {
    \n-
    226 DUNE_THROW(MPIGuardError, "Terminating process "
    \n-
    227 << comm_->rank() << " due to "
    \n-
    228 << result << " remote error(s)");
    \n-
    229 }
    \n-
    230 }
    \n-
    \n-
    231 };
    \n-
    \n-
    232
    \n-
    233}
    \n-
    234
    \n-
    235#endif // DUNE_COMMON_MPIGUARD_HH
    \n-
    Implements an utility class that provides collective communication methods for sequential programs.
    \n-
    Helpers for dealing with MPI.
    \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+
    6#include <utility>
    \n+
    7
    \n+
    8#warning dune/common/std/utility.hh is deprecated and will be removed after Dune 2.8.\\
    \n+
    9 Include <utility> instead
    \n+
    10
    \n+
    11namespace Dune
    \n+
    12{
    \n+
    13
    \n+
    14 namespace Std
    \n+
    15 {
    \n+
    16
    \n+
    17 using std::integer_sequence;
    \n+
    18 using std::index_sequence;
    \n+
    19 using std::make_integer_sequence;
    \n+
    20 using std::make_index_sequence;
    \n+
    21 using std::index_sequence_for;
    \n+
    22
    \n+
    23 } // namespace Std
    \n+
    24
    \n+
    25} // namespace Dune
    \n+
    26
    \n+
    27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH
    \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:99
    \n-
    detects a thrown exception and communicates to all other processes
    Definition mpiguard.hh:134
    \n-
    void reactivate()
    reactivate the guard.
    Definition mpiguard.hh:202
    \n-
    void finalize(bool success=true)
    stop the guard.
    Definition mpiguard.hh:218
    \n-
    ~MPIGuard()
    destroy the guard and check for undetected exceptions
    Definition mpiguard.hh:188
    \n-
    MPIGuard(const C &comm, bool active=true)
    create an MPIGuard operating on an arbitrary communicator.
    Definition mpiguard.hh:174
    \n-
    MPIGuard(const MPI_Comm &comm, bool active=true)
    Definition mpiguard.hh:180
    \n-
    MPIGuard(bool active=true)
    create an MPIGuard operating on the Communicator of the global Dune::MPIHelper
    Definition mpiguard.hh:146
    \n-
    MPIGuard(MPIHelper &m, bool active=true)
    create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m
    Definition mpiguard.hh:157
    \n-
    A real mpi helper.
    Definition mpihelper.hh:179
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,227 +1,43 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bt_\bd\n+utility.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_UTILITY_HH\n+4#define DUNE_COMMON_STD_UTILITY_HH\n 5\n-13#ifndef DUNE_COMMON_MPIGUARD_HH\n-14#define DUNE_COMMON_MPIGUARD_HH\n-15\n-16#include \"_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh\"\n-17#include \"_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-18#include \"_\bm_\bp_\bi_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\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\n-21namespace _\bD_\bu_\bn_\be\n-22{\n-23\n-24#ifndef DOXYGEN\n-25\n-26 /*\n-27 Interface class for the communication needed by MPIGuard\n-28 */\n-29 struct GuardCommunicator\n-30 {\n-31 // cleanup\n-32 virtual ~GuardCommunicator() {};\n-33 // all the communication methods we need\n-34 virtual int rank() = 0;\n-35 virtual int size() = 0;\n-36 virtual int sum(int i) = 0;\n-37 // create a new GuardCommunicator pointer\n-38 template \n-39 static GuardCommunicator * create(const Communication & c);\n-40#if HAVE_MPI\n-41 inline\n-42 static GuardCommunicator * create(const MPI_Comm & c);\n-43#endif\n-44 };\n-45\n-46 namespace {\n-47 /*\n-48 templated implementation of different communication classes\n-49 */\n-50 // the default class will always fail, due to the missing implementation of\n-\"sum\"\n-51 template \n-52 struct GenericGuardCommunicator\n-53 : public GuardCommunicator\n-54 {};\n-55 // specialization for Communication\n-56 template \n-57 struct GenericGuardCommunicator< Communication >\n-58 : public GuardCommunicator\n-59 {\n-60 const Communication comm;\n-61 GenericGuardCommunicator(const Communication & c) :\n-62 comm(c) {}\n-63 int rank() override { return comm.rank(); };\n-64 int size() override { return comm.size(); };\n-65 int sum(int i) override { return comm.sum(i); }\n-66 };\n-67\n-68#if HAVE_MPI\n-69 // specialization for MPI_Comm\n-70 template <>\n-71 struct GenericGuardCommunicator\n-72 : public GenericGuardCommunicator< Communication >\n-73 {\n-74 GenericGuardCommunicator(const MPI_Comm & c) :\n-75 GenericGuardCommunicator< Communication >(\n-76 Communication(c)) {}\n-77 };\n-78#endif\n-79 } // anonymous namespace\n-80\n-81 template\n-82 GuardCommunicator * GuardCommunicator::create(const Communication & comm)\n-83 {\n-84 return new GenericGuardCommunicator< Communication >(comm);\n-85 }\n-86\n-87#if HAVE_MPI\n-88 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm)\n-89 {\n-90 return new GenericGuardCommunicator< Communication >(comm);\n-91 }\n-92#endif\n-93\n-94#endif\n-95\n-_\b9_\b9 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-100\n-_\b1_\b3_\b3 class _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd\n-134 {\n-135 GuardCommunicator * comm_;\n-136 bool active_;\n-137\n-138 // we don't want to copy this class\n-139 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd &);\n-140\n-141 public:\n-_\b1_\b4_\b6 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (bool active=true) :\n-147 comm_(GuardCommunicator::create(\n-148 _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br::getCommunication())),\n-149 active_(active)\n-150 {}\n-151\n-_\b1_\b5_\b7 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br & m, bool active=true) :\n-158 comm_(GuardCommunicator::create(\n-159 m.getCommunication())),\n-160 active_(active)\n-161 {}\n-162\n-173 template \n-_\b1_\b7_\b4 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const C & comm, bool active=true) :\n-175 comm_(GuardCommunicator::create(comm)),\n-176 active_(active)\n-177 {}\n-178\n-179#if HAVE_MPI\n-_\b1_\b8_\b0 _\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd (const MPI_Comm & comm, bool active=true) :\n-181 comm_(GuardCommunicator::create(comm)),\n-182 active_(active)\n-183 {}\n-184#endif\n-185\n-_\b1_\b8_\b8 _\b~_\bM_\bP_\bI_\bG_\bu_\ba_\br_\bd()\n-189 {\n-190 if (active_)\n-191 {\n-192 active_ = false;\n-193 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(false);\n-194 }\n-195 delete comm_;\n-196 }\n-197\n-_\b2_\b0_\b2 void _\br_\be_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be() {\n-203 if (active_ == true)\n-204 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be();\n-205 active_ = true;\n-206 }\n-207\n-_\b2_\b1_\b8 void _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(bool success = true)\n-219 {\n-220 int result = success ? 0 : 1;\n-221 bool was_active = active_;\n-222 active_ = false;\n-223 result = comm_->sum(result);\n-224 if (result>0 && was_active)\n-225 {\n-226 _\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-227 << comm_->rank() << \" due to \"\n-228 << result << \" remote error(s)\");\n-229 }\n-230 }\n-231 };\n-232\n-233}\n-234\n-235#endif // DUNE_COMMON_MPIGUARD_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_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh\n-Helpers for dealing with MPI.\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+6#include \n+7\n+8#warning dune/common/std/utility.hh is deprecated and will be removed after\n+Dune 2.8.\\\n+9 Include instead\n+10\n+11namespace _\bD_\bu_\bn_\be\n+12{\n+13\n+14 namespace Std\n+15 {\n+16\n+17 using std::integer_sequence;\n+18 using std::index_sequence;\n+19 using std::make_integer_sequence;\n+20 using std::make_index_sequence;\n+21 using std::index_sequence_for;\n+22\n+23 } // namespace Std\n+24\n+25} // namespace Dune\n+26\n+27#endif // #ifndef DUNE_COMMON_STD_UTILITY_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:_\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:99\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:134\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:202\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:218\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:188\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:174\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:180\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:146\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:157\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:179\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: plocalindex.hh File Reference\n+dune-common: variant.hh File Reference\n \n \n \n \n \n \n \n@@ -65,67 +65,36 @@\n
    \n \n \n \n \n \n \n \n+
    variant.hh File Reference
    \n \n
    \n-\n-

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

    \n-
    #include "localindex.hh"
    \n-#include "indexset.hh"
    \n-#include "mpitraits.hh"
    \n-#include <iostream>
    \n+
    #include <variant>
    \n
    \n

    Go to the source code of this file.

    \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...
     
    struct  Dune::LocalIndexComparator< ParallelLocalIndex< T > >
     
    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+\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)
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \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
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,51 +1,20 @@\n dune-common\u00a02.9.0\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-#include \"_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\"\n-#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n-#include \"_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-#include \n+ * _\bs_\bt_\bd\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+variant.hh File Reference\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:_\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-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:_\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+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-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/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: plocalindex.hh Source File\n+dune-common: variant.hh Source File\n \n \n \n \n \n \n \n@@ -70,306 +70,48 @@\n \n \n \n \n \n \n \n
    \n-
    plocalindex.hh
    \n+
    variant.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 (C) 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_PLOCALINDEX_HH
    \n-
    7#define DUNE_PLOCALINDEX_HH
    \n-
    8
    \n-
    9#include "localindex.hh"
    \n-
    10#include "indexset.hh"
    \n-
    11#include "mpitraits.hh"
    \n+
    5#ifndef DUNE_COMMON_STD_VARIANT_HH
    \n+
    6#define DUNE_COMMON_STD_VARIANT_HH
    \n+
    7
    \n+
    8#warning dune/common/std/variant.hh is deprecated and will be removed after Dune 2.8.\\
    \n+
    9 Include <variant> instead
    \n+
    10
    \n+
    11#include <variant>
    \n
    12
    \n-
    13#include <iostream>
    \n-
    14
    \n-
    15namespace Dune
    \n-
    16{
    \n-
    17
    \n-
    18
    \n-
    29 template<class T> class ParallelLocalIndex;
    \n-
    30
    \n-
    36 template<class T>
    \n-
    \n-
    37 std::ostream& operator<<(std::ostream& os, const ParallelLocalIndex<T>& index)
    \n-
    38 {
    \n-
    39 os<<"{local="<<index.localIndex_<<", attr="<<T(index.attribute_)<<", public="
    \n-
    40 <<(index.public_ ? true : false)<<"}";
    \n-
    41 return os;
    \n-
    42 }
    \n-
    \n-
    43
    \n-
    47 template<typename T>
    \n-
    \n-\n-
    49 {
    \n-
    50#if HAVE_MPI
    \n-
    51 // friend declaration needed for MPITraits
    \n-
    52 friend struct MPITraits<ParallelLocalIndex<T> >;
    \n-
    53#endif
    \n-
    54 friend std::ostream& operator<<<>(std::ostream& os, const ParallelLocalIndex<T>& index);
    \n-
    55
    \n-
    56 public:
    \n-
    64 typedef T Attribute;
    \n-\n-
    74
    \n-
    83 ParallelLocalIndex(size_t localIndex, const Attribute& attribute, bool isPublic=true);
    \n-\n-
    90
    \n-
    91#if 0
    \n-\n-
    102#endif
    \n-
    103
    \n-
    108 inline const Attribute attribute() const;
    \n-
    109
    \n-
    114 inline void setAttribute(const Attribute& attribute);
    \n-
    115
    \n-
    120 inline size_t local() const;
    \n-
    121
    \n-
    125 inline operator size_t() const;
    \n-
    126
    \n-
    132 inline ParallelLocalIndex<Attribute>& operator=(size_t index);
    \n-
    133
    \n-
    138 inline bool isPublic() const;
    \n-
    139
    \n-
    144 inline LocalIndexState state() const;
    \n-
    145
    \n-
    150 inline void setState(const LocalIndexState& state);
    \n-
    151
    \n-
    152 private:
    \n-
    154 size_t localIndex_;
    \n-
    155
    \n-
    157 char attribute_;
    \n-
    158
    \n-
    160 char public_;
    \n-
    161
    \n-
    168 char state_;
    \n-
    169
    \n-
    170 };
    \n-
    \n-
    171
    \n-
    172 template<typename T>
    \n-
    \n-\n-
    174 const ParallelLocalIndex<T>& p2)
    \n-
    175 {
    \n-
    176 if(p1.local()!=p2.local())
    \n-
    177 return false;
    \n-
    178 if(p1.attribute()!=p2.attribute())
    \n-
    179 return false;
    \n-
    180 if(p1.isPublic()!=p2.isPublic())
    \n-
    181 return false;
    \n-
    182 return true;
    \n-
    183 }
    \n-
    \n-
    184 template<typename T>
    \n-
    \n-\n-
    186 const ParallelLocalIndex<T>& p2)
    \n-
    187 {
    \n-
    188 return !(p1==p2);
    \n-
    189 }
    \n-
    \n-
    190
    \n-
    191
    \n-
    192 template<typename T>
    \n-
    \n-\n-
    194 {
    \n-
    \n-
    195 static bool compare(const ParallelLocalIndex<T>& t1,
    \n-
    196 const ParallelLocalIndex<T>& t2){
    \n-
    197 return t1.attribute()<t2.attribute();
    \n-
    198 }
    \n-
    \n-
    199 };
    \n-
    \n-
    200
    \n-
    201
    \n-
    202#if HAVE_MPI
    \n-
    203
    \n-
    205 template<typename T>
    \n-
    \n-\n-
    207 {
    \n-
    208 public:
    \n-
    209 static MPI_Datatype getType();
    \n-
    210 private:
    \n-
    211 static MPI_Datatype type;
    \n-
    212
    \n-
    213 };
    \n-
    \n-
    214
    \n-
    215#endif
    \n-
    216
    \n-
    217 template<class T>
    \n-
    \n-
    218 ParallelLocalIndex<T>::ParallelLocalIndex(const T& attribute, bool isPublic)
    \n-
    219 : localIndex_(0), attribute_(static_cast<char>(attribute)),
    \n-
    220 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
    \n-
    221 {}
    \n-
    \n-
    222
    \n-
    223
    \n-
    224 template<class T>
    \n-
    \n-
    225 ParallelLocalIndex<T>::ParallelLocalIndex(size_t local, const T& attribute, bool isPublic)
    \n-
    226 : localIndex_(local), attribute_(static_cast<char>(attribute)),
    \n-
    227 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
    \n-
    228 {}
    \n-
    \n-
    229
    \n-
    230 template<class T>
    \n-
    \n-\n-
    232 : localIndex_(0), attribute_(), public_(static_cast<char>(false)),
    \n-
    233 state_(static_cast<char>(VALID))
    \n-
    234 {}
    \n-
    \n-
    235
    \n-
    236 template<class T>
    \n-
    \n-
    237 inline const T ParallelLocalIndex<T>::attribute() const
    \n-
    238 {
    \n-
    239 return T(attribute_);
    \n-
    240 }
    \n-
    \n-
    241
    \n-
    242 template<class T>
    \n-
    243 inline void
    \n-
    \n-\n-
    245 {
    \n-
    246 attribute_ = attribute;
    \n-
    247 }
    \n-
    \n-
    248
    \n-
    249 template<class T>
    \n-
    \n-
    250 inline size_t ParallelLocalIndex<T>::local() const
    \n-
    251 {
    \n-
    252 return localIndex_;
    \n-
    253 }
    \n-
    \n-
    254
    \n-
    255 template<class T>
    \n-
    \n-\n-
    257 {
    \n-
    258 return localIndex_;
    \n-
    259 }
    \n-
    \n-
    260
    \n-
    261 template<class T>
    \n-\n-
    \n-\n-
    264 {
    \n-
    265 localIndex_=index;
    \n-
    266 return *this;
    \n-
    267 }
    \n-
    \n-
    268
    \n-
    269 template<class T>
    \n-
    \n-\n-
    271 {
    \n-
    272 return static_cast<bool>(public_);
    \n-
    273 }
    \n-
    \n-
    274
    \n-
    275 template<class T>
    \n-
    \n-\n-
    277 {
    \n-
    278 return LocalIndexState(state_);
    \n-
    279 }
    \n-
    \n-
    280
    \n-
    281 template<class T>
    \n-
    \n-\n-
    283 {
    \n-
    284 state_=static_cast<char>(state);
    \n-
    285 }
    \n-
    \n-
    286
    \n-
    287#if HAVE_MPI
    \n-
    288
    \n-
    289 template<typename T>
    \n-
    \n-
    290 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::getType()
    \n-
    291 {
    \n-
    292
    \n-
    293 if(type==MPI_DATATYPE_NULL) {
    \n-
    294 int length = 1;
    \n-
    295 MPI_Aint base, disp;
    \n-
    296 MPI_Datatype types[1] = {MPITraits<char>::getType()};
    \n-\n-
    298 MPI_Get_address(&rep, &base);
    \n-
    299 MPI_Get_address(&(rep.attribute_), &disp);
    \n-
    300 disp -= base;
    \n-
    301
    \n-
    302 MPI_Datatype tmp;
    \n-
    303 MPI_Type_create_struct(1, &length, &disp, types, &tmp);
    \n-
    304
    \n-
    305 MPI_Type_create_resized(tmp, 0, sizeof(ParallelLocalIndex<T>), &type);
    \n-
    306 MPI_Type_commit(&type);
    \n-
    307
    \n-
    308 MPI_Type_free(&tmp);
    \n-
    309 }
    \n-
    310 return type;
    \n-
    311 }
    \n-
    \n-
    312
    \n-
    313 template<typename T>
    \n-
    314 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::type = MPI_DATATYPE_NULL;
    \n-
    315
    \n-
    316#endif
    \n-
    317
    \n-
    318
    \n-
    320} // namespace Dune
    \n-
    321
    \n-
    322#endif
    \n-
    Provides classes for use as the local index in ParallelIndexSet.
    \n-
    Traits classes for mapping types onto MPI_Datatype.
    \n-
    Provides a map between global and local indices.
    \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:237
    \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:259
    \n-
    bool isPublic() const
    Check whether the index might also be known other processes.
    Definition plocalindex.hh:270
    \n-
    void setAttribute(const Attribute &attribute)
    Set the attribute of the index.
    Definition plocalindex.hh:244
    \n-
    size_t local() const
    get the local index.
    Definition plocalindex.hh:250
    \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:282
    \n-
    ParallelLocalIndex< Attribute > & operator=(size_t index)
    Assign a new local index.
    Definition plocalindex.hh:263
    \n-
    LocalIndexState state() const
    Get the state.
    Definition plocalindex.hh:276
    \n-
    ParallelLocalIndex()
    Parameterless constructor.
    Definition plocalindex.hh:231
    \n-
    const Attribute attribute() const
    Get the attribute of the index.
    Definition plocalindex.hh:237
    \n-
    @ VALID
    Definition localindex.hh:28
    \n+
    13namespace Dune {
    \n+
    14namespace Std {
    \n+
    15 using std::variant;
    \n+
    16 using std::visit;
    \n+
    17 using std::variant_size;
    \n+
    18 using std::variant_size_v;
    \n+
    19 using std::get;
    \n+
    20 using std::get_if;
    \n+
    21 using std::holds_alternative;
    \n+
    22 using std::monostate;
    \n+
    23}
    \n+
    24}
    \n+
    25
    \n+
    26#endif
    \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:49
    \n-
    T Attribute
    The type of the attributes. Normally this will be an enumeration like.
    Definition plocalindex.hh:64
    \n-
    static bool compare(const ParallelLocalIndex< T > &t1, const ParallelLocalIndex< T > &t2)
    Definition plocalindex.hh:195
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,325 +1,42 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bt_\bd\n+variant.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 (C) 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_PLOCALINDEX_HH\n-7#define DUNE_PLOCALINDEX_HH\n-8\n-9#include \"_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\"\n-10#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n-11#include \"_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n+5#ifndef DUNE_COMMON_STD_VARIANT_HH\n+6#define DUNE_COMMON_STD_VARIANT_HH\n+7\n+8#warning dune/common/std/variant.hh is deprecated and will be removed after\n+Dune 2.8.\\\n+9 Include instead\n+10\n+11#include \n 12\n-13#include \n-14\n-15namespace _\bD_\bu_\bn_\be\n-16{\n-17\n-18\n-29 template class ParallelLocalIndex;\n-30\n-36 template\n-_\b3_\b7 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-38 {\n-39 os<<\"{local=\"<\n-_\b4_\b8 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-49 {\n-50#if HAVE_MPI\n-51 // friend declaration needed for MPITraits\n-52 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-53#endif\n-54 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-55\n-56 public:\n-_\b6_\b4 typedef T _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-73 _\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-74\n-83 _\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-89 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx();\n-90\n-91#if 0\n-101 _\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-102#endif\n-103\n-108 inline const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n-109\n-114 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-115\n-120 inline size_t _\bl_\bo_\bc_\ba_\bl() const;\n-121\n-125 inline operator size_t() const;\n-126\n-132 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-133\n-138 inline bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc() const;\n-139\n-144 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bs_\bt_\ba_\bt_\be() const;\n-145\n-150 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-151\n-152 private:\n-154 size_t localIndex_;\n-155\n-157 char attribute_;\n-158\n-160 char public_;\n-161\n-168 char state_;\n-169\n-170 };\n-171\n-172 template\n-_\b1_\b7_\b3 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-174 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n-175 {\n-176 if(p1._\bl_\bo_\bc_\ba_\bl()!=p2._\bl_\bo_\bc_\ba_\bl())\n-177 return false;\n-178 if(p1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()!=p2._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be())\n-179 return false;\n-180 if(p1._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc()!=p2._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc())\n-181 return false;\n-182 return true;\n-183 }\n-184 template\n-_\b1_\b8_\b5 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-186 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n-187 {\n-188 return !(p1==p2);\n-189 }\n-190\n-191\n-192 template\n-_\b1_\b9_\b3 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-194 {\n-_\b1_\b9_\b5 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-196 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& t2){\n-197 return t1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()\n-_\b2_\b0_\b6 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-207 {\n-208 public:\n-209 static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n-210 private:\n-211 static MPI_Datatype type;\n-212\n-213 };\n-214\n-215#endif\n-216\n-217 template\n-_\b2_\b1_\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(const T& attribute, bool\n-isPublic)\n-219 : localIndex_(0), attribute_(static_cast(attribute)),\n-220 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n-221 {}\n-222\n-223\n-224 template\n-_\b2_\b2_\b5 _\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-226 : localIndex_(local), attribute_(static_cast(attribute)),\n-227 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n-228 {}\n-229\n-230 template\n-_\b2_\b3_\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()\n-232 : localIndex_(0), attribute_(), public_(static_cast(false)),\n-233 state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n-234 {}\n-235\n-236 template\n-_\b2_\b3_\b7 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-238 {\n-239 return T(attribute_);\n-240 }\n-241\n-242 template\n-243 inline void\n-_\b2_\b4_\b4 _\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-245 {\n-246 attribute_ = attribute;\n-247 }\n-248\n-249 template\n-_\b2_\b5_\b0 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-251 {\n-252 return localIndex_;\n-253 }\n-254\n-255 template\n-_\b2_\b5_\b6 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-257 {\n-258 return localIndex_;\n-259 }\n-260\n-261 template\n-262 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_\b3 _\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-264 {\n-265 localIndex_=index;\n-266 return *this;\n-267 }\n-268\n-269 template\n-_\b2_\b7_\b0 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-271 {\n-272 return static_cast(public_);\n-273 }\n-274\n-275 template\n-_\b2_\b7_\b6 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-277 {\n-278 return _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be(state_);\n-279 }\n-280\n-281 template\n-_\b2_\b8_\b2 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-283 {\n-284 state_=static_cast(state);\n-285 }\n-286\n-287#if HAVE_MPI\n-288\n-289 template\n-_\b2_\b9_\b0 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-291 {\n-292\n-293 if(type==MPI_DATATYPE_NULL) {\n-294 int length = 1;\n-295 MPI_Aint base, disp;\n-296 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-297 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> rep;\n-298 MPI_Get_address(&rep, &base);\n-299 MPI_Get_address(&(rep.attribute_), &disp);\n-300 disp -= base;\n-301\n-302 MPI_Datatype tmp;\n-303 MPI_Type_create_struct(1, &length, &disp, types, &tmp);\n-304\n-305 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-306 MPI_Type_commit(&type);\n-307\n-308 MPI_Type_free(&tmp);\n-309 }\n-310 return type;\n-311 }\n-312\n-313 template\n-_\b3_\b1_\b4 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-315\n-316#endif\n-317\n-318\n-320} // namespace Dune\n-321\n-322#endif\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-_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\n-Provides a map between global and local indices.\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:237\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:259\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:270\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:244\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:250\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:282\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:263\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:276\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:231\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:237\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+13namespace _\bD_\bu_\bn_\be {\n+14namespace Std {\n+15 using std::variant;\n+16 using std::visit;\n+17 using std::variant_size;\n+18 using std::variant_size_v;\n+19 using std::get;\n+20 using std::get_if;\n+21 using std::holds_alternative;\n+22 using std::monostate;\n+23}\n+24}\n+25\n+26#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:_\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:49\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:64\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:195\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: future.hh File Reference\n+dune-common: functional.hh File Reference\n \n \n \n \n \n \n \n@@ -65,48 +65,42 @@\n \n \n \n \n \n \n \n
    \n \n-
    future.hh File Reference
    \n+
    functional.hh File Reference
    \n
    \n
    \n-
    #include <memory>
    \n-#include <dune/common/exceptions.hh>
    \n+
    #include <functional>
    \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

    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 >
    struct  Dune::Std::identity
     A function object type whose operator() returns its argument unchanged. 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 Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,25 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bt_\bd\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/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh>\n+functional.hh File Reference\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_\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\n-\u00a0 invalid future. A future is valid until get() 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-\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-\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+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 \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 ===============================================================================\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: future.hh Source File\n+dune-common: functional.hh Source File\n \n \n \n \n \n \n \n@@ -70,254 +70,54 @@\n
    \n \n \n \n \n \n \n
    \n-
    future.hh
    \n+
    functional.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+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
    3// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_FUNCTIONAL_HH
    \n+
    6#define DUNE_COMMON_STD_FUNCTIONAL_HH
    \n
    7
    \n-
    8#include <memory>
    \n-\n-
    10
    \n-
    11namespace Dune{
    \n+
    8#include <functional>
    \n+
    9
    \n+
    10namespace Dune
    \n+
    11{
    \n
    12
    \n-
    \n-\n-
    18 {};
    \n-
    \n-
    19
    \n-
    20 // forward declaration
    \n-
    21 template<class T>
    \n-
    22 class PseudoFuture;
    \n-
    23
    \n-
    27 template<class T>
    \n-
    \n-
    28 class Future{
    \n-
    29 // Future interface:
    \n-
    30 class FutureBase{
    \n-
    31 public:
    \n-
    32 virtual ~FutureBase() = default;
    \n-
    33 virtual void wait() = 0;
    \n-
    34 virtual bool ready() const = 0;
    \n-
    35 virtual bool valid() const = 0;
    \n-
    36 virtual T get() = 0;
    \n-
    37 };
    \n-
    38
    \n-
    39 // model class
    \n-
    40 template<class F>
    \n-
    41 class FutureModel
    \n-
    42 : public FutureBase
    \n-
    43 {
    \n-
    44 F _future;
    \n-
    45 public:
    \n-
    46 FutureModel(F&& f)
    \n-
    47 : _future(std::forward<F>(f))
    \n-
    48 {}
    \n-
    49
    \n-
    50 virtual void wait() override
    \n-
    51 {
    \n-
    52 _future.wait();
    \n-
    53 }
    \n-
    54
    \n-
    55 virtual bool ready() const override
    \n-
    56 {
    \n-
    57 return _future.ready();
    \n-
    58 }
    \n-
    59
    \n-
    60 virtual bool valid() const override
    \n-
    61 {
    \n-
    62 return _future.valid();
    \n-
    63 }
    \n-
    64
    \n-
    65 virtual T get() override{
    \n-
    66 return (T)_future.get();
    \n-
    67 }
    \n-
    68 };
    \n-
    69
    \n-
    70 std::unique_ptr<FutureBase> _future;
    \n-
    71 public:
    \n-
    72 template<class F>
    \n-
    \n-
    73 Future(F&& f)
    \n-
    74 : _future(std::make_unique<FutureModel<F>>(std::forward<F>(f)))
    \n-
    75 {}
    \n-
    \n-
    76
    \n-
    77 template<class U, std::enable_if_t<std::is_same<U,T>::value && !std::is_same<T,void>::value>>
    \n-
    \n-
    78 Future(U&& data)
    \n-
    79 : _future(std::make_unique<FutureModel<PseudoFuture<T>>>(PseudoFuture<T>(std::forward<U>(data))))
    \n-
    80 {}
    \n-
    \n-
    81
    \n-
    82 Future() = default;
    \n-
    83
    \n-
    \n-
    87 void wait(){
    \n-
    88 _future->wait();
    \n-
    89 }
    \n-
    \n-
    90
    \n-
    \n-
    95 T get() {
    \n-
    96 return _future->get();
    \n-
    97 }
    \n-
    \n-
    98
    \n-
    \n-
    103 bool ready() const {
    \n-
    104 return _future->ready();
    \n-
    105 }
    \n-
    \n-
    106
    \n-
    \n-
    112 bool valid() const {
    \n-
    113 if(_future)
    \n-
    114 return _future->valid();
    \n-
    115 return false;
    \n-
    116 }
    \n-
    \n-
    117 };
    \n-
    \n-
    118
    \n-
    121 template<class T>
    \n-
    \n-\n-
    123 bool valid_;
    \n-
    124 T data_;
    \n-
    125 public:
    \n-
    \n-\n-
    127 valid_(false)
    \n-
    128 {}
    \n-
    \n-
    129
    \n-
    130 template<class U>
    \n-
    \n-\n-
    132 valid_(true),
    \n-
    133 data_(std::forward<U>(u))
    \n-
    134 {}
    \n-
    \n-
    135
    \n-
    \n-
    136 void wait() {
    \n-
    137 if(!valid_)
    \n-
    138 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    139 }
    \n-
    \n-
    140
    \n-
    \n-
    141 bool ready() const {
    \n-
    142 if(!valid_)
    \n-
    143 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    144 return true;
    \n-
    145 }
    \n-
    \n-
    146
    \n-
    \n-
    147 T get() {
    \n-
    148 if(!valid_)
    \n-
    149 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    150 valid_ = false;
    \n-
    151 return std::forward<T>(data_);
    \n-
    152 }
    \n-
    \n-
    153
    \n-
    \n-
    154 bool valid() const {
    \n-
    155 return valid_;
    \n-
    156 }
    \n-
    \n-
    157 };
    \n-
    \n-
    158
    \n-
    159 template<>
    \n-
    \n-
    160 class PseudoFuture<void>{
    \n-
    161 bool valid_;
    \n-
    162 public:
    \n-
    \n-
    163 PseudoFuture(bool valid = false) :
    \n-
    164 valid_(valid)
    \n-
    165 {}
    \n-
    \n-
    166
    \n-
    \n-
    167 void wait(){
    \n-
    168 if(!valid_)
    \n-
    169 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    170 }
    \n-
    \n-
    \n-
    171 bool ready() const{
    \n-
    172 if(!valid_)
    \n-
    173 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    174 return true;
    \n-
    175 }
    \n-
    \n-
    176
    \n-
    \n-
    177 void get(){
    \n-
    178 if(!valid_)
    \n-
    179 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n-
    180 valid_ = false;
    \n-
    181 }
    \n-
    \n-
    182
    \n-
    \n-
    183 bool valid() const{
    \n-
    184 return valid_;
    \n-
    185 }
    \n-
    \n-
    186 };
    \n-
    \n-
    187}
    \n-
    188
    \n-
    189#endif
    \n-
    A few common exception classes.
    \n-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    STL namespace.
    \n+
    13 namespace Std
    \n+
    14 {
    \n+
    15
    \n+
    22#if DUNE_HAVE_CXX_STD_IDENTITY
    \n+
    23 using std::identity;
    \n+
    24#else //DUNE_HAVE_CXX_STD_IDENTITY
    \n+
    \n+
    25 struct identity {
    \n+
    26 template<class T>
    \n+
    27 constexpr T&& operator()(T&& t ) const noexcept {return std::forward<T>(t);}
    \n+
    28 };
    \n+
    \n+
    29#endif
    \n+
    30 } // namespace Std
    \n+
    31
    \n+
    32} // namespace Dune
    \n+
    33
    \n+
    34#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_HH
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
    Definition propertymap.hh:84
    \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:18
    \n-
    A wrapper-class for a object which is ready immediately.
    Definition future.hh:122
    \n-
    bool ready() const
    Definition future.hh:141
    \n-
    T get()
    Definition future.hh:147
    \n-
    PseudoFuture(U &&u)
    Definition future.hh:131
    \n-
    PseudoFuture()
    Definition future.hh:126
    \n-
    void wait()
    Definition future.hh:136
    \n-
    bool valid() const
    Definition future.hh:154
    \n-
    Type-erasure for future-like objects. A future-like object is a object satisfying the interface of Fu...
    Definition future.hh:28
    \n-
    bool ready() const
    Definition future.hh:103
    \n-
    void wait()
    wait until the future is ready
    Definition future.hh:87
    \n-
    Future(U &&data)
    Definition future.hh:78
    \n-
    T get()
    Waits until the future is ready and returns the resulting value.
    Definition future.hh:95
    \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:112
    \n-
    Future(F &&f)
    Definition future.hh:73
    \n-
    bool ready() const
    Definition future.hh:171
    \n-
    bool valid() const
    Definition future.hh:183
    \n-
    void get()
    Definition future.hh:177
    \n-
    PseudoFuture(bool valid=false)
    Definition future.hh:163
    \n-
    void wait()
    Definition future.hh:167
    \n+
    A function object type whose operator() returns its argument unchanged.
    Definition functional.hh:25
    \n+
    constexpr T && operator()(T &&t) const noexcept
    Definition functional.hh:27
    \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,264 +1,49 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bt_\bd\n+functional.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+1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+2// vi: set ts=8 sw=2 et sts=2:\n 3// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_FUNCTIONAL_HH\n+6#define DUNE_COMMON_STD_FUNCTIONAL_HH\n 7\n-8#include \n-9#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-10\n-11namespace _\bD_\bu_\bn_\be{\n+8#include \n+9\n+10namespace _\bD_\bu_\bn_\be\n+11{\n 12\n-_\b1_\b7 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-18 {};\n-19\n-20 // forward declaration\n-21 template\n-22 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be;\n-23\n-27 template\n-_\b2_\b8 class _\bF_\bu_\bt_\bu_\br_\be{\n-29 // Future interface:\n-30 class FutureBase{\n-31 public:\n-32 virtual ~FutureBase() = default;\n-33 virtual void wait() = 0;\n-34 virtual bool ready() const = 0;\n-35 virtual bool valid() const = 0;\n-36 virtual T _\bg_\be_\bt() = 0;\n-37 };\n-38\n-39 // model class\n-40 template\n-41 class FutureModel\n-42 : public FutureBase\n-43 {\n-44 F _future;\n-45 public:\n-46 FutureModel(F&& f)\n-47 : _future(std::forward(f))\n-48 {}\n-49\n-50 virtual void wait() override\n-51 {\n-52 _future.wait();\n-53 }\n-54\n-55 virtual bool ready() const override\n-56 {\n-57 return _future.ready();\n-58 }\n-59\n-60 virtual bool valid() const override\n-61 {\n-62 return _future.valid();\n-63 }\n-64\n-65 virtual T _\bg_\be_\bt() override{\n-66 return (T)_future.get();\n-67 }\n-68 };\n-69\n-70 std::unique_ptr _future;\n-71 public:\n-72 template\n-_\b7_\b3 _\bF_\bu_\bt_\bu_\br_\be(F&& f)\n-74 : _future(_\bs_\bt_\bd::make_unique>(_\bs_\bt_\bd::forward(f)))\n-75 {}\n-76\n-77 template::value && !std::\n-is_same::value>>\n-_\b7_\b8 _\bF_\bu_\bt_\bu_\br_\be(U&& data)\n-79 : _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-80 {}\n-81\n-_\b8_\b2 _\bF_\bu_\bt_\bu_\br_\be() = default;\n-83\n-_\b8_\b7 void _\bw_\ba_\bi_\bt(){\n-88 _future->wait();\n-89 }\n-90\n-_\b9_\b5 T _\bg_\be_\bt() {\n-96 return _future->get();\n-97 }\n-98\n-_\b1_\b0_\b3 bool _\br_\be_\ba_\bd_\by() const {\n-104 return _future->ready();\n-105 }\n-106\n-_\b1_\b1_\b2 bool _\bv_\ba_\bl_\bi_\bd() const {\n-113 if(_future)\n-114 return _future->valid();\n-115 return false;\n-116 }\n-117 };\n-118\n-121 template\n-_\b1_\b2_\b2 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n-123 bool valid_;\n-124 T data_;\n-125 public:\n-_\b1_\b2_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be() :\n-127 valid_(false)\n-128 {}\n-129\n-130 template\n-_\b1_\b3_\b1 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(U&& u) :\n-132 valid_(true),\n-133 data_(_\bs_\bt_\bd::forward(u))\n-134 {}\n-135\n-_\b1_\b3_\b6 void _\bw_\ba_\bi_\bt() {\n-137 if(!valid_)\n-138 _\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-139 }\n-140\n-_\b1_\b4_\b1 bool _\br_\be_\ba_\bd_\by() const {\n-142 if(!valid_)\n-143 _\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-144 return true;\n-145 }\n-146\n-_\b1_\b4_\b7 T _\bg_\be_\bt() {\n-148 if(!valid_)\n-149 _\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-150 valid_ = false;\n-151 return std::forward(data_);\n-152 }\n-153\n-_\b1_\b5_\b4 bool _\bv_\ba_\bl_\bi_\bd() const {\n-155 return valid_;\n-156 }\n-157 };\n-158\n-159 template<>\n-_\b1_\b6_\b0 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n-161 bool valid_;\n-162 public:\n-_\b1_\b6_\b3 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false) :\n-164 valid_(_\bv_\ba_\bl_\bi_\bd)\n-165 {}\n-166\n-_\b1_\b6_\b7 void _\bw_\ba_\bi_\bt(){\n-168 if(!valid_)\n-169 _\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-170 }\n-_\b1_\b7_\b1 bool _\br_\be_\ba_\bd_\by() const{\n-172 if(!valid_)\n-173 _\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-174 return true;\n-175 }\n-176\n-_\b1_\b7_\b7 void _\bg_\be_\bt(){\n-178 if(!valid_)\n-179 _\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-180 valid_ = false;\n-181 }\n-182\n-_\b1_\b8_\b3 bool _\bv_\ba_\bl_\bi_\bd() const{\n-184 return valid_;\n-185 }\n-186 };\n-187}\n-188\n-189#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__\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+13 namespace Std\n+14 {\n+15\n+22#if DUNE_HAVE_CXX_STD_IDENTITY\n+23 using std::identity;\n+24#else //DUNE_HAVE_CXX_STD_IDENTITY\n+_\b2_\b5 struct _\bi_\bd_\be_\bn_\bt_\bi_\bt_\by {\n+26 template\n+_\b2_\b7 constexpr T&& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(T&& t ) const noexcept {return std::forward(t);}\n+28 };\n+29#endif\n+30 } // namespace Std\n+31\n+32} // namespace Dune\n+33\n+34#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_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:_\bg_\be_\bt\n-Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const\n-Key &key)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:84\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:18\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:122\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:141\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:147\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:131\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:126\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:136\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:154\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:28\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:103\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:87\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:78\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:95\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:112\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:73\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:171\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:183\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:177\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:163\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:167\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:25\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: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/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: selection.hh File Reference\n+dune-common: apply.hh File Reference\n \n \n \n \n \n \n \n@@ -65,53 +65,36 @@\n
    \n \n \n \n \n \n \n
    \n \n- \n+
    apply.hh File Reference
    \n
    \n
    \n-\n-

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

    \n-
    #include "indexset.hh"
    \n-#include <dune/common/iteratorfacades.hh>
    \n+
    #include <tuple>
    \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::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...
     
    \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-

    Detailed Description

    \n-

    Provides classes for selecting indices based on attribute flags.

    \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,34 +1,20 @@\n dune-common\u00a02.9.0\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_\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 \"_\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/_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh>\n+ * _\bs_\bt_\bd\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+apply.hh File Reference\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_\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-\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 classes for selecting indices based on attribute flags.\n- Author\n- Markus Blatt\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/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: selection.hh Source File\n+dune-common: apply.hh Source File\n \n \n \n \n \n \n \n@@ -70,322 +70,44 @@\n \n \n \n \n \n \n \n
    \n-
    selection.hh
    \n+
    apply.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 (C) 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_SELECTION_HH
    \n-
    6#define DUNE_SELECTION_HH
    \n+
    5#ifndef DUNE_COMMON_STD_APPLY_HH
    \n+
    6#define DUNE_COMMON_STD_APPLY_HH
    \n
    7
    \n-
    8#include "indexset.hh"
    \n-\n-
    10
    \n-
    11namespace Dune
    \n-
    12{
    \n-
    27 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    29 {
    \n-
    30 public:
    \n-
    39 typedef TS AttributeSet;
    \n-
    40
    \n-\n-
    45
    \n-
    46 //typedef typename ParallelIndexSet::const_iterator ParallelIndexSetIterator;
    \n-
    47
    \n-
    48 typedef ConstArrayListIterator<IndexPair<TG,TL>, N, std::allocator<Dune::IndexPair<TG,TL> > > ParallelIndexSetIterator;
    \n-
    \n-\n-
    55 : iter_(iter), end_(end)
    \n-
    56 {
    \n-
    57 // Step to the first valid entry
    \n-
    58 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute()))
    \n-
    59 ++iter_;
    \n-
    60 }
    \n-
    \n-
    61
    \n-
    \n-\n-
    63 {
    \n-
    64 assert(iter_!=end_);
    \n-
    65 for(++iter_; iter_!=end_; ++iter_)
    \n-
    66 if(AttributeSet::contains(iter_->local().attribute()))
    \n-
    67 break;
    \n-
    68 }
    \n-
    \n-
    69
    \n-
    70
    \n-
    \n-
    71 uint32_t operator*() const
    \n-
    72 {
    \n-
    73 return iter_->local().local();
    \n-
    74 }
    \n-
    \n-
    75
    \n-
    \n-\n-
    77 {
    \n-
    78 return iter_ == other.iter_;
    \n-
    79 }
    \n-
    \n-
    80
    \n-
    \n-\n-
    82 {
    \n-
    83 return iter_ != other.iter_;
    \n-
    84 }
    \n-
    \n-
    85
    \n-
    86 private:
    \n-\n-
    88 const ParallelIndexSetIterator end_;
    \n-
    89 };
    \n-
    \n-
    90
    \n-
    91
    \n-
    95 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    97 {
    \n-
    98 public:
    \n-
    107 typedef TS AttributeSet;
    \n-
    108
    \n-
    112 typedef TG GlobalIndex;
    \n-
    113
    \n-
    120 typedef TL LocalIndex;
    \n-
    121
    \n-\n-
    126
    \n-\n-
    131
    \n-\n-
    136
    \n-
    \n-\n-
    138 : indexSet_()
    \n-
    139 {}
    \n-
    \n-
    140
    \n-
    \n-\n-
    142 : indexSet_(&indexset)
    \n-
    143 {}
    \n-
    \n-
    148 void setIndexSet(const ParallelIndexSet& indexset);
    \n-
    149
    \n-
    153 //const ParallelIndexSet& indexSet() const;
    \n-
    154
    \n-
    159 const_iterator begin() const;
    \n-
    160
    \n-
    165 const_iterator end() const;
    \n-
    166
    \n-
    167
    \n-
    168 private:
    \n-
    169 const ParallelIndexSet* indexSet_;
    \n-
    170
    \n-
    171 };
    \n-
    \n-
    172
    \n-
    176 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    178 {
    \n-
    179 public:
    \n-
    188 typedef TS AttributeSet;
    \n-
    189
    \n-
    193 typedef TG GlobalIndex;
    \n-
    194
    \n-
    201 typedef TL LocalIndex;
    \n-
    202
    \n-\n-
    207
    \n-
    211 typedef uint32_t* iterator;
    \n-
    212
    \n-
    216 typedef uint32_t* const_iterator;
    \n-
    217
    \n-
    \n-\n-
    219 : selected_()
    \n-
    220 {}
    \n-
    \n-
    221
    \n-
    \n-\n-
    223 : selected_(), size_(0), built_(false)
    \n-
    224 {
    \n-
    225 setIndexSet(indexset);
    \n-
    226 }
    \n-
    \n-
    227
    \n-
    228 ~Selection();
    \n-
    229
    \n-
    234 void setIndexSet(const ParallelIndexSet& indexset);
    \n-
    235
    \n-
    239 void free();
    \n-
    240
    \n-
    244 //IndexSet indexSet() const;
    \n-
    245
    \n-
    250 const_iterator begin() const;
    \n-
    251
    \n-
    256 const_iterator end() const;
    \n-
    257
    \n-
    258
    \n-
    259 private:
    \n-
    260 uint32_t* selected_;
    \n-
    261 size_t size_;
    \n-
    262 bool built_;
    \n-
    263
    \n-
    264 };
    \n-
    \n-
    265
    \n-
    266 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    268 {
    \n-
    269 if(built_)
    \n-
    270 free();
    \n-
    271
    \n-
    272 // Count the number of entries the selection has to hold
    \n-\n-
    274 const const_iterator end = indexset.end();
    \n-
    275 int entries = 0;
    \n-
    276
    \n-
    277 for(const_iterator index = indexset.begin(); index != end; ++index)
    \n-
    278 if(AttributeSet::contains(index->local().attribute()))
    \n-
    279 ++entries;
    \n-
    280
    \n-
    281 selected_ = new uint32_t[entries];
    \n-
    282 built_ = true;
    \n-
    283
    \n-
    284 entries = 0;
    \n-
    285 for(const_iterator index = indexset.begin(); index != end; ++index)
    \n-
    286 if(AttributeSet::contains(index->local().attribute()))
    \n-
    287 selected_[entries++]= index->local().local();
    \n-
    288
    \n-
    289 size_=entries;
    \n-
    290 built_=true;
    \n-
    291 }
    \n-
    \n-
    292
    \n-
    293 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    295 {
    \n-
    296 return selected_;
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    299 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    301 {
    \n-
    302 return selected_+size_;
    \n-
    303 }
    \n-
    \n-
    304
    \n-
    305 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    307 {
    \n-
    308 delete[] selected_;
    \n-
    309 size_=0;
    \n-
    310 built_=false;
    \n-
    311 }
    \n-
    \n-
    312
    \n-
    313 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    315 {
    \n-
    316 if(built_)
    \n-
    317 free();
    \n-
    318 }
    \n-
    \n-
    319
    \n-
    320 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    322 {
    \n-
    323 return SelectionIterator<TS,TG,TL,N>(indexSet_->begin(),
    \n-
    324 indexSet_->end());
    \n-
    325 }
    \n-
    \n-
    326
    \n-
    327 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    329 {
    \n-
    330 return SelectionIterator<TS,TG,TL,N>(indexSet_->end(),
    \n-
    331 indexSet_->end());
    \n-
    332 }
    \n-
    \n-
    333 template<typename TS, typename TG, typename TL, int N>
    \n-
    \n-\n-
    335 {
    \n-
    336 indexSet_ = &indexset;
    \n-
    337 }
    \n-
    \n-
    338
    \n-
    342}
    \n-
    343#endif
    \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:328
    \n-
    void setIndexSet(const ParallelIndexSet &indexset)
    Set the index set of the selection.
    Definition selection.hh:267
    \n-
    void setIndexSet(const ParallelIndexSet &indexset)
    Set the index set of the selection.
    Definition selection.hh:334
    \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:300
    \n-
    const_iterator begin() const
    Get the index set we are a selection for.
    Definition selection.hh:294
    \n-
    void free()
    Free allocated memory.
    Definition selection.hh:306
    \n-
    const_iterator begin() const
    Get the index set we are a selection for.
    Definition selection.hh:321
    \n-
    ~Selection()
    Definition selection.hh:314
    \n+
    8#include <tuple>
    \n+
    9
    \n+
    10namespace Dune
    \n+
    11{
    \n+
    \n+
    12 namespace Std
    \n+
    13 {
    \n+
    14
    \n+
    17 using std::apply;
    \n+
    18
    \n+
    19 } // namespace Std
    \n+
    \n+
    20} // namespace Dune
    \n+
    21
    \n+
    22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    A constant random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:370
    \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:29
    \n-
    ConstArrayListIterator< IndexPair< TG, TL >, N, std::allocator< Dune::IndexPair< TG, TL > > > ParallelIndexSetIterator
    Definition selection.hh:48
    \n-
    void operator++()
    Definition selection.hh:62
    \n-
    uint32_t operator*() const
    Definition selection.hh:71
    \n-
    TS AttributeSet
    The type of the Set of attributes.
    Definition selection.hh:39
    \n-
    Dune::ParallelIndexSet< TG, TL, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:44
    \n-
    SelectionIterator(const ParallelIndexSetIterator &iter, const ParallelIndexSetIterator &end)
    Constructor.
    Definition selection.hh:54
    \n-
    bool operator!=(const SelectionIterator< TS, TG, TL, N > &other) const
    Definition selection.hh:81
    \n-
    bool operator==(const SelectionIterator< TS, TG, TL, N > &other) const
    Definition selection.hh:76
    \n-
    An uncached selection of indices.
    Definition selection.hh:97
    \n-
    UncachedSelection()
    Definition selection.hh:137
    \n-
    SelectionIterator< TS, TG, TL, N > iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:130
    \n-
    TS AttributeSet
    The type of the Set of attributes.
    Definition selection.hh:107
    \n-
    iterator const_iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:135
    \n-
    TG GlobalIndex
    The type of the global index of the underlying index set.
    Definition selection.hh:112
    \n-
    UncachedSelection(const ParallelIndexSet &indexset)
    Definition selection.hh:141
    \n-
    Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:125
    \n-
    TL LocalIndex
    The type of the local index of the underlying index set.
    Definition selection.hh:120
    \n-
    A cached selection of indices.
    Definition selection.hh:178
    \n-
    TG GlobalIndex
    The type of the global index of the underlying index set.
    Definition selection.hh:193
    \n-
    Selection(const ParallelIndexSet &indexset)
    Definition selection.hh:222
    \n-
    Selection()
    Definition selection.hh:218
    \n-
    TL LocalIndex
    The type of the local index of the underlying index set.
    Definition selection.hh:201
    \n-
    TS AttributeSet
    The type of the set of attributes.
    Definition selection.hh:188
    \n-
    uint32_t * iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:211
    \n-
    uint32_t * const_iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:216
    \n-
    Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:206
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,386 +1,35 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bt_\bd\n+apply.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 (C) 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_SELECTION_HH\n-6#define DUNE_SELECTION_HH\n+5#ifndef DUNE_COMMON_STD_APPLY_HH\n+6#define DUNE_COMMON_STD_APPLY_HH\n 7\n-8#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n-9#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-10\n-11namespace _\bD_\bu_\bn_\be\n-12{\n-27 template\n-_\b2_\b8 class _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-29 {\n-30 public:\n-_\b3_\b9 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n-40\n-_\b4_\b4 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-45\n-46 //typedef typename ParallelIndexSet::const_iterator\n-ParallelIndexSetIterator;\n-47\n-_\b4_\b8 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_\b4 _\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-55 : iter_(iter), end_(end)\n-56 {\n-57 // Step to the first valid entry\n-58 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute()))\n-59 ++iter_;\n-60 }\n-61\n-_\b6_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-63 {\n-64 assert(iter_!=end_);\n-65 for(++iter_; iter_!=end_; ++iter_)\n-66 if(AttributeSet::contains(iter_->local().attribute()))\n-67 break;\n-68 }\n-69\n-70\n-_\b7_\b1 uint32_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n-72 {\n-73 return iter_->local().local();\n-74 }\n-75\n-_\b7_\b6 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-77 {\n-78 return iter_ == other.iter_;\n-79 }\n-80\n-_\b8_\b1 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-82 {\n-83 return iter_ != other.iter_;\n-84 }\n-85\n-86 private:\n-87 _\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-88 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-89 };\n-90\n-91\n-95 template\n-_\b9_\b6 class _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-97 {\n-98 public:\n-_\b1_\b0_\b7 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n-108\n-_\b1_\b1_\b2 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-113\n-_\b1_\b2_\b0 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-121\n-_\b1_\b2_\b5 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-126\n-_\b1_\b3_\b0 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-131\n-_\b1_\b3_\b5 typedef _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-136\n-_\b1_\b3_\b7 _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn()\n-138 : indexSet_()\n-139 {}\n-140\n-_\b1_\b4_\b1 _\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-142 : indexSet_(&indexset)\n-143 {}\n-148 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-149\n-153 //const ParallelIndexSet& indexSet() const;\n-154\n-159 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-160\n-165 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-166\n-167\n-168 private:\n-169 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* indexSet_;\n-170\n-171 };\n-172\n-176 template\n-_\b1_\b7_\b7 class _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n-178 {\n-179 public:\n-_\b1_\b8_\b8 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n-189\n-_\b1_\b9_\b3 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-194\n-_\b2_\b0_\b1 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-202\n-_\b2_\b0_\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<_\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-207\n-_\b2_\b1_\b1 typedef uint32_t* _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-212\n-_\b2_\b1_\b6 typedef uint32_t* _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-217\n-_\b2_\b1_\b8 _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn()\n-219 : selected_()\n-220 {}\n-221\n-_\b2_\b2_\b2 _\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-223 : selected_(), size_(0), built_(false)\n-224 {\n-225 _\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(indexset);\n-226 }\n-227\n-228 _\b~_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn();\n-229\n-234 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-235\n-239 void _\bf_\br_\be_\be();\n-240\n-244 //IndexSet indexSet() const;\n-245\n-250 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-251\n-256 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-257\n-258\n-259 private:\n-260 uint32_t* selected_;\n-261 size_t size_;\n-262 bool built_;\n-263\n-264 };\n-265\n-266 template\n-_\b2_\b6_\b7 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-268 {\n-269 if(built_)\n-270 free();\n-271\n-272 // Count the number of entries the selection has to hold\n-273 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-274 const _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br end = indexset._\be_\bn_\bd();\n-275 int entries = 0;\n-276\n-277 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-278 if(AttributeSet::contains(index->local().attribute()))\n-279 ++entries;\n-280\n-281 selected_ = new uint32_t[entries];\n-282 built_ = true;\n-283\n-284 entries = 0;\n-285 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-286 if(AttributeSet::contains(index->local().attribute()))\n-287 selected_[entries++]= index->local().local();\n-288\n-289 size_=entries;\n-290 built_=true;\n-291 }\n-292\n-293 template\n-_\b2_\b9_\b4 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-295 {\n-296 return selected_;\n-297 }\n-298\n-299 template\n-_\b3_\b0_\b0 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-301 {\n-302 return selected_+size_;\n-303 }\n-304\n-305 template\n-_\b3_\b0_\b6 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-307 {\n-308 delete[] selected_;\n-309 size_=0;\n-310 built_=false;\n-311 }\n-312\n-313 template\n-_\b3_\b1_\b4 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-315 {\n-316 if(built_)\n-317 free();\n-318 }\n-319\n-320 template\n-_\b3_\b2_\b1 _\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-322 {\n-323 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-324 indexSet_->end());\n-325 }\n-326\n-327 template\n-_\b3_\b2_\b8 _\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-329 {\n-330 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-331 indexSet_->end());\n-332 }\n-333 template\n-_\b3_\b3_\b4 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-335 {\n-336 indexSet_ = &indexset;\n-337 }\n-338\n-342}\n-343#endif\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:328\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:267\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:334\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:_\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:300\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:294\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:306\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-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:321\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:314\n+8#include \n+9\n+10namespace _\bD_\bu_\bn_\be\n+11{\n+_\b1_\b2 namespace Std\n+13 {\n+14\n+17 using std::apply;\n+18\n+19 } // namespace Std\n+20} // namespace Dune\n+21\n+22#endif // #ifndef DUNE_COMMON_STD_APPLY_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_\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:370\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:29\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:48\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:62\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:71\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:39\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:44\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:54\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:81\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:76\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:97\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: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:_\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:130\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:107\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:135\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:112\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:141\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:125\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:120\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:178\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:193\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:222\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:218\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:201\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:188\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:211\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:216\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:206\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: communication.hh File Reference\n+dune-common: make_array.hh File Reference\n \n \n \n \n \n \n \n@@ -65,71 +65,45 @@\n \n \n \n \n \n \n \n
    \n \n-
    communication.hh File Reference
    \n+
    make_array.hh File Reference
    \n
    \n
    \n-\n-

    Implements an utility class that provides collective communication methods for sequential programs. \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 <array>
    \n+#include <type_traits>
    \n
    \n

    Go to the source code of this file.

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

    \n-Classes

    struct  Dune::No_Comm
     
    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-Typedefs

    template<class T >
    using Dune::CollectiveCommunication = Communication< T >
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \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<typename... Args>
    std::array< typename std::common_type< Args... >::type, sizeof...(Args)> Dune::Std::make_array (const Args &... args)
     Create and initialize an array.
     
    \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-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,49 +1,27 @@\n dune-common\u00a02.9.0\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-#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/_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh>\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+make_array.hh File Reference\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:_\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 _\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-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+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-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-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::array< typename std::common_type< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\ba_\bk_\be_\b__\ba_\br_\br_\ba_\by (const Args &...\n+ Args... >::type, sizeof...(Args)>\u00a0 args)\n+\u00a0 Create and initialize an 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-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/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: communication.hh Source File\n+dune-common: make_array.hh Source File\n \n \n \n \n \n \n \n@@ -70,417 +70,64 @@\n \n \n \n \n \n \n \n
    \n-
    communication.hh
    \n+
    make_array.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 (C) 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+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_MAKE_ARRAY_HH
    \n+
    4#define DUNE_COMMON_STD_MAKE_ARRAY_HH
    \n+
    5
    \n+
    6#include <array>
    \n+
    7#include <type_traits>
    \n+
    8
    \n+
    9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n+
    10#include <experimental/array>
    \n+
    11#endif
    \n+
    12
    \n+
    13#warning make_array.hh is deprecated and will be removed after Dune 2.9. \\
    \n+
    14 Use deduction guide of `std::array` or `std::to_array`.
    \n+
    15
    \n+
    16namespace Dune {
    \n+
    17namespace Std {
    \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-
    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-
    \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-
    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-
    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
    \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:237
    \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:259
    \n+
    19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n+
    20
    \n+
    22 using std::experimental::make_array;
    \n+
    23
    \n+
    24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n+
    25
    \n+
    27
    \n+
    41 template <typename... Args>
    \n+
    42 std::array<typename std::common_type<Args...>::type, sizeof...(Args)>
    \n+
    \n+
    43 make_array(const Args&... args) {
    \n+
    44 std::array<typename std::common_type<Args...>::type, sizeof...(Args)>
    \n+
    45 result = {{args...}};
    \n+
    46 return result;
    \n+
    47 }
    \n+
    \n+
    48
    \n+
    49#endif // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n+
    50
    \n+
    51}
    \n+
    52}
    \n+
    53
    \n+
    54#endif
    \n+
    std::array< typename std::common_type< Args... >::type, sizeof...(Args)> make_array(const Args &... args)
    Create and initialize an array.
    Definition make_array.hh:43
    \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:122
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,480 +1,59 @@\n dune-common\u00a02.9.0\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+ * _\bs_\bt_\bd\n+make_array.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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+2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+3#ifndef DUNE_COMMON_STD_MAKE_ARRAY_HH\n+4#define DUNE_COMMON_STD_MAKE_ARRAY_HH\n+5\n+6#include \n+7#include \n+8\n+9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n+10#include \n+11#endif\n+12\n+13#warning make_array.hh is deprecated and will be removed after Dune 2.9. \\\n+14 Use deduction guide of `std::array` or `std::to_array`.\n+15\n+16namespace _\bD_\bu_\bn_\be {\n+17namespace Std {\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 _\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-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-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-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-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\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:237\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:259\n+19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n+20\n+22 using std::experimental::make_array;\n+23\n+24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n+25\n+27\n+41 template \n+42 std::array::type, sizeof...(Args)>\n+_\b4_\b3 _\bm_\ba_\bk_\be_\b__\ba_\br_\br_\ba_\by(const Args&... args) {\n+44 std::array::type, sizeof...(Args)>\n+45 result = {{args...}};\n+46 return result;\n+47 }\n+48\n+49#endif // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n+50\n+51}\n+52}\n+53\n+54#endif\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\ba_\bk_\be_\b__\ba_\br_\br_\ba_\by\n+std::array< typename std::common_type< Args... >::type, sizeof...(Args)>\n+make_array(const Args &... args)\n+Create and initialize an array.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn make_array.hh:43\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:122\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: mpihelper.hh File Reference\n+dune-common: referencehelper.hh File Reference\n \n \n \n \n \n \n \n@@ -65,72 +65,65 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    mpihelper.hh File Reference
    \n+Namespaces |\n+Typedefs |\n+Functions |\n+Variables
    \n+
    referencehelper.hh File Reference
    \n \n
    \n-\n-

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

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

    Go to the source code of this file.

    \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+\n+\n+\n+\n+\n+

    \n+Typedefs

    template<class T >
    using Dune::ResolveRef_t = std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))>
     Type trait to resolve std::reference_wrapper.
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Functions

    template<class T >
    constexpr T & Dune::resolveRef (T &gf) noexcept
     Helper function to resolve std::reference_wrapper.
     
    template<class T >
    const auto & Dune::resolveRef (T &&gf)=delete
     
    template<class T >
    constexpr T & Dune::resolveRef (std::reference_wrapper< T > gf) noexcept
     Helper function to resolve std::reference_wrapper.
     
    \n+\n+\n+\n+\n+\n

    \n+Variables

    template<class T >
    constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value
     Helper to detect if given type is a std::reference_wrapper.
     
    \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:293
    \n-
    A real mpi helper.
    Definition mpihelper.hh:179
    \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
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,62 +1,40 @@\n dune-common\u00a02.9.0\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-_\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/_\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/_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\by_\b._\bh_\bh>\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+referencehelper.hh File Reference\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:_\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:293\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:179\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+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf_\b__\bt = std::remove_reference_t< decltype(_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf\n+ (std::declval< T & >()))>\n+\u00a0 Type trait to resolve std::reference_wrapper.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+constexpr T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf (T &gf) noexcept\n+\u00a0 Helper function to resolve std::reference_wrapper.\n+\u00a0\n+template\n+ const auto &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf (T &&gf)=delete\n+\u00a0\n+template\n+constexpr T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf (std::reference_wrapper< T > gf) noexcept\n+\u00a0 Helper function to resolve std::reference_wrapper.\n+\u00a0\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+template\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\bW_\br_\ba_\bp_\bp_\be_\br_\b__\bv = Impl::IsReferenceWrapper::value\n+\u00a0 Helper to detect if given type is a std::reference_wrapper.\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/a00098_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00098_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: referencehelper.hh Source File\n \n \n \n \n \n \n \n@@ -70,267 +70,96 @@\n \n \n \n \n \n \n \n
    \n-
    mpihelper.hh
    \n+
    referencehelper.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 (C) 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_MPIHELPER
    \n-
    6#define DUNE_MPIHELPER
    \n+
    5#ifndef DUNE_COMMON_REFERENCE_HELPER_HH
    \n+
    6#define DUNE_COMMON_REFERENCE_HELPER_HH
    \n
    7
    \n-
    8#if HAVE_MPI
    \n-
    9#include <cassert>
    \n-
    10#include <mpi.h>
    \n-
    11#endif
    \n+
    8#include <type_traits>
    \n+
    9#include <functional>
    \n+
    10
    \n+
    11
    \n
    12
    \n-
    13#include <mutex>
    \n+
    13namespace Dune {
    \n
    14
    \n-\n-
    16#if HAVE_MPI
    \n-\n-\n-
    19#endif
    \n-\n-
    21
    \n-
    22namespace Dune
    \n-
    23{
    \n-
    \n-\n-
    74 {
    \n-
    75 public:
    \n-
    80 constexpr static bool isFake = true;
    \n-
    81
    \n-\n-
    86
    \n-
    \n-\n-
    94 {
    \n-
    95 static MPICommunicator comm;
    \n-
    96 return comm;
    \n-
    97 }
    \n-
    \n-
    98
    \n-
    \n-\n-
    106 {
    \n-
    107 return getCommunicator();
    \n-
    108 }
    \n-
    \n-
    109
    \n-
    110
    \n-
    111
    \n-
    117 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n-\n-
    122
    \n-\n-
    \n-\n-
    125 {
    \n-\n-
    127 }
    \n-
    \n-
    128
    \n-
    \n-
    144 DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc,
    \n-
    145 [[maybe_unused]] char** argv)
    \n-
    146 {
    \n-
    147 return instance();
    \n-
    148 }
    \n-
    \n-
    149
    \n-
    \n-\n-
    151 {
    \n-
    152 static FakeMPIHelper singleton;
    \n-
    153 return singleton;
    \n-
    154 }
    \n-
    \n-
    155
    \n-
    159 int rank () const { return 0; }
    \n-
    163 int size () const { return 1; }
    \n-
    164
    \n-
    165 private:
    \n-
    166 FakeMPIHelper() {}
    \n-
    167 FakeMPIHelper(const FakeMPIHelper&);
    \n-
    168 FakeMPIHelper& operator=(const FakeMPIHelper);
    \n-
    169 };
    \n-
    \n-
    170
    \n-
    171#if HAVE_MPI
    \n-
    \n-\n-
    179 {
    \n-
    180 public:
    \n-
    185 constexpr static bool isFake = false;
    \n-
    186
    \n-
    190 typedef MPI_Comm MPICommunicator;
    \n-
    191
    \n-
    \n-\n-
    199 {
    \n-
    200 return MPI_COMM_WORLD;
    \n-
    201 }
    \n+
    15namespace Impl {
    \n+
    16
    \n+
    17 template<class T>
    \n+
    18 class IsReferenceWrapper : public std::false_type {};
    \n+
    19
    \n+
    20 template<class T>
    \n+
    21 class IsReferenceWrapper<std::reference_wrapper<T>> : public std::true_type {};
    \n+
    22
    \n+
    23 template<class T>
    \n+
    24 class IsReferenceWrapper<const std::reference_wrapper<T>> : public std::true_type {};
    \n+
    25
    \n+
    26} // namespace Dune::Impl
    \n+
    27
    \n+
    28
    \n+
    34template<class T>
    \n+
    35constexpr bool IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value;
    \n+
    36
    \n+
    37
    \n+
    46template<class T>
    \n+
    \n+
    47constexpr T& resolveRef(T& gf) noexcept
    \n+
    48{
    \n+
    49 return gf;
    \n+
    50}
    \n+
    \n+
    51
    \n+
    52
    \n+
    53// There's no overload for non std::reference_wrapper r-values,
    \n+
    54// because this may lead to undefined behavior whenever the
    \n+
    55// return value is stored.
    \n+
    56// Notice that deleting the overload is not necessary, but
    \n+
    57// helps to document that it is missing on purpose. It also
    \n+
    58// leads to nicer error messages.
    \n+
    59template<class T>
    \n+
    60const auto& resolveRef(T&& gf) = delete;
    \n+
    61
    \n+
    62
    \n+
    81template<class T>
    \n+
    \n+
    82constexpr T& resolveRef(std::reference_wrapper<T> gf) noexcept
    \n+
    83{
    \n+
    84 return gf.get();
    \n+
    85}
    \n
    \n-
    202
    \n-
    \n-\n-
    210 {
    \n-
    211 return MPI_COMM_SELF;
    \n-
    212 }
    \n-
    \n-
    213
    \n-
    219 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n-\n-\n-
    225
    \n-\n-
    \n-\n-
    228 {
    \n-\n-
    230 }
    \n-
    \n-
    \n-
    246 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
    \n-
    247 {
    \n-
    248 // create singleton instance
    \n-
    249 if (!instance_){
    \n-
    250 static std::mutex mutex;
    \n-
    251 std::lock_guard<std::mutex> guard(mutex);
    \n-
    252 if(!instance_)
    \n-
    253 instance_.reset(new MPIHelper(argc,argv));
    \n-
    254 }
    \n-
    255 return *instance_;
    \n-
    256 }
    \n-
    \n-
    257
    \n-
    \n-\n-
    259 {
    \n-
    260 if(!instance_)
    \n-
    261 DUNE_THROW(InvalidStateException, "MPIHelper not initialized! Call MPIHelper::instance(argc, argv) with arguments first.");
    \n-
    262 return *instance_;
    \n-
    263 }
    \n-
    \n-
    264
    \n-
    268 int rank () const { return rank_; }
    \n-
    272 int size () const { return size_; }
    \n-
    273
    \n-
    \n-\n-
    276 {
    \n-
    277 int wasFinalized = -1;
    \n-
    278 MPI_Finalized( &wasFinalized );
    \n-
    279 if(!wasFinalized && initializedHere_)
    \n-
    280 {
    \n-
    281 MPI_Finalize();
    \n-
    282 dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
    \n-
    283 }
    \n-
    284
    \n-
    285 }
    \n-
    \n-
    286
    \n-
    287 private:
    \n-
    288 int rank_;
    \n-
    289 int size_;
    \n-
    290 bool initializedHere_;
    \n-
    291 void prevent_warning(int){}
    \n-
    292 static inline std::unique_ptr<MPIHelper> instance_ = {};
    \n-
    293
    \n-
    295 MPIHelper(int& argc, char**& argv)
    \n-
    296 : initializedHere_(false)
    \n-
    297 {
    \n-
    298 int wasInitialized = -1;
    \n-
    299 MPI_Initialized( &wasInitialized );
    \n-
    300 if(!wasInitialized)
    \n-
    301 {
    \n-
    302 rank_ = -1;
    \n-
    303 size_ = -1;
    \n-
    304 static int is_initialized = MPI_Init(&argc, &argv);
    \n-
    305 prevent_warning(is_initialized);
    \n-
    306 initializedHere_ = true;
    \n-
    307 }
    \n-
    308
    \n-
    309 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
    \n-
    310 MPI_Comm_size(MPI_COMM_WORLD,&size_);
    \n-
    311
    \n-
    312 assert( rank_ >= 0 );
    \n-
    313 assert( size_ >= 1 );
    \n-
    314
    \n-
    315 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
    \n-
    316 }
    \n-
    317
    \n-
    318 MPIHelper(const MPIHelper&);
    \n-
    319 MPIHelper& operator=(const MPIHelper);
    \n-
    320 };
    \n-
    \n-
    321#else // !HAVE_MPI
    \n-
    322 // We do not have MPI therefore FakeMPIHelper
    \n-
    323 // is the MPIHelper
    \n-
    328 typedef FakeMPIHelper MPIHelper;
    \n-
    329
    \n-
    330#endif // !HAVE_MPI
    \n-
    331
    \n-
    332} // end namespace Dune
    \n-
    333#endif
    \n-
    Standard Dune debug streams.
    \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-
    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-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:116
    \n+
    86
    \n+
    87
    \n+
    88
    \n+
    99template<class T>
    \n+
    100using ResolveRef_t = std::remove_reference_t<decltype(Dune::resolveRef(std::declval<T&>()))>;
    \n+
    101
    \n+
    102
    \n+
    103} // namespace Dune
    \n+
    104
    \n+
    105
    \n+
    106
    \n+
    107#endif // DUNE_COMMON_REFERENCE_HELPER_HH
    \n+
    constexpr bool IsReferenceWrapper_v
    Helper to detect if given type is a std::reference_wrapper.
    Definition referencehelper.hh:35
    \n+
    constexpr T & resolveRef(T &gf) noexcept
    Helper function to resolve std::reference_wrapper.
    Definition referencehelper.hh:47
    \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-
    Definition communication.hh:46
    \n-
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n-
    A fake mpi helper.
    Definition mpihelper.hh:74
    \n-
    static DUNE_EXPORT MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:93
    \n-
    int size() const
    return rank of process, i.e. one
    Definition mpihelper.hh:163
    \n-
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:118
    \n-
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:105
    \n-
    No_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:85
    \n-
    static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:144
    \n-
    static DUNE_EXPORT FakeMPIHelper & instance()
    Definition mpihelper.hh:150
    \n-
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:124
    \n-
    static constexpr bool isFake
    Are we fake (i.e. pretend to have MPI support but are compiled without.)
    Definition mpihelper.hh:80
    \n-
    int rank() const
    return rank of process, i.e. zero
    Definition mpihelper.hh:159
    \n-
    A real mpi helper.
    Definition mpihelper.hh:179
    \n-
    int size() const
    return number of processes
    Definition mpihelper.hh:272
    \n-
    static DUNE_EXPORT MPIHelper & instance()
    Definition mpihelper.hh:258
    \n-
    static constexpr bool isFake
    Are we fake (i. e. pretend to have MPI support but are compiled without.
    Definition mpihelper.hh:185
    \n-
    static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:246
    \n-
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:227
    \n-
    ~MPIHelper()
    calls MPI_Finalize
    Definition mpihelper.hh:275
    \n-
    int rank() const
    return rank of process
    Definition mpihelper.hh:268
    \n-
    MPI_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:190
    \n-
    static MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:198
    \n-
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:209
    \n-
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:221
    \n+
    std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> ResolveRef_t
    Type trait to resolve std::reference_wrapper.
    Definition referencehelper.hh:100
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,314 +1,98 @@\n dune-common\u00a02.9.0\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+referencehelper.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 (C) 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_MPIHELPER\n-6#define DUNE_MPIHELPER\n+5#ifndef DUNE_COMMON_REFERENCE_HELPER_HH\n+6#define DUNE_COMMON_REFERENCE_HELPER_HH\n 7\n-8#if HAVE_MPI\n-9#include \n-10#include \n-11#endif\n+8#include \n+9#include \n+10\n+11\n 12\n-13#include \n+13namespace _\bD_\bu_\bn_\be {\n 14\n-15#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-16#if HAVE_MPI\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_\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/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n-19#endif\n-20#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-21\n-22namespace _\bD_\bu_\bn_\be\n-23{\n-_\b7_\b3 class _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-74 {\n-75 public:\n-_\b8_\b0 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = true;\n-81\n-_\b8_\b5 typedef _\bN_\bo_\b__\bC_\bo_\bm_\bm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+15namespace Impl {\n+16\n+17 template\n+18 class IsReferenceWrapper : public std::false_type {};\n+19\n+20 template\n+21 class IsReferenceWrapper<_\bs_\bt_\bd::reference_wrapper> : public std::true_type\n+{};\n+22\n+23 template\n+24 class IsReferenceWrapper> : public std::\n+true_type {};\n+25\n+26} // namespace Dune::Impl\n+27\n+28\n+34template\n+_\b3_\b5constexpr bool _\bI_\bs_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\bW_\br_\ba_\bp_\bp_\be_\br_\b__\bv = Impl::IsReferenceWrapper::value;\n+36\n+37\n+46template\n+_\b4_\b7constexpr T& _\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf(T& gf) noexcept\n+48{\n+49 return gf;\n+50}\n+51\n+52\n+53// There's no overload for non std::reference_wrapper r-values,\n+54// because this may lead to undefined behavior whenever the\n+55// return value is stored.\n+56// Notice that deleting the overload is not necessary, but\n+57// helps to document that it is missing on purpose. It also\n+58// leads to nicer error messages.\n+59template\n+_\b6_\b0const auto& _\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf(T&& gf) = delete;\n+61\n+62\n+81template\n+_\b8_\b2constexpr T& _\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf(std::reference_wrapper gf) noexcept\n+83{\n+84 return gf.get();\n+85}\n 86\n-_\b9_\b3 _\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-94 {\n-95 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br comm;\n-96 return comm;\n-97 }\n-98\n-_\b1_\b0_\b5 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-106 {\n-107 return _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br();\n-108 }\n-109\n-110\n-111\n-117 [[deprecated(\"getCollectionCommunication is deprecated. Use\n-getCommunication instead.\")]]\n-_\b1_\b1_\b8 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-119 {\n-120 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-121 }\n-122\n-123 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_\b4 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n-125 {\n-126 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-127 }\n-128\n-_\b1_\b4_\b4 _\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-145 [[maybe_unused]] char** argv)\n-146 {\n-147 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n-148 }\n-149\n-_\b1_\b5_\b0 _\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-151 {\n-152 static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br singleton;\n-153 return singleton;\n-154 }\n-155\n-_\b1_\b5_\b9 int _\br_\ba_\bn_\bk () const { return 0; }\n-_\b1_\b6_\b3 int _\bs_\bi_\bz_\be () const { return 1; }\n-164\n-165 private:\n-166 _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br() {}\n-167 FakeMPIHelper(const FakeMPIHelper&);\n-168 FakeMPIHelper& operator=(const FakeMPIHelper);\n-169 };\n-170\n-171#if HAVE_MPI\n-_\b1_\b7_\b8 class _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n-179 {\n-180 public:\n-_\b1_\b8_\b5 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = false;\n-186\n-_\b1_\b9_\b0 typedef MPI_Comm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-191\n-_\b1_\b9_\b8 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-199 {\n-200 return MPI_COMM_WORLD;\n-201 }\n-202\n-_\b2_\b0_\b9 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-210 {\n-211 return MPI_COMM_SELF;\n-212 }\n-213\n-219 [[deprecated(\"getCollectionCommunication is deprecated. Use\n-getCommunication instead.\")]]\n-220 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_\b1 _\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-222 {\n-223 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-224 }\n-225\n-226 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_\b7 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n-228 {\n-229 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-230 }\n-_\b2_\b4_\b6 _\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-247 {\n-248 // create singleton instance\n-249 if (!instance_){\n-250 static std::mutex mutex;\n-251 std::lock_guard guard(mutex);\n-252 if(!instance_)\n-253 instance_.reset(new _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br(argc,argv));\n-254 }\n-255 return *instance_;\n-256 }\n-257\n-_\b2_\b5_\b8 _\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()\n-259 {\n-260 if(!instance_)\n-261 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"MPIHelper not initialized! Call\n-MPIHelper::instance(argc, argv) with arguments first.\");\n-262 return *instance_;\n-263 }\n-264\n-_\b2_\b6_\b8 int _\br_\ba_\bn_\bk () const { return rank_; }\n-_\b2_\b7_\b2 int _\bs_\bi_\bz_\be () const { return size_; }\n-273\n-_\b2_\b7_\b5 _\b~_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br()\n-276 {\n-277 int wasFinalized = -1;\n-278 MPI_Finalized( &wasFinalized );\n-279 if(!wasFinalized && initializedHere_)\n-280 {\n-281 MPI_Finalize();\n-282 _\bd_\bv_\be_\br_\bb << \"Called MPI_Finalize on p=\" << rank_ << \"!\" < instance_ = {};\n-293\n-295 MPIHelper(int& argc, char**& argv)\n-296 : initializedHere_(false)\n-297 {\n-298 int wasInitialized = -1;\n-299 MPI_Initialized( &wasInitialized );\n-300 if(!wasInitialized)\n-301 {\n-302 rank_ = -1;\n-303 size_ = -1;\n-304 static int is_initialized = MPI_Init(&argc, &argv);\n-305 prevent_warning(is_initialized);\n-306 initializedHere_ = true;\n-307 }\n-308\n-309 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);\n-310 MPI_Comm_size(MPI_COMM_WORLD,&size_);\n-311\n-312 assert( rank_ >= 0 );\n-313 assert( size_ >= 1 );\n-314\n-315 _\bd_\bv_\be_\br_\bb << \"Called MPI_Init on p=\" << rank_ << \"!\" << std::endl;\n-316 }\n-317\n-318 MPIHelper(const MPIHelper&);\n-319 MPIHelper& operator=(const MPIHelper);\n-320 };\n-321#else // !HAVE_MPI\n-322 // We do not have MPI therefore FakeMPIHelper\n-323 // is the MPIHelper\n-328 typedef FakeMPIHelper MPIHelper;\n-329\n-330#endif // !HAVE_MPI\n-331\n-332} // end namespace Dune\n-333#endif\n-_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n-Standard Dune debug streams.\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-_\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__\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_\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:116\n+87\n+88\n+99template\n+_\b1_\b0_\b0using _\bR_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf_\b__\bt = std::remove_reference_t()))>;\n+101\n+102\n+103} // namespace Dune\n+104\n+105\n+106\n+107#endif // DUNE_COMMON_REFERENCE_HELPER_HH\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\bW_\br_\ba_\bp_\bp_\be_\br_\b__\bv\n+constexpr bool IsReferenceWrapper_v\n+Helper to detect if given type is a std::reference_wrapper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn referencehelper.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf\n+constexpr T & resolveRef(T &gf) noexcept\n+Helper function to resolve std::reference_wrapper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn referencehelper.hh:47\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:_\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:74\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:93\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:163\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:118\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:105\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:85\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:144\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:150\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:124\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:80\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:159\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:179\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:272\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()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:258\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:185\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:246\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:227\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:275\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:268\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:190\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:198\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:209\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:221\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bo_\bl_\bv_\be_\bR_\be_\bf_\b__\bt\n+std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))>\n+ResolveRef_t\n+Type trait to resolve std::reference_wrapper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn referencehelper.hh:100\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/a00101.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00101.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: collectivecommunication.hh File Reference\n+dune-common: quadmath.hh File Reference\n \n \n \n \n \n \n \n@@ -65,23 +65,22 @@\n
    \n \n \n \n \n \n \n
    \n-
    collectivecommunication.hh File Reference
    \n+
    quadmath.hh File Reference
    \n
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,12 +1,10 @@\n dune-common\u00a02.9.0\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+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 ===============================================================================\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/a00101_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00101_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: quadmath.hh Source File\n \n \n \n \n \n \n \n@@ -70,27 +70,494 @@\n \n \n \n \n \n \n \n
    \n-
    collectivecommunication.hh
    \n+
    quadmath.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_QUADMATH_HH
    \n+
    6#define DUNE_QUADMATH_HH
    \n+
    7
    \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 } // 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+
    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 // 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 // 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 // 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 // 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 DUNE_ASSIGN_OP(*=);
    \n+
    122 DUNE_ASSIGN_OP(/=);
    \n+
    123
    \n+
    124#undef DUNE_ASSIGN_OP
    \n+
    125
    \n+
    126 }; // end class Float128
    \n+
    127
    \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+
    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+
    327
    \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 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 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:248
    \n+
    #define DUNE_UNARY_FUNC(name)
    \n+
    #define DUNE_ASSIGN_OP(OP)
    Definition debugalign.hh:207
    \n+
    Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
    Read a std::tuple.
    Definition streamoperators.hh:43
    \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+
    STL namespace.
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    T max_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:481
    \n+
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:487
    \n+
    auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:447
    \n+
    auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:425
    \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,21 +1,527 @@\n dune-common\u00a02.9.0\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+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// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_QUADMATH_HH\n+6#define DUNE_QUADMATH_HH\n+7\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 } // 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+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 // 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 out << buf;\n+95 return out;\n+96 }\n+97\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 // 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 // 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 _\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#undef DUNE_ASSIGN_OP\n+125\n+126 }; // end class Float128\n+127\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+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+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 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 const bool isneg = (x < 0);\n+364 const bool isnan = (x != x);\n+365 const bool isinf = (isneg ? bool(-x > _\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+_\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__\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:248\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:207\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:_\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+_\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:_\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:481\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:487\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:_\bm_\bi_\bn\n+auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n+&b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:447\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:_\bm_\ba_\bx\n+auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n+&b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:425\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/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: mpicommunication.hh File Reference\n+dune-common: gmpfield.hh File Reference\n \n \n \n \n \n \n \n@@ -65,114 +65,60 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    mpicommunication.hh File Reference
    \n+Namespaces
    \n+
    gmpfield.hh File Reference
    \n \n
    \n \n-

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

    Wrapper for the GNU multiprecision (GMP) library. \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 <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 Classes

    class  Dune::Generic_MPI_Op< Type, BinaryFunction, Enable >
    class  Dune::GMPField< precision >
     Number class for high precision floating point number using the GMP library mpf_class implementation. More...
     
    class  Dune::Communication< MPI_Comm >
     Specialization of Communication for MPI. More...
    struct  Dune::IsNumber< GMPField< precision > >
     
    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-Macros

    #define ComposeMPIOp(func, op)
     
    \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)
     
    \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+

    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,69 +1,40 @@\n dune-common\u00a02.9.0\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_\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 <_\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+_\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 \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:_\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+ 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-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+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-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+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-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+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-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bo_\bs_\be_\bM_\bP_\bI_\bO_\bp (std::multiplies, MPI_PROD)\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-\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+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-\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+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-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+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/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: mpicommunication.hh Source File\n+dune-common: gmpfield.hh Source File\n \n \n \n \n \n \n \n@@ -70,579 +70,145 @@\n \n \n \n \n \n \n \n
    \n-
    mpicommunication.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 (C) 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+
    5#ifndef DUNE_GMPFIELD_HH
    \n+
    6#define DUNE_GMPFIELD_HH
    \n
    7
    \n-
    16#if HAVE_MPI
    \n+
    12#include <iostream>
    \n+
    13#include <string>
    \n+
    14#include <type_traits>
    \n+
    15
    \n+
    16#if HAVE_GMP || DOXYGEN
    \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+
    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-
    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+
    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
    \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-
    128 int rank () const
    \n-
    129 {
    \n-
    130 return me;
    \n-
    131 }
    \n-
    \n-
    132
    \n-
    \n-
    134 int size () const
    \n-
    135 {
    \n-
    136 return procs;
    \n-
    137 }
    \n-
    \n-
    138
    \n-
    140 template<class T>
    \n-
    \n-
    141 int send(const T& data, int dest_rank, int tag) const
    \n-
    142 {
    \n-
    143 auto mpi_data = getMPIData(data);
    \n-
    144 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n-
    145 dest_rank, tag, communicator);
    \n-
    146 }
    \n-
    \n-
    147
    \n-
    149 template<class T>
    \n-
    \n-
    150 MPIFuture<const T> isend(const T&& data, int dest_rank, int tag) const
    \n-
    151 {
    \n-
    152 MPIFuture<const T> future(std::forward<const T>(data));
    \n-
    153 auto mpidata = future.get_mpidata();
    \n-
    154 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n-
    155 dest_rank, tag, communicator, &future.req_);
    \n-
    156 return future;
    \n-
    157 }
    \n-
    \n-
    158
    \n-
    160 template<class T>
    \n-
    \n-
    161 T recv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n-
    162 {
    \n-
    163 T lvalue_data(std::forward<T>(data));
    \n-
    164 auto mpi_data = getMPIData(lvalue_data);
    \n-
    165 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n-
    166 source_rank, tag, communicator, status);
    \n-
    167 return lvalue_data;
    \n-
    168 }
    \n-
    \n-
    169
    \n-
    171 template<class T>
    \n-
    \n-
    172 MPIFuture<T> irecv(T&& data, int source_rank, int tag) const
    \n-
    173 {
    \n-
    174 MPIFuture<T> future(std::forward<T>(data));
    \n-
    175 auto mpidata = future.get_mpidata();
    \n-
    176 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n-
    177 source_rank, tag, communicator, &future.req_);
    \n-
    178 return future;
    \n-
    179 }
    \n-
    \n-
    180
    \n-
    181 template<class T>
    \n-
    \n-
    182 T rrecv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n-
    183 {
    \n-
    184 MPI_Status _status;
    \n-
    185 MPI_Message _message;
    \n-
    186 T lvalue_data(std::forward<T>(data));
    \n-
    187 auto mpi_data = getMPIData(lvalue_data);
    \n-
    188 static_assert(!mpi_data.static_size, "rrecv work only for non-static-sized types.");
    \n-
    189 if(status == MPI_STATUS_IGNORE)
    \n-
    190 status = &_status;
    \n-
    191 MPI_Mprobe(source_rank, tag, communicator, &_message, status);
    \n-
    192 int size;
    \n-
    193 MPI_Get_count(status, mpi_data.type(), &size);
    \n-
    194 mpi_data.resize(size);
    \n-
    195 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message, status);
    \n-
    196 return lvalue_data;
    \n-
    197 }
    \n-
    \n-
    198
    \n-
    200 template<typename T>
    \n-
    \n-
    201 T sum (const T& in) const
    \n-
    202 {
    \n-
    203 T out;
    \n-
    204 allreduce<std::plus<T> >(&in,&out,1);
    \n-
    205 return out;
    \n-
    206 }
    \n-
    \n-
    207
    \n-
    209 template<typename T>
    \n-
    \n-
    210 int sum (T* inout, int len) const
    \n-
    211 {
    \n-
    212 return allreduce<std::plus<T> >(inout,len);
    \n-
    213 }
    \n-
    \n-
    214
    \n-
    216 template<typename T>
    \n-
    \n-
    217 T prod (const T& in) const
    \n-
    218 {
    \n-
    219 T out;
    \n-
    220 allreduce<std::multiplies<T> >(&in,&out,1);
    \n-
    221 return out;
    \n-
    222 }
    \n-
    \n-
    223
    \n-
    225 template<typename T>
    \n-
    \n-
    226 int prod (T* inout, int len) const
    \n-
    227 {
    \n-
    228 return allreduce<std::multiplies<T> >(inout,len);
    \n-
    229 }
    \n-
    \n-
    230
    \n-
    232 template<typename T>
    \n-
    \n-
    233 T min (const T& in) const
    \n-
    234 {
    \n-
    235 T out;
    \n-
    236 allreduce<Min<T> >(&in,&out,1);
    \n-
    237 return out;
    \n-
    238 }
    \n-
    \n-
    239
    \n-
    241 template<typename T>
    \n-
    \n-
    242 int min (T* inout, int len) const
    \n-
    243 {
    \n-
    244 return allreduce<Min<T> >(inout,len);
    \n-
    245 }
    \n-
    \n-
    246
    \n-
    247
    \n-
    249 template<typename T>
    \n-
    \n-
    250 T max (const T& in) const
    \n-
    251 {
    \n-
    252 T out;
    \n-
    253 allreduce<Max<T> >(&in,&out,1);
    \n-
    254 return out;
    \n-
    255 }
    \n-
    \n-
    256
    \n-
    258 template<typename T>
    \n-
    \n-
    259 int max (T* inout, int len) const
    \n-
    260 {
    \n-
    261 return allreduce<Max<T> >(inout,len);
    \n-
    262 }
    \n-
    \n-
    263
    \n-
    \n-
    265 int barrier () const
    \n-
    266 {
    \n-
    267 return MPI_Barrier(communicator);
    \n-
    268 }
    \n-
    \n-
    269
    \n-
    \n-\n-
    272 {
    \n-
    273 MPIFuture<void> future(true); // make a valid MPIFuture<void>
    \n-
    274 MPI_Ibarrier(communicator, &future.req_);
    \n-
    275 return future;
    \n-
    276 }
    \n-
    \n-
    277
    \n-
    278
    \n-
    280 template<typename T>
    \n-
    \n-
    281 int broadcast (T* inout, int len, int root) const
    \n-
    282 {
    \n-
    283 return MPI_Bcast(inout,len,MPITraits<T>::getType(),root,communicator);
    \n-
    284 }
    \n-
    \n-
    285
    \n-
    287 template<class T>
    \n-
    \n-
    288 MPIFuture<T> ibroadcast(T&& data, int root) const{
    \n-
    289 MPIFuture<T> future(std::forward<T>(data));
    \n-
    290 auto mpidata = future.get_mpidata();
    \n-
    291 MPI_Ibcast(mpidata.ptr(),
    \n-
    292 mpidata.size(),
    \n-
    293 mpidata.type(),
    \n-
    294 root,
    \n-
    295 communicator,
    \n-
    296 &future.req_);
    \n-
    297 return future;
    \n-
    298 }
    \n-
    \n-
    299
    \n-
    302 template<typename T>
    \n-
    \n-
    303 int gather (const T* in, T* out, int len, int root) const
    \n-
    304 {
    \n-
    305 return MPI_Gather(const_cast<T*>(in),len,MPITraits<T>::getType(),
    \n-
    306 out,len,MPITraits<T>::getType(),
    \n-
    307 root,communicator);
    \n-
    308 }
    \n-
    \n-
    309
    \n-
    311 template<class TIN, class TOUT = std::vector<TIN>>
    \n-
    \n-
    312 MPIFuture<TOUT, TIN> igather(TIN&& data_in, TOUT&& data_out, int root) const{
    \n-
    313 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    314 auto mpidata_in = future.get_send_mpidata();
    \n-
    315 auto mpidata_out = future.get_mpidata();
    \n-
    316 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());
    \n-
    317 int outlen = (me==root) * mpidata_in.size();
    \n-
    318 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n-
    319 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n-
    320 root, communicator, &future.req_);
    \n-
    321 return future;
    \n-
    322 }
    \n-
    \n-
    323
    \n-
    325 template<typename T>
    \n-
    \n-
    326 int gatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ, int root) const
    \n-
    327 {
    \n-
    328 return MPI_Gatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n-
    329 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n-
    330 root,communicator);
    \n-
    331 }
    \n-
    \n-
    332
    \n-
    335 template<typename T>
    \n-
    \n-
    336 int scatter (const T* sendData, T* recvData, int len, int root) const
    \n-
    337 {
    \n-
    338 return MPI_Scatter(const_cast<T*>(sendData),len,MPITraits<T>::getType(),
    \n-
    339 recvData,len,MPITraits<T>::getType(),
    \n-
    340 root,communicator);
    \n-
    341 }
    \n-
    \n-
    342
    \n-
    344 template<class TIN, class TOUT = TIN>
    \n-
    \n-
    345 MPIFuture<TOUT, TIN> iscatter(TIN&& data_in, TOUT&& data_out, int root) const
    \n-
    346 {
    \n-
    347 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    348 auto mpidata_in = future.get_send_mpidata();
    \n-
    349 auto mpidata_out = future.get_mpidata();
    \n-
    350 int inlen = (me==root) * mpidata_in.size()/procs;
    \n-
    351 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),
    \n-
    352 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),
    \n-
    353 root, communicator, &future.req_);
    \n-
    354 return future;
    \n-
    355 }
    \n-
    \n-
    356
    \n-
    358 template<typename T>
    \n-
    \n-
    359 int scatterv (const T* sendData, int* sendDataLen, int* displ, T* recvData, int recvDataLen, int root) const
    \n-
    360 {
    \n-
    361 return MPI_Scatterv(const_cast<T*>(sendData),sendDataLen,displ,MPITraits<T>::getType(),
    \n-
    362 recvData,recvDataLen,MPITraits<T>::getType(),
    \n-
    363 root,communicator);
    \n-
    364 }
    \n-
    \n-
    365
    \n-
    366
    \n-
    \n-
    367 operator MPI_Comm () const
    \n-
    368 {
    \n-
    369 return communicator;
    \n-
    370 }
    \n-
    \n-
    371
    \n-
    373 template<typename T, typename T1>
    \n-
    \n-
    374 int allgather(const T* sbuf, int count, T1* rbuf) const
    \n-
    375 {
    \n-
    376 return MPI_Allgather(const_cast<T*>(sbuf), count, MPITraits<T>::getType(),
    \n-
    377 rbuf, count, MPITraits<T1>::getType(),
    \n-
    378 communicator);
    \n-
    379 }
    \n-
    \n-
    380
    \n-
    382 template<class TIN, class TOUT = TIN>
    \n-
    \n-
    383 MPIFuture<TOUT, TIN> iallgather(TIN&& data_in, TOUT&& data_out) const
    \n-
    384 {
    \n-
    385 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    386 auto mpidata_in = future.get_send_mpidata();
    \n-
    387 auto mpidata_out = future.get_mpidata();
    \n-
    388 assert(mpidata_in.size()*procs <= mpidata_out.size());
    \n-
    389 int outlen = mpidata_in.size();
    \n-
    390 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n-
    391 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n-
    392 communicator, &future.req_);
    \n-
    393 return future;
    \n-
    394 }
    \n-
    \n-
    395
    \n-
    397 template<typename T>
    \n-
    \n-
    398 int allgatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ) const
    \n-
    399 {
    \n-
    400 return MPI_Allgatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n-
    401 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n-
    402 communicator);
    \n-
    403 }
    \n-
    \n-
    404
    \n-
    406 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    407 int allreduce(Type* inout, int len) const
    \n-
    408 {
    \n-
    409 Type* out = new Type[len];
    \n-
    410 int ret = allreduce<BinaryFunction>(inout,out,len);
    \n-
    411 std::copy(out, out+len, inout);
    \n-
    412 delete[] out;
    \n-
    413 return ret;
    \n-
    414 }
    \n-
    \n-
    415
    \n-
    416 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    417 Type allreduce(Type&& in) const{
    \n-
    418 Type lvalue_data = std::forward<Type>(in);
    \n-
    419 auto data = getMPIData(lvalue_data);
    \n-
    420 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),
    \n-\n-
    422 communicator);
    \n-
    423 return lvalue_data;
    \n-
    424 }
    \n-
    \n-
    425
    \n-
    427 template<class BinaryFunction, class TIN, class TOUT = TIN>
    \n-
    \n-
    428 MPIFuture<TOUT, TIN> iallreduce(TIN&& data_in, TOUT&& data_out) const {
    \n-
    429 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n-
    430 auto mpidata_in = future.get_send_mpidata();
    \n-
    431 auto mpidata_out = future.get_mpidata();
    \n-
    432 assert(mpidata_out.size() == mpidata_in.size());
    \n-
    433 assert(mpidata_out.type() == mpidata_in.type());
    \n-
    434 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),
    \n-
    435 mpidata_out.size(), mpidata_out.type(),
    \n-\n-
    437 communicator, &future.req_);
    \n-
    438 return future;
    \n-
    439 }
    \n-
    \n-
    440
    \n-
    442 template<class BinaryFunction, class T>
    \n-
    \n-
    443 MPIFuture<T> iallreduce(T&& data) const{
    \n-
    444 MPIFuture<T> future(std::forward<T>(data));
    \n-
    445 auto mpidata = future.get_mpidata();
    \n-
    446 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),
    \n-
    447 mpidata.size(), mpidata.type(),
    \n-\n-
    449 communicator, &future.req_);
    \n-
    450 return future;
    \n-
    451 }
    \n-
    \n-
    452
    \n-
    454 template<typename BinaryFunction, typename Type>
    \n-
    \n-
    455 int allreduce(const Type* in, Type* out, int len) const
    \n-
    456 {
    \n-
    457 return MPI_Allreduce(const_cast<Type*>(in), out, len, MPITraits<Type>::getType(),
    \n-\n-
    459 }
    \n-
    \n-
    460
    \n-
    461 private:
    \n-
    462 MPI_Comm communicator;
    \n-
    463 int me;
    \n-
    464 int procs;
    \n-
    465 };
    \n-
    \n-
    466} // namespace dune
    \n-
    467
    \n-
    468#endif // HAVE_MPI
    \n-
    469
    \n-
    470#endif
    \n-\n-
    Traits classes for mapping types onto MPI_Datatype.
    \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-
    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+
    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-
    auto getMPIData(T &t)
    Definition mpidata.hh:43
    \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-
    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:259
    \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:398
    \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:250
    \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:288
    \n-
    MPIFuture< void > ibarrier() const
    Nonblocking barrier.
    Definition mpicommunication.hh:271
    \n-
    MPIFuture< const T > isend(const T &&data, int dest_rank, int tag) const
    Sends the data to the dest_rank nonblocking.
    Definition mpicommunication.hh:150
    \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:161
    \n-
    int barrier() const
    Wait until all processes have arrived at this point in the program.
    Definition mpicommunication.hh:265
    \n-
    int rank() const
    Return rank, is between 0 and size()-1.
    Definition mpicommunication.hh:128
    \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:359
    \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:383
    \n-
    Type allreduce(Type &&in) const
    Definition mpicommunication.hh:417
    \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:210
    \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:281
    \n-
    MPIFuture< T > iallreduce(T &&data) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:443
    \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:201
    \n-
    int allreduce(const Type *in, Type *out, int len) const
    Definition mpicommunication.hh:455
    \n-
    MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:428
    \n-
    int size() const
    Number of processes in set, is greater than 0.
    Definition mpicommunication.hh:134
    \n-
    int gather(const T *in, T *out, int len, int root) const
    Gather arrays on root task.
    Definition mpicommunication.hh:303
    \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:407
    \n-
    T rrecv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
    Definition mpicommunication.hh:182
    \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:336
    \n-
    MPIFuture< T > irecv(T &&data, int source_rank, int tag) const
    Receives the data from the source_rank nonblocking.
    Definition mpicommunication.hh:172
    \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:226
    \n-
    MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const
    Gather arrays on root task nonblocking.
    Definition mpicommunication.hh:312
    \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:233
    \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:345
    \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:326
    \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:242
    \n-
    int allgather(const T *sbuf, int count, T1 *rbuf) const
    Gathers data from all tasks and distribute it to all.
    Definition mpicommunication.hh:374
    \n-
    int send(const T &data, int dest_rank, int tag) const
    Sends the data to the dest_rank.
    Definition mpicommunication.hh:141
    \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:217
    \n-
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:85
    \n-
    auto get_send_mpidata()
    Definition mpifuture.hh:169
    \n-
    auto get_mpidata()
    Definition mpifuture.hh:165
    \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,664 +1,146 @@\n dune-common\u00a02.9.0\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+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 (C) 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+5#ifndef DUNE_GMPFIELD_HH\n+6#define DUNE_GMPFIELD_HH\n 7\n-16#if HAVE_MPI\n+12#include \n+13#include \n+14#include \n+15\n+16#if HAVE_GMP || DOXYGEN\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+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-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+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\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 int _\br_\ba_\bn_\bk () const\n-129 {\n-130 return me;\n-131 }\n-132\n-_\b1_\b3_\b4 int _\bs_\bi_\bz_\be () const\n-135 {\n-136 return procs;\n-137 }\n-138\n-140 template\n-_\b1_\b4_\b1 int _\bs_\be_\bn_\bd(const T& data, int dest_rank, int tag) const\n-142 {\n-143 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n-144 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n-145 dest_rank, tag, communicator);\n-146 }\n-147\n-149 template\n-_\b1_\b5_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bT_\b> _\bi_\bs_\be_\bn_\bd(const T&& data, int dest_rank, int tag) const\n-151 {\n-152 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bT_\b> future(std::forward(data));\n-153 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-154 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),\n-155 dest_rank, tag, communicator, &future.req_);\n-156 return future;\n-157 }\n-158\n-160 template\n-_\b1_\b6_\b1 T _\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n-MPI_STATUS_IGNORE) const\n-162 {\n-163 T lvalue_data(std::forward(data));\n-164 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n-165 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n-166 source_rank, tag, communicator, status);\n-167 return lvalue_data;\n-168 }\n-169\n-171 template\n-_\b1_\b7_\b2 _\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-173 {\n-174 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n-175 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-176 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),\n-177 source_rank, tag, communicator, &future.req_);\n-178 return future;\n-179 }\n-180\n-181 template\n-_\b1_\b8_\b2 T _\br_\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n-MPI_STATUS_IGNORE) const\n-183 {\n-184 MPI_Status _status;\n-185 MPI_Message _message;\n-186 T lvalue_data(std::forward(data));\n-187 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n-188 static_assert(!mpi_data.static_size, \"rrecv work only for non-static-sized\n-types.\");\n-189 if(status == MPI_STATUS_IGNORE)\n-190 status = &_status;\n-191 MPI_Mprobe(source_rank, tag, communicator, &_message, status);\n-192 int _\bs_\bi_\bz_\be;\n-193 MPI_Get_count(status, mpi_data.type(), &_\bs_\bi_\bz_\be);\n-194 mpi_data.resize(_\bs_\bi_\bz_\be);\n-195 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message,\n-status);\n-196 return lvalue_data;\n-197 }\n-198\n-200 template\n-_\b2_\b0_\b1 T _\bs_\bu_\bm (const T& in) const\n-202 {\n-203 T out;\n-204 allreduce >(&in,&out,1);\n-205 return out;\n-206 }\n-207\n-209 template\n-_\b2_\b1_\b0 int _\bs_\bu_\bm (T* inout, int len) const\n-211 {\n-212 return allreduce >(inout,len);\n-213 }\n-214\n-216 template\n-_\b2_\b1_\b7 T _\bp_\br_\bo_\bd (const T& in) const\n-218 {\n-219 T out;\n-220 allreduce >(&in,&out,1);\n-221 return out;\n-222 }\n-223\n-225 template\n-_\b2_\b2_\b6 int _\bp_\br_\bo_\bd (T* inout, int len) const\n-227 {\n-228 return allreduce >(inout,len);\n-229 }\n-230\n-232 template\n-_\b2_\b3_\b3 T _\bm_\bi_\bn (const T& in) const\n-234 {\n-235 T out;\n-236 allreduce >(&in,&out,1);\n-237 return out;\n-238 }\n-239\n-241 template\n-_\b2_\b4_\b2 int _\bm_\bi_\bn (T* inout, int len) const\n-243 {\n-244 return allreduce >(inout,len);\n-245 }\n-246\n-247\n-249 template\n-_\b2_\b5_\b0 T _\bm_\ba_\bx (const T& in) const\n-251 {\n-252 T out;\n-253 allreduce >(&in,&out,1);\n-254 return out;\n-255 }\n-256\n-258 template\n-_\b2_\b5_\b9 int _\bm_\ba_\bx (T* inout, int len) const\n-260 {\n-261 return allreduce >(inout,len);\n-262 }\n-263\n-_\b2_\b6_\b5 int _\bb_\ba_\br_\br_\bi_\be_\br () const\n-266 {\n-267 return MPI_Barrier(communicator);\n-268 }\n-269\n-_\b2_\b7_\b1 _\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-272 {\n-273 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> future(true); // make a valid MPIFuture\n-274 MPI_Ibarrier(communicator, &future.req_);\n-275 return future;\n-276 }\n-277\n-278\n-280 template\n-_\b2_\b8_\b1 int _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt (T* inout, int len, int root) const\n-282 {\n-283 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-284 }\n-285\n-287 template\n-_\b2_\b8_\b8 _\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-289 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n-290 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-291 MPI_Ibcast(mpidata.ptr(),\n-292 mpidata.size(),\n-293 mpidata.type(),\n-294 root,\n-295 communicator,\n-296 &future.req_);\n-297 return future;\n-298 }\n-299\n-302 template\n-_\b3_\b0_\b3 int _\bg_\ba_\bt_\bh_\be_\br (const T* in, T* out, int len, int root) const\n-304 {\n-305 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-306 out,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-307 root,communicator);\n-308 }\n-309\n-311 template>\n-_\b3_\b1_\b2 _\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-313 _\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-314 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-315 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-316 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());\n-317 int outlen = (me==root) * mpidata_in.size();\n-318 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n-319 mpidata_out.ptr(), outlen, mpidata_out.type(),\n-320 root, communicator, &future.req_);\n-321 return future;\n-322 }\n-323\n-325 template\n-_\b3_\b2_\b6 int _\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, int* recvDataLen, int*\n-displ, int root) const\n-327 {\n-328 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-329 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-330 root,communicator);\n-331 }\n-332\n-335 template\n-_\b3_\b3_\b6 int _\bs_\bc_\ba_\bt_\bt_\be_\br (const T* sendData, T* recvData, int len, int root) const\n-337 {\n-338 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-339 recvData,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-340 root,communicator);\n-341 }\n-342\n-344 template\n-_\b3_\b4_\b5 _\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-346 {\n-347 _\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-348 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-349 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-350 int inlen = (me==root) * mpidata_in.size()/procs;\n-351 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),\n-352 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),\n-353 root, communicator, &future.req_);\n-354 return future;\n-355 }\n-356\n-358 template\n-_\b3_\b5_\b9 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-360 {\n-361 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-362 recvData,recvDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n-363 root,communicator);\n-364 }\n-365\n-366\n-_\b3_\b6_\b7 operator MPI_Comm () const\n-368 {\n-369 return communicator;\n-370 }\n-371\n-373 template\n-_\b3_\b7_\b4 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(const T* sbuf, int count, T1* rbuf) const\n-375 {\n-376 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-377 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-378 communicator);\n-379 }\n-380\n-382 template\n-_\b3_\b8_\b3 _\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-384 {\n-385 _\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-386 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-387 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-388 assert(mpidata_in.size()*procs <= mpidata_out.size());\n-389 int outlen = mpidata_in.size();\n-390 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n-391 mpidata_out.ptr(), outlen, mpidata_out.type(),\n-392 communicator, &future.req_);\n-393 return future;\n-394 }\n-395\n-397 template\n-_\b3_\b9_\b8 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-399 {\n-400 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-401 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-402 communicator);\n-403 }\n-404\n-406 template\n-_\b4_\b0_\b7 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type* inout, int len) const\n-408 {\n-409 Type* out = new Type[len];\n-410 int ret = allreduce(inout,out,len);\n-411 std::copy(out, out+len, inout);\n-412 delete[] out;\n-413 return ret;\n-414 }\n-415\n-416 template\n-_\b4_\b1_\b7 Type _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type&& in) const{\n-418 Type lvalue_data = std::forward(in);\n-419 auto data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n-420 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),\n-421 (_\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-422 communicator);\n-423 return lvalue_data;\n-424 }\n-425\n-427 template\n-_\b4_\b2_\b8 _\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-429 _\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-430 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-431 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-432 assert(mpidata_out.size() == mpidata_in.size());\n-433 assert(mpidata_out.type() == mpidata_in.type());\n-434 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),\n-435 mpidata_out.size(), mpidata_out.type(),\n-436 (_\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-437 communicator, &future.req_);\n-438 return future;\n-439 }\n-440\n-442 template\n-_\b4_\b4_\b3 _\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-444 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n-445 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n-446 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),\n-447 mpidata.size(), mpidata.type(),\n-448 (_\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-449 communicator, &future.req_);\n-450 return future;\n-451 }\n-452\n-454 template\n-_\b4_\b5_\b5 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(const Type* in, Type* out, int len) const\n-456 {\n-457 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-458 (_\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-459 }\n-460\n-461 private:\n-462 MPI_Comm communicator;\n-463 int me;\n-464 int procs;\n-465 };\n-466} // namespace dune\n-467\n-468#endif // HAVE_MPI\n-469\n-470#endif\n-_\bm_\bp_\bi_\bf_\bu_\bt_\bu_\br_\be_\b._\bh_\bh\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_\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-_\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+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:_\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:43\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:_\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:259\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:398\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:250\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: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_\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:271\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< const T > isend(const 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:150\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:161\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:265\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: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:_\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:359\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:383\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:417\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:210\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:281\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:443\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:201\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:455\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:428\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:134\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:303\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:407\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:182\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:336\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:172\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:226\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:312\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: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:_\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:345\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:326\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:242\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:374\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:141\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:217\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:85\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:169\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:165\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/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: indexset.hh File Reference\n+dune-common: parametertreeparser.cc File Reference\n \n \n \n \n \n \n \n@@ -65,124 +65,32 @@\n
    \n \n \n \n \n \n \n
    \n- \n- \n+
    parametertreeparser.cc File Reference
    \n
    \n
    \n-\n-

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

    \n-
    #include <algorithm>
    \n-#include <dune/common/arraylist.hh>
    \n-#include <dune/common/exceptions.hh>
    \n+
    #include "parametertreeparser.hh"
    \n+#include <cstdlib>
    \n #include <iostream>
    \n-#include "localindex.hh"
    \n-#include <stdint.h>
    \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-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 >
     
    \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-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-

    Detailed Description

    \n-

    Provides a map between global and local indices.

    \n-
    Author
    Markus Blatt
    \n+#include <ostream>
    \n+#include <string>
    \n+#include <sstream>
    \n+#include <fstream>
    \n+#include <set>
    \n+#include <map>
    \n+#include <algorithm>
    \n+#include <dune/common/exceptions.hh>
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,108 +1,20 @@\n dune-common\u00a02.9.0\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+parametertreeparser.cc File Reference\n+#include \"_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\bp_\ba_\br_\bs_\be_\br_\b._\bh_\bh\"\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/_\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 \n-#include \"_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\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:_\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-\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-\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 ===============================================================================\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: alignedallocator.hh File Reference\n+dune-common: interfaces.hh File Reference\n \n \n \n \n \n \n \n@@ -72,36 +72,38 @@\n
  • dune
  • common
  • \n
    \n \n
    \n \n-
    alignedallocator.hh File Reference
    \n+
    interfaces.hh File Reference
    \n
    \n
    \n-
    #include "mallocallocator.hh"
    \n-#include <cstdlib>
    \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+\n+\n \n

    \n Classes

    class  Dune::AlignedAllocator< T, Alignment >
     Allocators which guarantee alignment of the memory. More...
     
    struct  Dune::AlignedAllocator< T, Alignment >::rebind< U >
    struct  Dune::Cloneable
     An interface class for cloneable objects. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \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,23 +1,24 @@\n dune-common\u00a02.9.0\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-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+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- 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-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+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+*\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/a00113_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: alignedallocator.hh Source File\n+dune-common: interfaces.hh Source File\n \n \n \n \n \n \n \n@@ -74,122 +74,45 @@\n \n
    \n \n
    \n \n
    \n-
    alignedallocator.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 (C) 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+
    5#ifndef DUNE_INTERFACES_HH
    \n+
    6#define DUNE_INTERFACES_HH
    \n
    7
    \n-
    8#include "mallocallocator.hh"
    \n-
    9#include <cstdlib>
    \n-
    10
    \n-
    11
    \n-
    \n-
    12namespace Dune
    \n-
    13{
    \n+
    13namespace Dune {
    \n
    14
    \n-
    22 template<class T, int Alignment = -1>
    \n-
    \n-\n+
    \n+
    16 struct Cloneable {
    \n+
    17
    \n+
    23 virtual Cloneable* clone() const = 0;
    \n
    24
    \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+
    \n+
    26 virtual ~Cloneable()
    \n+
    27 {}
    \n+
    \n+
    28
    \n+
    29 };
    \n+
    \n+
    30
    \n+
    31} // end namespace Dune
    \n+
    32#endif
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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+
    An interface class for cloneable objects.
    Definition interfaces.hh:16
    \n+
    virtual ~Cloneable()
    Destructor.
    Definition interfaces.hh:26
    \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,135 +1,45 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-alignedallocator.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 (C) 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_ALIGNED_ALLOCATOR_HH\n-6#define DUNE_ALIGNED_ALLOCATOR_HH\n+5#ifndef DUNE_INTERFACES_HH\n+6#define DUNE_INTERFACES_HH\n 7\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\n-11\n-_\b1_\b2namespace _\bD_\bu_\bn_\be\n-13{\n+13namespace _\bD_\bu_\bn_\be {\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+_\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-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 size = 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 size = 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, size));\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+_\b2_\b6 virtual _\b~_\bC_\bl_\bo_\bn_\be_\ba_\bb_\bl_\be()\n+27 {}\n+28\n+29 };\n+30\n+31} // end namespace Dune\n+32#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:_\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+_\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()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn interfaces.hh:26\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/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: version.hh File Reference\n+dune-common: alignedallocator.hh File Reference\n \n \n \n \n \n \n \n@@ -70,776 +70,38 @@\n
    \n \n
    \n \n
    \n
    \n-Macros
    \n-
    version.hh File Reference
    \n+Classes |\n+Namespaces
    \n+
    alignedallocator.hh File Reference
    \n \n
    \n-\n-

    Various macros to work with Dune module version numbers. \n-More...

    \n-\n+
    #include "mallocallocator.hh"
    \n+#include <cstdlib>
    \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-Macros

    #define DUNE_VERSION_JOIN(module, type)   module ## _VERSION_ ## type
     Constructs the preprocessor name used in config.h to hold version numbers.
     
    #define DUNE_VERSION_EQUAL(module, major, minor)
     True if 'module' has the version major.minor.
     
    #define DUNE_VERSION_EQUAL_REV(module, major, minor, revision)
     True if 'module' has the version major.minor.revision.
     
    #define DUNE_VERSION_GTE(module, major, minor)
     True if 'module' has the version major.minor or greater.
     
    #define DUNE_VERSION_LT(module, major, minor)    ! DUNE_VERSION_GTE(module,major,minor)
     True if 'module' has a version less than major.minor.
     
    #define DUNE_VERSION_NEWER(module, major, minor)    DUNE_VERSION_GTE(module,major,minor)
     True if 'module' has the version major.minor or newer.
     
    #define DUNE_VERSION_GT(module, major, minor)
     True if 'module' has a version greater than major.minor.
     
    #define DUNE_VERSION_LTE(module, major, minor)    ! DUNE_VERSION_GT(module,major,minor)
     True if 'module' has a version less than or equal to major.minor.
     
    #define DUNE_VERSION_GTE_REV(module, major, minor, revision)
     True if 'module' has the version major.minor.revision or greater.
     
    #define DUNE_VERSION_LT_REV(module, major, minor, revision)    ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
     True if 'module' has a version lower than major.minor.revision.
     
    #define DUNE_VERSION_NEWER_REV(module, major, minor, revision)    DUNE_VERSION_GTE_REV(module,major,minor,revision)
     True if 'module' has the version major.minor.revision or newer.
     
    #define DUNE_VERSION_GT_REV(module, major, minor, revision)
     True if 'module' has a greater version than major.minor.revision.
     
    #define DUNE_VERSION_LTE_REV(module, major, minor, revision)    ! DUNE_VERSION_GT_REV(module,major,minor,revision)
     True if 'module' has a version lower or equal to major.minor.revision.
     
    #define DUNE_VERSION_ID(major, minor, revision)    ((unsigned int)((major << 24) + (minor << 16) + revision))
     Compute a unique uint id from the major, minor, and revision numbers.
     
    #define DUNE_MODULE_VERSION_ID(module)    DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
     Compute a unique uint id for the given module.
     

    \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-

    Various macros to work with Dune module version numbers.

    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_MODULE_VERSION_ID

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_MODULE_VERSION_ID( module)    DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
    \n-
    \n-\n-

    Compute a unique uint id for the given module.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_EQUAL

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_EQUAL( module,
     major,
     minor 
    )
    \n-
    \n-Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \\
    \n-
    (DUNE_VERSION_JOIN(module,MINOR) == minor))
    \n-
    #define DUNE_VERSION_JOIN(module, type)
    Constructs the preprocessor name used in config.h to hold version numbers.
    Definition version.hh:28
    \n-
    \n-

    True if 'module' has the version major.minor.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_EQUAL_REV

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_EQUAL_REV( module,
     major,
     minor,
     revision 
    )
    \n-
    \n-Value:
    ( DUNE_VERSION_EQUAL(module,major,minor) && \\
    \n-
    (DUNE_VERSION_JOIN(module,REVISION) == revision))
    \n-
    #define DUNE_VERSION_EQUAL(module, major, minor)
    True if 'module' has the version major.minor.
    Definition version.hh:44
    \n-
    \n-

    True if 'module' has the version major.minor.revision.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GT

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_GT( module,
     major,
     minor 
    )
    \n-
    \n-Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)))
    \n-
    \n-

    True if 'module' has a version greater than major.minor.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GT_REV

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_GT_REV( module,
     major,
     minor,
     revision 
    )
    \n-
    \n-Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n-
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n-
    && (DUNE_VERSION_JOIN(module,REVISION) > revision)))
    \n-
    \n-

    True if 'module' has a greater version than major.minor.revision.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GTE

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_GTE( module,
     major,
     minor 
    )
    \n-
    \n-Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) >= minor)))
    \n-
    \n-

    True if 'module' has the version major.minor or greater.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GTE_REV

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_GTE_REV( module,
     major,
     minor,
     revision 
    )
    \n-
    \n-Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n-
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n-
    && (DUNE_VERSION_JOIN(module,REVISION) >= revision)))
    \n-
    \n-

    True if 'module' has the version major.minor.revision or greater.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_ID

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_ID( major,
     minor,
     revision 
    )    ((unsigned int)((major << 24) + (minor << 16) + revision))
    \n-
    \n-\n-

    Compute a unique uint id from the major, minor, and revision numbers.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_JOIN

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_JOIN( module,
     type 
    )   module ## _VERSION_ ## type
    \n-
    \n-\n-

    Constructs the preprocessor name used in config.h to hold version numbers.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

    \n-
    Parameters
    \n- \n- \n- \n-
    moduleThe name of the Dune module
    typeThe version number type, one of MAJOR, MINOR, or REVISION
    \n-
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_VERSION_LT

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_LT( module,
     major,
     minor 
    )    ! DUNE_VERSION_GTE(module,major,minor)
    \n-
    \n-\n-

    True if 'module' has a version less than major.minor.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_LT_REV

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_LT_REV( module,
     major,
     minor,
     revision 
    )    ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n-
    \n-\n-

    True if 'module' has a version lower than major.minor.revision.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_LTE

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_LTE( module,
     major,
     minor 
    )    ! DUNE_VERSION_GT(module,major,minor)
    \n-
    \n-\n-

    True if 'module' has a version less than or equal to major.minor.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_LTE_REV

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_LTE_REV( module,
     major,
     minor,
     revision 
    )    ! DUNE_VERSION_GT_REV(module,major,minor,revision)
    \n-
    \n-\n-

    True if 'module' has a version lower or equal to major.minor.revision.

    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_NEWER

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_NEWER( module,
     major,
     minor 
    )    DUNE_VERSION_GTE(module,major,minor)
    \n-
    \n-\n-

    True if 'module' has the version major.minor or newer.

    \n-
    Note
    Deprecated, use DUNE_VERSION_GTE instead.
    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_NEWER_REV

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_VERSION_NEWER_REV( module,
     major,
     minor,
     revision 
    )    DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n-
    \n-\n-

    True if 'module' has the version major.minor.revision or newer.

    \n-
    Note
    Deprecated, use DUNE_VERSION_GTE_REV instead.
    \n-

    For the DUNE core modules you need to use the following module names:

      \n-
    • DUNE_COMMON for dune-common
    • \n-
    • DUNE_GRID for dune-grid
    • \n-
    • DUNE_GEOMETRY for dune-geometry
    • \n-
    • DUNE_ISTL for dune-istl
    • \n-
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n-
    \n-

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

    \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,349 +1,23 @@\n dune-common\u00a02.9.0\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-version.hh File Reference\n-Various macros to work with Dune module version numbers. _\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 _\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__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module, type)\u00a0\u00a0\u00a0module ## _VERSION_ ## type\n-\u00a0 Constructs the preprocessor name used in config.h to hold version\n- numbers.\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+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-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL(module, major, minor)\n-\u00a0 True if 'module' has the version major.minor.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL_\b__\bR_\bE_\bV(module, major, minor, revision)\n-\u00a0 True if 'module' has the version major.minor.revision.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE(module, major, minor)\n-\u00a0 True if 'module' has the version major.minor or greater.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT(module, major, minor)\u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE\n- (module,major,minor)\n-\u00a0 True if 'module' has a version less than major.minor.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bN_\bE_\bW_\bE_\bR(module, major, minor)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE\n- (module,major,minor)\n-\u00a0 True if 'module' has the version major.minor or newer.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT(module, major, minor)\n-\u00a0 True if 'module' has a version greater than major.minor.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT_\bE(module, major, minor)\u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT\n- (module,major,minor)\n-\u00a0 True if 'module' has a version less than or equal to major.minor.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV(module, major, minor, revision)\n-\u00a0 True if 'module' has the version major.minor.revision or greater.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT_\b__\bR_\bE_\bV(module, major, minor, revision)\u00a0\u00a0\u00a0 !\n- _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV(module,major,minor,revision)\n-\u00a0 True if 'module' has a version lower than major.minor.revision.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bN_\bE_\bW_\bE_\bR_\b__\bR_\bE_\bV(module, major, minor, revision)\u00a0\u00a0\u00a0\n- _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV(module,major,minor,revision)\n-\u00a0 True if 'module' has the version major.minor.revision or newer.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\b__\bR_\bE_\bV(module, major, minor, revision)\n-\u00a0 True if 'module' has a greater version than major.minor.revision.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT_\bE_\b__\bR_\bE_\bV(module, major, minor, revision)\u00a0\u00a0\u00a0 !\n- _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\b__\bR_\bE_\bV(module,major,minor,revision)\n-\u00a0 True if 'module' has a version lower or equal to major.minor.revision.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD(major, minor, revision)\u00a0\u00a0\u00a0 ((unsigned int)((major <<\n- 24) + (minor << 16) + revision))\n-\u00a0 Compute a unique uint id from the major, minor, and revision numbers.\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bM_\bO_\bD_\bU_\bL_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD(module)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD( _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n- (module,MAJOR), _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MINOR), _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n- (module,REVISION) )\n-\u00a0 Compute a unique uint id for the given module.\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 macros to work with Dune module version numbers.\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_M\bMO\bOD\bDU\bUL\bLE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_I\bID\bD *\b**\b**\b**\b**\b*\n- \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD\n- ( _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR),\n-#define DUNE_MODULE_VERSION_ID ( \u00a0 module ) _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MINOR),\n- _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION)\n- )\n-Compute a unique uint id for the given module.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_E\bEQ\bQU\bUA\bAL\bL *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_EQUAL ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && \\\n-(_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MINOR) == minor))\n-_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n-#define DUNE_VERSION_JOIN(module, type)\n-Constructs the preprocessor name used in config.h to hold version numbers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn version.hh:28\n-True if 'module' has the version major.minor.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_E\bEQ\bQU\bUA\bAL\bL_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_EQUAL_REV ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor,\n- \u00a0 revision\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-( _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL(module,major,minor) && \\\n-(_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION) == revision))\n-_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL\n-#define DUNE_VERSION_EQUAL(module, major, minor)\n-True if 'module' has the version major.minor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn version.hh:44\n-True if 'module' has the version major.minor.revision.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bT *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_GT ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n-|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n-(module,MINOR) > minor)))\n-True if 'module' has a version greater than major.minor.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bT_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_GT_REV ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor,\n- \u00a0 revision\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n-|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n-(module,MINOR) > minor)) \\\n-|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n-(module,MINOR) == minor) \\\n-&& (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION) > revision)))\n-True if 'module' has a greater version than major.minor.revision.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bTE\bE *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_GTE ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n-|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n-(module,MINOR) >= minor)))\n-True if 'module' has the version major.minor or greater.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bTE\bE_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_GTE_REV ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor,\n- \u00a0 revision\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n-|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n-(module,MINOR) > minor)) \\\n-|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n-(module,MINOR) == minor) \\\n-&& (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION) >= revision)))\n-True if 'module' has the version major.minor.revision or greater.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_I\bID\bD *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_ID ( \u00a0 major,\n- \u00a0 minor,\n- \u00a0 revision\u00a0\n- ) \u00a0\u00a0\u00a0 ((unsigned int)((major << 24) + (minor << 16) +\n- revision))\n-Compute a unique uint id from the major, minor, and revision numbers.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_J\bJO\bOI\bIN\bN *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_JOIN ( \u00a0 module,\n- \u00a0 type\u00a0\n- ) \u00a0\u00a0\u00a0module ## _VERSION_ ## type\n-Constructs the preprocessor name used in config.h to hold version numbers.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n- Parameters\n- module The name of the _\bD_\bu_\bn_\be module\n- type The version number type, one of MAJOR, MINOR, or REVISION\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bT *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_LT ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor\u00a0\n- ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE(module,major,minor)\n-True if 'module' has a version less than major.minor.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bT_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_LT_REV ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor,\n- \u00a0 revision\u00a0\n- ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV\n- (module,major,minor,revision)\n-True if 'module' has a version lower than major.minor.revision.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bTE\bE *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_LTE ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor\u00a0\n- ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT(module,major,minor)\n-True if 'module' has a version less than or equal to major.minor.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bTE\bE_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_LTE_REV ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor,\n- \u00a0 revision\u00a0\n- ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\b__\bR_\bE_\bV\n- (module,major,minor,revision)\n-True if 'module' has a version lower or equal to major.minor.revision.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_N\bNE\bEW\bWE\bER\bR *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_NEWER ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor\u00a0\n- ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE(module,major,minor)\n-True if 'module' has the version major.minor or newer.\n- Note\n- Deprecated, use DUNE_VERSION_GTE instead.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_N\bNE\bEW\bWE\bER\bR_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n-#define DUNE_VERSION_NEWER_REV ( \u00a0 module,\n- \u00a0 major,\n- \u00a0 minor,\n- \u00a0 revision\u00a0\n- ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV\n- (module,major,minor,revision)\n-True if 'module' has the version major.minor.revision or newer.\n- Note\n- Deprecated, use DUNE_VERSION_GTE_REV instead.\n-For the DUNE core modules you need to use the following module names:\n- * DUNE_COMMON for dune-common\n- * DUNE_GRID for dune-grid\n- * DUNE_GEOMETRY for dune-geometry\n- * DUNE_ISTL for dune-istl\n- * DUNE_LOCALFUNCTIONS for dune-localfunctions\n-For external DUNE modules, you should capitalize the name and replace '-' by\n-underscores. For example for the module foo-bar you need to use FOO_BAR as\n-module name in the context of this macro.\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: version.hh Source File\n+dune-common: alignedallocator.hh Source File\n \n \n \n \n \n \n \n@@ -74,107 +74,122 @@\n \n
    \n \n
    \n \n
    \n-
    version.hh
    \n+
    alignedallocator.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 (C) 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_VERSION_HH
    \n-
    6#define DUNE_VERSION_HH
    \n+
    5#ifndef DUNE_ALIGNED_ALLOCATOR_HH
    \n+
    6#define DUNE_ALIGNED_ALLOCATOR_HH
    \n
    7
    \n-
    28#define DUNE_VERSION_JOIN(module,type) module ## _VERSION_ ## type
    \n-
    29
    \n-
    \n-
    44#define DUNE_VERSION_EQUAL(module,major,minor) \\
    \n-
    45 ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \\
    \n-
    46 (DUNE_VERSION_JOIN(module,MINOR) == minor))
    \n-
    \n-
    47
    \n-
    \n-
    62#define DUNE_VERSION_EQUAL_REV(module,major,minor,revision) \\
    \n-
    63 ( DUNE_VERSION_EQUAL(module,major,minor) && \\
    \n-
    64 (DUNE_VERSION_JOIN(module,REVISION) == revision))
    \n-
    \n-
    65
    \n-
    \n-
    80#define DUNE_VERSION_GTE(module,major,minor) \\
    \n-
    81 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    82 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) >= minor)))
    \n-
    \n-
    83
    \n-
    \n-
    98#define DUNE_VERSION_LT(module,major,minor) \\
    \n-
    99 ! DUNE_VERSION_GTE(module,major,minor)
    \n-
    \n-
    100
    \n-
    \n-
    116#define DUNE_VERSION_NEWER(module,major,minor) \\
    \n-
    117 DUNE_VERSION_GTE(module,major,minor)
    \n-
    \n-
    118
    \n-
    \n-
    133#define DUNE_VERSION_GT(module,major,minor) \\
    \n-
    134 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    135 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)))
    \n-
    \n-
    136
    \n-
    \n-
    151#define DUNE_VERSION_LTE(module,major,minor) \\
    \n-
    152 ! DUNE_VERSION_GT(module,major,minor)
    \n-
    \n-
    153
    \n-
    \n-
    168#define DUNE_VERSION_GTE_REV(module,major,minor,revision) \\
    \n-
    169 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    170 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n-
    171 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n-
    172 && (DUNE_VERSION_JOIN(module,REVISION) >= revision)))
    \n-
    \n-
    173
    \n-
    \n-
    188#define DUNE_VERSION_LT_REV(module,major,minor,revision) \\
    \n-
    189 ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n-
    \n-
    190
    \n-
    \n-
    206#define DUNE_VERSION_NEWER_REV(module,major,minor,revision) \\
    \n-
    207 DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n-
    \n-
    208
    \n-
    \n-
    223#define DUNE_VERSION_GT_REV(module,major,minor,revision) \\
    \n-
    224 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n-
    225 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n-
    226 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n-
    227 && (DUNE_VERSION_JOIN(module,REVISION) > revision)))
    \n-
    \n-
    228
    \n-
    \n-
    243#define DUNE_VERSION_LTE_REV(module,major,minor,revision) \\
    \n-
    244 ! DUNE_VERSION_GT_REV(module,major,minor,revision)
    \n-
    \n-
    245
    \n-
    \n-
    260#define DUNE_VERSION_ID(major,minor,revision) \\
    \n-
    261 ((unsigned int)((major << 24) + (minor << 16) + revision))
    \n-
    \n-
    262
    \n-
    \n-
    277#define DUNE_MODULE_VERSION_ID(module) \\
    \n-
    278 DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
    \n-
    \n-
    279
    \n-
    280#endif
    \n+
    8#include "mallocallocator.hh"
    \n+
    9#include <cstdlib>
    \n+
    10
    \n+
    11
    \n+
    \n+
    12namespace Dune
    \n+
    13{
    \n+
    14
    \n+
    22 template<class T, int Alignment = -1>
    \n+
    \n+\n+
    24
    \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+
    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,80 +1,135 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-version.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// -*- 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 (C) 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_VERSION_HH\n-6#define DUNE_VERSION_HH\n+5#ifndef DUNE_ALIGNED_ALLOCATOR_HH\n+6#define DUNE_ALIGNED_ALLOCATOR_HH\n 7\n-_\b2_\b8#define DUNE_VERSION_JOIN(module,type) module ## _VERSION_ ## type\n-29\n-_\b4_\b4#define DUNE_VERSION_EQUAL(module,major,minor) \\\n-45 ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \\\n-46 (DUNE_VERSION_JOIN(module,MINOR) == minor))\n-47\n-_\b6_\b2#define DUNE_VERSION_EQUAL_REV(module,major,minor,revision) \\\n-63 ( DUNE_VERSION_EQUAL(module,major,minor) && \\\n-64 (DUNE_VERSION_JOIN(module,REVISION) == revision))\n-65\n-_\b8_\b0#define DUNE_VERSION_GTE(module,major,minor) \\\n-81 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n-82 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n-(module,MINOR) >= minor)))\n-83\n-_\b9_\b8#define DUNE_VERSION_LT(module,major,minor) \\\n-99 ! DUNE_VERSION_GTE(module,major,minor)\n-100\n-_\b1_\b1_\b6#define DUNE_VERSION_NEWER(module,major,minor) \\\n-117 DUNE_VERSION_GTE(module,major,minor)\n-118\n-_\b1_\b3_\b3#define DUNE_VERSION_GT(module,major,minor) \\\n-134 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n-135 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n-(module,MINOR) > minor)))\n-136\n-_\b1_\b5_\b1#define DUNE_VERSION_LTE(module,major,minor) \\\n-152 ! DUNE_VERSION_GT(module,major,minor)\n-153\n-_\b1_\b6_\b8#define DUNE_VERSION_GTE_REV(module,major,minor,revision) \\\n-169 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n-170 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n-(module,MINOR) > minor)) \\\n-171 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n-(module,MINOR) == minor) \\\n-172 && (DUNE_VERSION_JOIN(module,REVISION) >= revision)))\n-173\n-_\b1_\b8_\b8#define DUNE_VERSION_LT_REV(module,major,minor,revision) \\\n-189 ! DUNE_VERSION_GTE_REV(module,major,minor,revision)\n-190\n-_\b2_\b0_\b6#define DUNE_VERSION_NEWER_REV(module,major,minor,revision) \\\n-207 DUNE_VERSION_GTE_REV(module,major,minor,revision)\n-208\n-_\b2_\b2_\b3#define DUNE_VERSION_GT_REV(module,major,minor,revision) \\\n-224 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n-225 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n-(module,MINOR) > minor)) \\\n-226 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n-(module,MINOR) == minor) \\\n-227 && (DUNE_VERSION_JOIN(module,REVISION) > revision)))\n-228\n-_\b2_\b4_\b3#define DUNE_VERSION_LTE_REV(module,major,minor,revision) \\\n-244 ! DUNE_VERSION_GT_REV(module,major,minor,revision)\n-245\n-_\b2_\b6_\b0#define DUNE_VERSION_ID(major,minor,revision) \\\n-261 ((unsigned int)((major << 24) + (minor << 16) + revision))\n-262\n-_\b2_\b7_\b7#define DUNE_MODULE_VERSION_ID(module) \\\n-278 DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN\n-(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )\n-279\n-280#endif\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\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+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 size = 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 size = 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, size));\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:_\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/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: binaryfunctions.hh File Reference\n+dune-common: typetraits.hh File Reference\n \n \n \n \n \n \n \n@@ -71,40 +71,135 @@\n \n \n \n
    \n \n-
    binaryfunctions.hh File Reference
    \n+Namespaces |\n+Typedefs |\n+Functions
    \n+
    typetraits.hh File Reference
    \n \n
    \n \n-

    helper classes to provide unique types for standard functions \n+

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

    \n-
    #include <algorithm>
    \n+
    #include <complex>
    \n+#include <type_traits>
    \n+#include <utility>
    \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 Classes

    struct  Dune::Min< Type >
    struct  Dune::Empty
     Just an empty class. More...
     
    struct  Dune::Max< Type >
    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::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 Namespaces

    namespace  Dune
     Dune namespace.
     
    \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+Functions

    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

    Detailed Description

    \n-

    helper classes to provide unique types for standard functions

    \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,24 +1,121 @@\n dune-common\u00a02.9.0\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-binaryfunctions.hh File Reference\n-helper classes to provide unique types for standard functions _\bM_\bo_\br_\be_\b._\b._\b.\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 \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_\bi_\bn_\b<_\b _\bT_\by_\bp_\be_\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:_\bM_\ba_\bx_\b<_\b _\bT_\by_\bp_\be_\b _\b>\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:_\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+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\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-helper classes to provide unique types for standard functions\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/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: binaryfunctions.hh Source File\n+dune-common: typetraits.hh Source File\n \n \n \n \n \n \n \n@@ -74,81 +74,411 @@\n \n
    \n \n
    \n
    \n
    \n-
    binaryfunctions.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 (C) 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_BINARYFUNCTIONS_HH
    \n-
    6#define DUNE_BINARYFUNCTIONS_HH
    \n+
    5#ifndef DUNE_TYPETRAITS_HH
    \n+
    6#define DUNE_TYPETRAITS_HH
    \n
    7
    \n-
    12#include <algorithm>
    \n-
    13
    \n-
    14namespace Dune
    \n-
    15{
    \n-
    16 template<typename Type>
    \n-
    \n-
    17 struct Min
    \n-
    18 {
    \n-
    19 using first_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n-
    20
    \n-
    21 using second_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n-
    22
    \n-
    23 using result_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n-
    24
    \n-
    \n-
    25 Type operator()(const Type& t1, const Type& t2) const
    \n-
    26 {
    \n-
    27 using std::min;
    \n-
    28 return min(t1,t2);
    \n-
    29 }
    \n-
    \n-
    30 };
    \n-
    \n+
    8#include <complex>
    \n+
    9#include <type_traits>
    \n+
    10#include <utility>
    \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-
    32 template<typename Type>
    \n-
    \n-
    33 struct Max
    \n-
    34 {
    \n-
    35 using first_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n-
    36
    \n-
    37 using second_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n-
    38
    \n-
    39 using result_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n-
    40
    \n-
    \n-
    41 Type operator()(const Type& t1, const Type& t2) const
    \n-
    42 {
    \n-
    43 using std::max;
    \n-
    44 return max(t1,t2);
    \n-
    45 }
    \n-
    \n-
    46 };
    \n-
    \n-
    47}
    \n-
    48
    \n-
    49#endif
    \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#ifndef DOXYGEN
    \n+
    225
    \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+
    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 template <class Type>
    \n+\n+
    298
    \n+
    300 template <class Type>
    \n+\n+
    302
    \n+
    303
    \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+
    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+
    354 template<class T>
    \n+
    \n+\n+
    356 public decltype(Impl::isTupleOrDerived(std::declval<T*>(), true))
    \n+
    357 {};
    \n+
    \n+
    358
    \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+
    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
    \n+
    401 template<typename... T>
    \n+
    \n+
    402 struct SizeOf
    \n+
    403 : public std::integral_constant<std::size_t,sizeof...(T)>
    \n+
    404 {};
    \n+
    \n+
    405
    \n+
    406
    \n+
    407#ifndef DOXYGEN
    \n+
    408
    \n+
    409 namespace Impl {
    \n+
    410
    \n+
    411 template<class T, T...>
    \n+
    412 struct IntegerSequenceHelper;
    \n+
    413
    \n+
    414 // Helper struct to compute the i-th entry of a std::integer_sequence
    \n+
    415 //
    \n+
    416 // This could also be implemented using std::get<index>(std::make_tuple(t...)).
    \n+
    417 // However, the gcc-6 implementation of std::make_tuple increases the instantiation
    \n+
    418 // depth by 15 levels for each argument, such that the maximal instantiation depth
    \n+
    419 // is easily hit, especially with clang where it is set to 256.
    \n+
    420 template<class T, T head, T... tail>
    \n+
    421 struct IntegerSequenceHelper<T, head, tail...>
    \n+
    422 {
    \n+
    423
    \n+
    424 // get first entry
    \n+
    425 static constexpr auto get(std::integral_constant<std::size_t, 0>)
    \n+
    426 {
    \n+
    427 return std::integral_constant<T, head>();
    \n+
    428 }
    \n+
    429
    \n+
    430 // call get with first entry cut off and decremented index
    \n+
    431 template<std::size_t index,
    \n+
    432 std::enable_if_t<(index > 0) and (index < sizeof...(tail)+1), int> = 0>
    \n+
    433 static constexpr auto get(std::integral_constant<std::size_t, index>)
    \n+
    434 {
    \n+
    435 return IntegerSequenceHelper<T, tail...>::get(std::integral_constant<std::size_t, index-1>());
    \n+
    436 }
    \n+
    437
    \n+
    438 // use static assertion if index exceeds size
    \n+
    439 template<std::size_t index,
    \n+
    440 std::enable_if_t<(index >= sizeof...(tail)+1), int> = 0>
    \n+
    441 static constexpr auto get(std::integral_constant<std::size_t, index>)
    \n+
    442 {
    \n+
    443 static_assert(index < sizeof...(tail)+1, "index used in IntegerSequenceEntry exceed size");
    \n+
    444 }
    \n+
    445 };
    \n+
    446
    \n+
    447 } // end namespace Impl
    \n+
    448
    \n+
    449#endif // DOXYGEN
    \n+
    450
    \n+
    451
    \n+
    461 template<class T, T... t, std::size_t index>
    \n+
    \n+
    462 constexpr auto integerSequenceEntry(std::integer_sequence<T, t...> /*seq*/, std::integral_constant<std::size_t, index> i)
    \n+
    463 {
    \n+
    464 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry exceed size");
    \n+
    465 return Impl::IntegerSequenceHelper<T, t...>::get(i);
    \n+
    466 }
    \n+
    \n+
    467
    \n+
    468
    \n+
    475 template<class IntegerSequence, std::size_t index>
    \n+\n+
    477
    \n+
    478#ifndef DOXYGEN
    \n+
    479
    \n+
    480 template<class T, T... t, std::size_t i>
    \n+
    481 struct IntegerSequenceEntry<std::integer_sequence<T, t...>, i>
    \n+
    482 : public decltype(Impl::IntegerSequenceHelper<T, t...>::get(std::integral_constant<std::size_t, i>()))
    \n+
    483 {};
    \n+
    484
    \n+
    485#endif // DOXYGEN
    \n+
    486
    \n+
    500 template<class T>
    \n+
    501 struct AutonomousValueType { using type = T; };
    \n+
    502
    \n+
    504 template<class T>
    \n+\n+
    506
    \n+
    508 template<class T>
    \n+\n+
    510
    \n+
    512 template<class T>
    \n+\n+
    514
    \n+
    516 template<class T>
    \n+
    517 struct AutonomousValueType<volatile T> : AutonomousValueType<T> {};
    \n+
    518
    \n+
    520 template<>
    \n+
    \n+
    521 struct AutonomousValueType<std::vector<bool>::reference>
    \n+
    522 {
    \n+
    523 using type = bool;
    \n+
    524 };
    \n+
    \n+
    525
    \n+
    527 template<class T>
    \n+
    528 struct AutonomousValueType<volatile const T> : AutonomousValueType<T> {};
    \n+
    529
    \n+
    557 template<class T>
    \n+\n+
    559
    \n+
    641 template<class T>
    \n+
    \n+\n+
    643 {
    \n+
    644 return v;
    \n+
    645 }
    \n+
    \n+
    646
    \n+
    648}
    \n+
    649#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:462
    \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:642
    \n+
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:558
    \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
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Definition binaryfunctions.hh:18
    \n-
    Type result_type
    Definition binaryfunctions.hh:23
    \n-
    Type operator()(const Type &t1, const Type &t2) const
    Definition binaryfunctions.hh:25
    \n-
    Type first_argument_type
    Definition binaryfunctions.hh:19
    \n-
    Type second_argument_type
    Definition binaryfunctions.hh:21
    \n-
    Definition binaryfunctions.hh:34
    \n-
    Type operator()(const Type &t1, const Type &t2) const
    Definition binaryfunctions.hh:41
    \n-
    Type result_type
    Definition binaryfunctions.hh:39
    \n-
    Type first_argument_type
    Definition binaryfunctions.hh:35
    \n-
    Type second_argument_type
    Definition binaryfunctions.hh:37
    \n+
    Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
    Definition propertymap.hh:84
    \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+
    Compute size of variadic type list.
    Definition typetraits.hh:404
    \n+
    Get entry of std::integer_sequence.
    Definition typetraits.hh:476
    \n+
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:501
    \n+
    T type
    Definition typetraits.hh:501
    \n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,93 +1,462 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-binaryfunctions.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 (C) 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_BINARYFUNCTIONS_HH\n-6#define DUNE_BINARYFUNCTIONS_HH\n+5#ifndef DUNE_TYPETRAITS_HH\n+6#define DUNE_TYPETRAITS_HH\n 7\n-12#include \n-13\n-14namespace _\bD_\bu_\bn_\be\n-15{\n-16 template\n-_\b1_\b7 struct _\bM_\bi_\bn\n-18 {\n-_\b1_\b9 using _\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n-following similar deprecations in C++17\")]] = Type;\n-20\n-_\b2_\b1 using _\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n-following similar deprecations in C++17\")]] = Type;\n-22\n-_\b2_\b3 using _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated following\n-similar deprecations in C++17\")]] = Type;\n-24\n-_\b2_\b5 Type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Type& t1, const Type& t2) const\n-26 {\n-27 using std::min;\n-28 return min(t1,t2);\n-29 }\n-30 };\n+8#include \n+9#include \n+10#include \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-32 template\n-_\b3_\b3 struct _\bM_\ba_\bx\n-34 {\n-_\b3_\b5 using _\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n-following similar deprecations in C++17\")]] = Type;\n-36\n-_\b3_\b7 using _\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n-following similar deprecations in C++17\")]] = Type;\n-38\n-_\b3_\b9 using _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated following\n-similar deprecations in C++17\")]] = Type;\n-40\n-_\b4_\b1 Type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Type& t1, const Type& t2) const\n-42 {\n-43 using std::max;\n-44 return max(t1,t2);\n-45 }\n-46 };\n-47}\n-48\n-49#endif\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#ifndef DOXYGEN\n+225\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+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+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+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+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+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+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+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\n+401 template\n+_\b4_\b0_\b2 struct _\bS_\bi_\bz_\be_\bO_\bf\n+403 : public std::integral_constant\n+404 {};\n+405\n+406\n+407#ifndef DOXYGEN\n+408\n+409 namespace Impl {\n+410\n+411 template\n+412 struct IntegerSequenceHelper;\n+413\n+414 // Helper struct to compute the i-th entry of a std::integer_sequence\n+415 //\n+416 // This could also be implemented using std::get(std::make_tuple\n+(t...)).\n+417 // However, the gcc-6 implementation of std::make_tuple increases the\n+instantiation\n+418 // depth by 15 levels for each argument, such that the maximal\n+instantiation depth\n+419 // is easily hit, especially with clang where it is set to 256.\n+420 template\n+421 struct IntegerSequenceHelper\n+422 {\n+423\n+424 // get first entry\n+425 static constexpr auto _\bg_\be_\bt(std::integral_constant)\n+426 {\n+427 return std::integral_constant();\n+428 }\n+429\n+430 // call get with first entry cut off and decremented index\n+431 template 0) and (index < sizeof...(tail)+1), int> = 0>\n+433 static constexpr auto get(std::integral_constant)\n+434 {\n+435 return IntegerSequenceHelper::get(std::integral_constant());\n+436 }\n+437\n+438 // use static assertion if index exceeds size\n+439 template= sizeof...(tail)+1), int> = 0>\n+441 static constexpr auto _\bg_\be_\bt(std::integral_constant)\n+442 {\n+443 static_assert(index < sizeof...(tail)+1, \"index used in\n+IntegerSequenceEntry exceed size\");\n+444 }\n+445 };\n+446\n+447 } // end namespace Impl\n+448\n+449#endif // DOXYGEN\n+450\n+451\n+461 template\n+_\b4_\b6_\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+463 {\n+464 static_assert(index < sizeof...(t), \"index used in IntegerSequenceEntry\n+exceed size\");\n+465 return Impl::IntegerSequenceHelper::get(i);\n+466 }\n+467\n+468\n+475 template\n+_\b4_\b7_\b6 struct _\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by;\n+477\n+478#ifndef DOXYGEN\n+479\n+480 template\n+481 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+482 : public decltype(Impl::IntegerSequenceHelper::get(std::\n+integral_constant()))\n+483 {};\n+484\n+485#endif // DOXYGEN\n+486\n+500 template\n+_\b5_\b0_\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+502\n+504 template\n+_\b5_\b0_\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+506\n+508 template\n+_\b5_\b0_\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+510\n+512 template\n+_\b5_\b1_\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+514\n+516 template\n+_\b5_\b1_\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+518\n+520 template<>\n+_\b5_\b2_\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+522 {\n+_\b5_\b2_\b3 using _\bt_\by_\bp_\be = bool;\n+524 };\n+525\n+527 template\n+_\b5_\b2_\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+529\n+557 template\n+_\b5_\b5_\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+559\n+641 template\n+_\b6_\b4_\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+643 {\n+644 return v;\n+645 }\n+646\n+648}\n+649#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:462\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:642\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:558\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\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_\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_\bi_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be\n-Type result_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-Type operator()(const Type &t1, const Type &t2) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n-Type first_argument_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn_\b:_\b:_\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n-Type second_argument_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:21\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:_\bM_\ba_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-Type operator()(const Type &t1, const Type &t2) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be\n-Type result_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n-Type first_argument_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx_\b:_\b:_\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n-Type second_argument_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const\n+Key &key)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:84\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:_\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:404\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:476\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:501\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:501\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:523\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: shared_ptr.hh File Reference\n+dune-common: version.hh File Reference\n \n \n \n \n \n \n \n@@ -70,58 +70,776 @@\n
    \n \n
    \n
    \n
    \n \n-
    shared_ptr.hh File Reference
    \n+Macros
    \n+
    version.hh File Reference
    \n \n
    \n \n-

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

    Various macros to work with Dune module version numbers. \n More...

    \n-
    #include <memory>
    \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::null_deleter< T >
     implements the Deleter concept of shared_ptr without deleting anything 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+\n+\n+\n+\n+\n+\n+\n+\n+\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 >
    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+Macros

    #define DUNE_VERSION_JOIN(module, type)   module ## _VERSION_ ## type
     Constructs the preprocessor name used in config.h to hold version numbers.
     
    #define DUNE_VERSION_EQUAL(module, major, minor)
     True if 'module' has the version major.minor.
     
    #define DUNE_VERSION_EQUAL_REV(module, major, minor, revision)
     True if 'module' has the version major.minor.revision.
     
    #define DUNE_VERSION_GTE(module, major, minor)
     True if 'module' has the version major.minor or greater.
     
    #define DUNE_VERSION_LT(module, major, minor)    ! DUNE_VERSION_GTE(module,major,minor)
     True if 'module' has a version less than major.minor.
     
    #define DUNE_VERSION_NEWER(module, major, minor)    DUNE_VERSION_GTE(module,major,minor)
     True if 'module' has the version major.minor or newer.
     
    #define DUNE_VERSION_GT(module, major, minor)
     True if 'module' has a version greater than major.minor.
     
    #define DUNE_VERSION_LTE(module, major, minor)    ! DUNE_VERSION_GT(module,major,minor)
     True if 'module' has a version less than or equal to major.minor.
     
    #define DUNE_VERSION_GTE_REV(module, major, minor, revision)
     True if 'module' has the version major.minor.revision or greater.
     
    #define DUNE_VERSION_LT_REV(module, major, minor, revision)    ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
     True if 'module' has a version lower than major.minor.revision.
     
    #define DUNE_VERSION_NEWER_REV(module, major, minor, revision)    DUNE_VERSION_GTE_REV(module,major,minor,revision)
     True if 'module' has the version major.minor.revision or newer.
     
    #define DUNE_VERSION_GT_REV(module, major, minor, revision)
     True if 'module' has a greater version than major.minor.revision.
     
    #define DUNE_VERSION_LTE_REV(module, major, minor, revision)    ! DUNE_VERSION_GT_REV(module,major,minor,revision)
     True if 'module' has a version lower or equal to major.minor.revision.
     
    #define DUNE_VERSION_ID(major, minor, revision)    ((unsigned int)((major << 24) + (minor << 16) + revision))
     Compute a unique uint id from the major, minor, and revision numbers.
     
    #define DUNE_MODULE_VERSION_ID(module)    DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
     Compute a unique uint id for the given module.
     
    \n

    Detailed Description

    \n-

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

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

    Various macros to work with Dune module version numbers.

    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_MODULE_VERSION_ID

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_MODULE_VERSION_ID( module)    DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
    \n+
    \n+\n+

    Compute a unique uint id for the given module.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_EQUAL

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_EQUAL( module,
     major,
     minor 
    )
    \n+
    \n+Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \\
    \n+
    (DUNE_VERSION_JOIN(module,MINOR) == minor))
    \n+
    #define DUNE_VERSION_JOIN(module, type)
    Constructs the preprocessor name used in config.h to hold version numbers.
    Definition version.hh:28
    \n+
    \n+

    True if 'module' has the version major.minor.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_EQUAL_REV

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_EQUAL_REV( module,
     major,
     minor,
     revision 
    )
    \n+
    \n+Value:
    ( DUNE_VERSION_EQUAL(module,major,minor) && \\
    \n+
    (DUNE_VERSION_JOIN(module,REVISION) == revision))
    \n+
    #define DUNE_VERSION_EQUAL(module, major, minor)
    True if 'module' has the version major.minor.
    Definition version.hh:44
    \n+
    \n+

    True if 'module' has the version major.minor.revision.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GT

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_GT( module,
     major,
     minor 
    )
    \n+
    \n+Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)))
    \n+
    \n+

    True if 'module' has a version greater than major.minor.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GT_REV

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_GT_REV( module,
     major,
     minor,
     revision 
    )
    \n+
    \n+Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n+
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n+
    && (DUNE_VERSION_JOIN(module,REVISION) > revision)))
    \n+
    \n+

    True if 'module' has a greater version than major.minor.revision.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GTE

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_GTE( module,
     major,
     minor 
    )
    \n+
    \n+Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) >= minor)))
    \n+
    \n+

    True if 'module' has the version major.minor or greater.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_GTE_REV

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_GTE_REV( module,
     major,
     minor,
     revision 
    )
    \n+
    \n+Value:
    ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n+
    || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n+
    && (DUNE_VERSION_JOIN(module,REVISION) >= revision)))
    \n+
    \n+

    True if 'module' has the version major.minor.revision or greater.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_ID

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_ID( major,
     minor,
     revision 
    )    ((unsigned int)((major << 24) + (minor << 16) + revision))
    \n+
    \n+\n+

    Compute a unique uint id from the major, minor, and revision numbers.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_JOIN

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_JOIN( module,
     type 
    )   module ## _VERSION_ ## type
    \n+
    \n+\n+

    Constructs the preprocessor name used in config.h to hold version numbers.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

    \n+
    Parameters
    \n+ \n+ \n+ \n+
    moduleThe name of the Dune module
    typeThe version number type, one of MAJOR, MINOR, or REVISION
    \n+
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_VERSION_LT

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_LT( module,
     major,
     minor 
    )    ! DUNE_VERSION_GTE(module,major,minor)
    \n+
    \n+\n+

    True if 'module' has a version less than major.minor.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_LT_REV

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_LT_REV( module,
     major,
     minor,
     revision 
    )    ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n+
    \n+\n+

    True if 'module' has a version lower than major.minor.revision.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_LTE

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_LTE( module,
     major,
     minor 
    )    ! DUNE_VERSION_GT(module,major,minor)
    \n+
    \n+\n+

    True if 'module' has a version less than or equal to major.minor.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_LTE_REV

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_LTE_REV( module,
     major,
     minor,
     revision 
    )    ! DUNE_VERSION_GT_REV(module,major,minor,revision)
    \n+
    \n+\n+

    True if 'module' has a version lower or equal to major.minor.revision.

    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_NEWER

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_NEWER( module,
     major,
     minor 
    )    DUNE_VERSION_GTE(module,major,minor)
    \n+
    \n+\n+

    True if 'module' has the version major.minor or newer.

    \n+
    Note
    Deprecated, use DUNE_VERSION_GTE instead.
    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

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

    ◆ DUNE_VERSION_NEWER_REV

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_VERSION_NEWER_REV( module,
     major,
     minor,
     revision 
    )    DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n+
    \n+\n+

    True if 'module' has the version major.minor.revision or newer.

    \n+
    Note
    Deprecated, use DUNE_VERSION_GTE_REV instead.
    \n+

    For the DUNE core modules you need to use the following module names:

      \n+
    • DUNE_COMMON for dune-common
    • \n+
    • DUNE_GRID for dune-grid
    • \n+
    • DUNE_GEOMETRY for dune-geometry
    • \n+
    • DUNE_ISTL for dune-istl
    • \n+
    • DUNE_LOCALFUNCTIONS for dune-localfunctions
    • \n+
    \n+

    For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

    \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,40 +1,349 @@\n dune-common\u00a02.9.0\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-#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+_\bM_\ba_\bc_\br_\bo_\bs\n+version.hh File Reference\n+Various macros to work with Dune module version numbers. _\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:_\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-\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::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-\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-\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+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module, type)\u00a0\u00a0\u00a0module ## _VERSION_ ## type\n+\u00a0 Constructs the preprocessor name used in config.h to hold version\n+ numbers.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL(module, major, minor)\n+\u00a0 True if 'module' has the version major.minor.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL_\b__\bR_\bE_\bV(module, major, minor, revision)\n+\u00a0 True if 'module' has the version major.minor.revision.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE(module, major, minor)\n+\u00a0 True if 'module' has the version major.minor or greater.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT(module, major, minor)\u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE\n+ (module,major,minor)\n+\u00a0 True if 'module' has a version less than major.minor.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bN_\bE_\bW_\bE_\bR(module, major, minor)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE\n+ (module,major,minor)\n+\u00a0 True if 'module' has the version major.minor or newer.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT(module, major, minor)\n+\u00a0 True if 'module' has a version greater than major.minor.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT_\bE(module, major, minor)\u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT\n+ (module,major,minor)\n+\u00a0 True if 'module' has a version less than or equal to major.minor.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV(module, major, minor, revision)\n+\u00a0 True if 'module' has the version major.minor.revision or greater.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT_\b__\bR_\bE_\bV(module, major, minor, revision)\u00a0\u00a0\u00a0 !\n+ _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV(module,major,minor,revision)\n+\u00a0 True if 'module' has a version lower than major.minor.revision.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bN_\bE_\bW_\bE_\bR_\b__\bR_\bE_\bV(module, major, minor, revision)\u00a0\u00a0\u00a0\n+ _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV(module,major,minor,revision)\n+\u00a0 True if 'module' has the version major.minor.revision or newer.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\b__\bR_\bE_\bV(module, major, minor, revision)\n+\u00a0 True if 'module' has a greater version than major.minor.revision.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bL_\bT_\bE_\b__\bR_\bE_\bV(module, major, minor, revision)\u00a0\u00a0\u00a0 !\n+ _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\b__\bR_\bE_\bV(module,major,minor,revision)\n+\u00a0 True if 'module' has a version lower or equal to major.minor.revision.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD(major, minor, revision)\u00a0\u00a0\u00a0 ((unsigned int)((major <<\n+ 24) + (minor << 16) + revision))\n+\u00a0 Compute a unique uint id from the major, minor, and revision numbers.\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bM_\bO_\bD_\bU_\bL_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD(module)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD( _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+ (module,MAJOR), _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MINOR), _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+ (module,REVISION) )\n+\u00a0 Compute a unique uint id for the given module.\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+Various macros to work with Dune module version numbers.\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_M\bMO\bOD\bDU\bUL\bLE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_I\bID\bD *\b**\b**\b**\b**\b*\n+ \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bI_\bD\n+ ( _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR),\n+#define DUNE_MODULE_VERSION_ID ( \u00a0 module ) _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MINOR),\n+ _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION)\n+ )\n+Compute a unique uint id for the given module.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_E\bEQ\bQU\bUA\bAL\bL *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_EQUAL ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && \\\n+(_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MINOR) == minor))\n+_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+#define DUNE_VERSION_JOIN(module, type)\n+Constructs the preprocessor name used in config.h to hold version numbers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn version.hh:28\n+True if 'module' has the version major.minor.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_E\bEQ\bQU\bUA\bAL\bL_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_EQUAL_REV ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor,\n+ \u00a0 revision\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+( _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL(module,major,minor) && \\\n+(_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION) == revision))\n+_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bE_\bQ_\bU_\bA_\bL\n+#define DUNE_VERSION_EQUAL(module, major, minor)\n+True if 'module' has the version major.minor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn version.hh:44\n+True if 'module' has the version major.minor.revision.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bT *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_GT ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n+|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+(module,MINOR) > minor)))\n+True if 'module' has a version greater than major.minor.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bT_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_GT_REV ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor,\n+ \u00a0 revision\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n+|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+(module,MINOR) > minor)) \\\n+|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+(module,MINOR) == minor) \\\n+&& (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION) > revision)))\n+True if 'module' has a greater version than major.minor.revision.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bTE\bE *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_GTE ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n+|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+(module,MINOR) >= minor)))\n+True if 'module' has the version major.minor or greater.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_G\bGT\bTE\bE_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_GTE_REV ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor,\n+ \u00a0 revision\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) > major) \\\n+|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+(module,MINOR) > minor)) \\\n+|| ((_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,MAJOR) == major) && (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN\n+(module,MINOR) == minor) \\\n+&& (_\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bJ_\bO_\bI_\bN(module,REVISION) >= revision)))\n+True if 'module' has the version major.minor.revision or greater.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_I\bID\bD *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_ID ( \u00a0 major,\n+ \u00a0 minor,\n+ \u00a0 revision\u00a0\n+ ) \u00a0\u00a0\u00a0 ((unsigned int)((major << 24) + (minor << 16) +\n+ revision))\n+Compute a unique uint id from the major, minor, and revision numbers.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_J\bJO\bOI\bIN\bN *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_JOIN ( \u00a0 module,\n+ \u00a0 type\u00a0\n+ ) \u00a0\u00a0\u00a0module ## _VERSION_ ## type\n+Constructs the preprocessor name used in config.h to hold version numbers.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+ Parameters\n+ module The name of the _\bD_\bu_\bn_\be module\n+ type The version number type, one of MAJOR, MINOR, or REVISION\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bT *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_LT ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor\u00a0\n+ ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE(module,major,minor)\n+True if 'module' has a version less than major.minor.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bT_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_LT_REV ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor,\n+ \u00a0 revision\u00a0\n+ ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV\n+ (module,major,minor,revision)\n+True if 'module' has a version lower than major.minor.revision.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bTE\bE *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_LTE ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor\u00a0\n+ ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT(module,major,minor)\n+True if 'module' has a version less than or equal to major.minor.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_L\bLT\bTE\bE_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_LTE_REV ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor,\n+ \u00a0 revision\u00a0\n+ ) \u00a0\u00a0\u00a0 ! _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\b__\bR_\bE_\bV\n+ (module,major,minor,revision)\n+True if 'module' has a version lower or equal to major.minor.revision.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_N\bNE\bEW\bWE\bER\bR *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_NEWER ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor\u00a0\n+ ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE(module,major,minor)\n+True if 'module' has the version major.minor or newer.\n+ Note\n+ Deprecated, use DUNE_VERSION_GTE instead.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_V\bVE\bER\bRS\bSI\bIO\bON\bN_\b_N\bNE\bEW\bWE\bER\bR_\b_R\bRE\bEV\bV *\b**\b**\b**\b**\b*\n+#define DUNE_VERSION_NEWER_REV ( \u00a0 module,\n+ \u00a0 major,\n+ \u00a0 minor,\n+ \u00a0 revision\u00a0\n+ ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bV_\bE_\bR_\bS_\bI_\bO_\bN_\b__\bG_\bT_\bE_\b__\bR_\bE_\bV\n+ (module,major,minor,revision)\n+True if 'module' has the version major.minor.revision or newer.\n+ Note\n+ Deprecated, use DUNE_VERSION_GTE_REV instead.\n+For the DUNE core modules you need to use the following module names:\n+ * DUNE_COMMON for dune-common\n+ * DUNE_GRID for dune-grid\n+ * DUNE_GEOMETRY for dune-geometry\n+ * DUNE_ISTL for dune-istl\n+ * DUNE_LOCALFUNCTIONS for dune-localfunctions\n+For external DUNE modules, you should capitalize the name and replace '-' by\n+underscores. For example for the module foo-bar you need to use FOO_BAR as\n+module name in the context of this macro.\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: shared_ptr.hh Source File\n+dune-common: version.hh Source File\n \n \n \n \n \n \n \n@@ -74,72 +74,107 @@\n \n
    \n \n
    \n \n
    \n-
    shared_ptr.hh
    \n+
    version.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 (C) 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-
    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+
    5#ifndef DUNE_VERSION_HH
    \n+
    6#define DUNE_VERSION_HH
    \n+
    7
    \n+
    28#define DUNE_VERSION_JOIN(module,type) module ## _VERSION_ ## type
    \n+
    29
    \n+
    \n+
    44#define DUNE_VERSION_EQUAL(module,major,minor) \\
    \n+
    45 ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \\
    \n+
    46 (DUNE_VERSION_JOIN(module,MINOR) == minor))
    \n+
    \n+
    47
    \n+
    \n+
    62#define DUNE_VERSION_EQUAL_REV(module,major,minor,revision) \\
    \n+
    63 ( DUNE_VERSION_EQUAL(module,major,minor) && \\
    \n+
    64 (DUNE_VERSION_JOIN(module,REVISION) == revision))
    \n+
    \n+
    65
    \n+
    \n+
    80#define DUNE_VERSION_GTE(module,major,minor) \\
    \n+
    81 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    82 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) >= minor)))
    \n+
    \n+
    83
    \n+
    \n+
    98#define DUNE_VERSION_LT(module,major,minor) \\
    \n+
    99 ! DUNE_VERSION_GTE(module,major,minor)
    \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-
    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+
    \n+
    116#define DUNE_VERSION_NEWER(module,major,minor) \\
    \n+
    117 DUNE_VERSION_GTE(module,major,minor)
    \n+
    \n+
    118
    \n+
    \n+
    133#define DUNE_VERSION_GT(module,major,minor) \\
    \n+
    134 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    135 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)))
    \n+
    \n+
    136
    \n+
    \n+
    151#define DUNE_VERSION_LTE(module,major,minor) \\
    \n+
    152 ! DUNE_VERSION_GT(module,major,minor)
    \n+
    \n+
    153
    \n+
    \n+
    168#define DUNE_VERSION_GTE_REV(module,major,minor,revision) \\
    \n+
    169 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    170 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n+
    171 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n+
    172 && (DUNE_VERSION_JOIN(module,REVISION) >= revision)))
    \n+
    \n+
    173
    \n+
    \n+
    188#define DUNE_VERSION_LT_REV(module,major,minor,revision) \\
    \n+
    189 ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n+
    \n+
    190
    \n+
    \n+
    206#define DUNE_VERSION_NEWER_REV(module,major,minor,revision) \\
    \n+
    207 DUNE_VERSION_GTE_REV(module,major,minor,revision)
    \n+
    \n+
    208
    \n+
    \n+
    223#define DUNE_VERSION_GT_REV(module,major,minor,revision) \\
    \n+
    224 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\
    \n+
    225 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \\
    \n+
    226 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \\
    \n+
    227 && (DUNE_VERSION_JOIN(module,REVISION) > revision)))
    \n+
    \n+
    228
    \n+
    \n+
    243#define DUNE_VERSION_LTE_REV(module,major,minor,revision) \\
    \n+
    244 ! DUNE_VERSION_GT_REV(module,major,minor,revision)
    \n+
    \n+
    245
    \n+
    \n+
    260#define DUNE_VERSION_ID(major,minor,revision) \\
    \n+
    261 ((unsigned int)((major << 24) + (minor << 16) + revision))
    \n+
    \n+
    262
    \n+
    \n+
    277#define DUNE_MODULE_VERSION_ID(module) \\
    \n+
    278 DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
    \n+
    \n+
    279
    \n+
    280#endif
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,74 +1,80 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-shared_ptr.hh\n+version.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 (C) 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-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-99 }\n+5#ifndef DUNE_VERSION_HH\n+6#define DUNE_VERSION_HH\n+7\n+_\b2_\b8#define DUNE_VERSION_JOIN(module,type) module ## _VERSION_ ## type\n+29\n+_\b4_\b4#define DUNE_VERSION_EQUAL(module,major,minor) \\\n+45 ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \\\n+46 (DUNE_VERSION_JOIN(module,MINOR) == minor))\n+47\n+_\b6_\b2#define DUNE_VERSION_EQUAL_REV(module,major,minor,revision) \\\n+63 ( DUNE_VERSION_EQUAL(module,major,minor) && \\\n+64 (DUNE_VERSION_JOIN(module,REVISION) == revision))\n+65\n+_\b8_\b0#define DUNE_VERSION_GTE(module,major,minor) \\\n+81 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n+82 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n+(module,MINOR) >= minor)))\n+83\n+_\b9_\b8#define DUNE_VERSION_LT(module,major,minor) \\\n+99 ! DUNE_VERSION_GTE(module,major,minor)\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-_\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+_\b1_\b1_\b6#define DUNE_VERSION_NEWER(module,major,minor) \\\n+117 DUNE_VERSION_GTE(module,major,minor)\n+118\n+_\b1_\b3_\b3#define DUNE_VERSION_GT(module,major,minor) \\\n+134 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n+135 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n+(module,MINOR) > minor)))\n+136\n+_\b1_\b5_\b1#define DUNE_VERSION_LTE(module,major,minor) \\\n+152 ! DUNE_VERSION_GT(module,major,minor)\n+153\n+_\b1_\b6_\b8#define DUNE_VERSION_GTE_REV(module,major,minor,revision) \\\n+169 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n+170 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n+(module,MINOR) > minor)) \\\n+171 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n+(module,MINOR) == minor) \\\n+172 && (DUNE_VERSION_JOIN(module,REVISION) >= revision)))\n+173\n+_\b1_\b8_\b8#define DUNE_VERSION_LT_REV(module,major,minor,revision) \\\n+189 ! DUNE_VERSION_GTE_REV(module,major,minor,revision)\n+190\n+_\b2_\b0_\b6#define DUNE_VERSION_NEWER_REV(module,major,minor,revision) \\\n+207 DUNE_VERSION_GTE_REV(module,major,minor,revision)\n+208\n+_\b2_\b2_\b3#define DUNE_VERSION_GT_REV(module,major,minor,revision) \\\n+224 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \\\n+225 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n+(module,MINOR) > minor)) \\\n+226 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN\n+(module,MINOR) == minor) \\\n+227 && (DUNE_VERSION_JOIN(module,REVISION) > revision)))\n+228\n+_\b2_\b4_\b3#define DUNE_VERSION_LTE_REV(module,major,minor,revision) \\\n+244 ! DUNE_VERSION_GT_REV(module,major,minor,revision)\n+245\n+_\b2_\b6_\b0#define DUNE_VERSION_ID(major,minor,revision) \\\n+261 ((unsigned int)((major << 24) + (minor << 16) + revision))\n+262\n+_\b2_\b7_\b7#define DUNE_MODULE_VERSION_ID(module) \\\n+278 DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN\n+(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )\n+279\n+280#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/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: fmatrix.hh File Reference\n+dune-common: float_cmp.hh File Reference\n \n \n \n \n \n \n \n@@ -72,104 +72,99 @@\n
  • dune
  • common
  • \n
    \n \n
    \n \n- \n+
    float_cmp.hh File Reference
    \n
    \n
    \n \n-

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

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

    \n-
    #include <cmath>
    \n-#include <cstddef>
    \n-#include <iostream>
    \n-#include <algorithm>
    \n-#include <initializer_list>
    \n-#include <dune/common/boundschecking.hh>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/densematrix.hh>
    \n-#include <dune/common/precision.hh>
    \n-#include <dune/common/promotiontraits.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/matrixconcepts.hh>
    \n-#include "fmatrixev.hh"
    \n+
    #include "float_cmp.cc"
    \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

    struct  Dune::DenseMatVecTraits< FieldMatrix< K, ROWS, COLS > >
    struct  Dune::FloatCmp::DefaultEpsilon< T, style >
     mapping from a value type and a compare style to a default epsilon More...
     
    struct  Dune::FieldTraits< FieldMatrix< K, ROWS, COLS > >
     
    class  Dune::FieldMatrix< K, ROWS, COLS >
     A dense n x m matrix. More...
    class  Dune::FloatCmpOps< T, cstyle_, rstyle_ >
     Class encapsulating a default epsilon. More...
     
    \n \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::FMatrixHelp
    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+\n+\n+\n+\n+\n+\n+\n+\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 K >
    static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
     invert scalar without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
     invert scalar without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
     invert 2x2 Matrix without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
     invert 3x3 Matrix without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
     invert 3x3 Matrix without changing the original matrix
     
    template<class K , int m, int n, int p>
    static void Dune::FMatrixHelp::multMatrix (const FieldMatrix< K, m, n > &A, const FieldMatrix< K, n, p > &B, FieldMatrix< K, m, p > &ret)
     calculates ret = A * B
     
    template<typename K , int rows, int cols>
    static void Dune::FMatrixHelp::multTransposedMatrix (const FieldMatrix< K, rows, cols > &matrix, FieldMatrix< K, cols, cols > &ret)
     calculates ret= A_t*A
     
    template<typename K , int rows, int cols>
    static void Dune::FMatrixHelp::multAssignTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)
     calculates ret = matrix^T * x
     
    template<typename K , int rows, int cols>
    static FieldVector< K, rows > Dune::FMatrixHelp::mult (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, cols > &x)
     calculates ret = matrix * x
     
    template<typename K , int rows, int cols>
    static FieldVector< K, cols > Dune::FMatrixHelp::multTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x)
     calculates ret = matrix^T * x
     
    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
     
    \n

    Detailed Description

    \n-

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

    \n+

    Various ways to compare floating-point numbers.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,117 +1,81 @@\n dune-common\u00a02.9.0\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-fmatrix.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\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 <_\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/_\bf_\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/_\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/_\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-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b._\bh_\bh>\n-#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\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 | _\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 _\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>\n-\u00a0 A dense n x m matrix. _\bM_\bo_\br_\be_\b._\b._\b.\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_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp\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- static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 > &matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n- 1, 1 > &inverse)\n-\u00a0 invert scalar without changing the original\n- matrix\n-\u00a0\n-template\n- static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n- (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 > &matrix,\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 > &inverse)\n-\u00a0 invert scalar without changing the original\n- matrix\n-\u00a0\n-template\n- static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 2, 2 > &matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n- 2, 2 > &inverse)\n-\u00a0 invert 2x2 Matrix without changing the original\n- matrix\n-\u00a0\n-template\n- static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n- (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 2, 2 > &matrix,\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 2, 2 > &inverse)\n-\u00a0\n-template\n- static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 3, 3 > &matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n- 3, 3 > &inverse)\n-\u00a0 invert 3x3 Matrix without changing the original\n- matrix\n-\u00a0\n-template\n- static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n- (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 3, 3 > &matrix,\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 3, 3 > &inverse)\n-\u00a0 invert 3x3 Matrix without changing the original\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:_\bm_\bu_\bl_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &A, const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n- n, p > &B, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, p > &ret)\n-\u00a0 calculates ret = A * B\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:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\br_\bi_\bx (const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, rows, cols > &matrix,\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, cols, cols > &ret)\n-\u00a0 calculates ret= A_t*A\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:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, rows, cols > &matrix, const\n- _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, rows > &x, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, cols\n- > &ret)\n-\u00a0 calculates ret = matrix^T * x\n-\u00a0\n-template\n-static _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, rows >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n- rows, cols > &matrix, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, cols\n- > &x)\n-\u00a0 calculates ret = matrix * x\n-\u00a0\n-template\n-static _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, cols >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, rows, cols > &matrix, const\n- _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, rows > &x)\n-\u00a0 calculates ret = matrix^T * x\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 \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\n-compile-time given number of rows and columns.\n+Various ways to compare floating-point numbers.\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", "has_internal_linenos": true, "unified_diff": "@@ -22,10431 +22,3013 @@\n 00000150: 656e 743d 2244 6f78 7967 656e 2031 2e39 ent=\"Doxygen 1.9\n 00000160: 2e38 222f 3e0a 3c6d 6574 6120 6e61 6d65 .8\"/>..dune-common: \n-000001c0: 666d 6174 7269 782e 6868 2053 6f75 7263 fmatrix.hh Sourc\n-000001d0: 6520 4669 6c65 3c2f 7469 746c 653e 0a3c e File.<\n-000001e0: 6c69 6e6b 2068 7265 663d 2274 6162 732e link href=\"tabs.\n-000001f0: 6373 7322 2072 656c 3d22 7374 796c 6573 css\" rel=\"styles\n-00000200: 6865 6574 2220 7479 7065 3d22 7465 7874 heet\" type=\"text\n-00000210: 2f63 7373 222f 3e0a 3c73 6372 6970 7420 /css\"/>.\n-00000250: 0a3c 7363 7269 7074 2074 7970 653d 2274 ..<\n-00000290: 6c69 6e6b 2068 7265 663d 2273 6561 7263 link href=\"searc\n-000002a0: 682f 7365 6172 6368 2e63 7373 2220 7265 h/search.css\" re\n-000002b0: 6c3d 2273 7479 6c65 7368 6565 7422 2074 l=\"stylesheet\" t\n-000002c0: 7970 653d 2274 6578 742f 6373 7322 2f3e ype=\"text/css\"/>\n-000002d0: 0a3c 7363 7269 7074 2074 7970 653d 2274 ...../* \n-00000690: 406c 6963 656e 7365 206d 6167 6e65 743a @license magnet:\n-000006a0: 3f78 743d 7572 6e3a 6274 6968 3a64 3364 ?xt=urn:btih:d3d\n-000006b0: 3961 3961 3635 3935 3532 3166 3936 3636 9a9a6595521f9666\n-000006c0: 6135 6539 3463 6338 3330 6461 6238 3362 a5e94cc830dab83b\n-000006d0: 3635 3639 3926 616d 703b 646e 3d65 7870 65699&dn=exp\n-000006e0: 6174 2e74 7874 204d 4954 202a 2f0a 2428 at.txt MIT */.$(\n-000006f0: 6675 6e63 7469 6f6e 2829 207b 0a20 2069 function() {. i\n-00000700: 6e69 744d 656e 7528 2727 2c74 7275 652c nitMenu('',true,\n-00000710: 6661 6c73 652c 2773 6561 7263 682e 7068 false,'search.ph\n-00000720: 7027 2c27 5365 6172 6368 2729 3b0a 2020 p','Search');. \n-00000730: 2428 646f 6375 6d65 6e74 292e 7265 6164 $(document).read\n-00000740: 7928 6675 6e63 7469 6f6e 2829 207b 2069 y(function() { i\n-00000750: 6e69 745f 7365 6172 6368 2829 3b20 7d29 nit_search(); })\n-00000760: 3b0a 7d29 3b0a 2f2a 2040 6c69 6365 6e73 ;.});./* @licens\n-00000770: 652d 656e 6420 2a2f 0a3c 2f73 6372 6970 e-end */..
    ../* \n-000007c0: 406c 6963 656e 7365 206d 6167 6e65 743a @license magnet:\n-000007d0: 3f78 743d 7572 6e3a 6274 6968 3a64 3364 ?xt=urn:btih:d3d\n-000007e0: 3961 3961 3635 3935 3532 3166 3936 3636 9a9a6595521f9666\n-000007f0: 6135 6539 3463 6338 3330 6461 6238 3362 a5e94cc830dab83b\n-00000800: 3635 3639 3926 616d 703b 646e 3d65 7870 65699&dn=exp\n-00000810: 6174 2e74 7874 204d 4954 202a 2f0a 2428 at.txt MIT */.$(\n-00000820: 646f 6375 6d65 6e74 292e 7265 6164 7928 document).ready(\n-00000830: 6675 6e63 7469 6f6e 2829 207b 2069 6e69 function() { ini\n-00000840: 745f 636f 6465 666f 6c64 2830 293b 207d t_codefold(0); }\n-00000850: 293b 0a2f 2a20 406c 6963 656e 7365 2d65 );./* @license-e\n-00000860: 6e64 202a 2f0a 3c2f 7363 7269 7074 3e0a nd */..\n-00000870: 3c21 2d2d 2077 696e 646f 7720 7368 6f77 .
    .
    .....
    ..<\n-00000a10: 6469 7620 6964 3d22 5352 5265 7375 6c74 div id=\"SRResult\n-00000a20: 7322 3e3c 2f64 6976 3e0a 3c64 6976 2063 s\">
    .
    Loa\n-00000a50: 6469 6e67 2e2e 2e3c 2f64 6976 3e0a 3c64 ding...
    .Searching...<\n-00000a90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    No Ma\n-00000ac0: 7463 6865 733c 2f64 6976 3e0a 3c2f 6469 tches
    ..
    .
    \n-00000ae0: 0a3c 2f64 6976 3e0a 0a3c 6469 7620 6964 ...
    . <\n-00000b10: 756c 3e0a 3c6c 6920 636c 6173 733d 226e ul>.
  • dune<\n-00000b70: 2f6c 693e 3c6c 6920 636c 6173 733d 226e /li>
  • common
  • ..
    .
    . <\n-00000c10: 6469 7620 636c 6173 733d 2268 6561 6465 div class=\"heade\n-00000c20: 7274 6974 6c65 223e 3c64 6976 2063 6c61 rtitle\">
    fmatr\n-00000c40: 6978 2e68 683c 2f64 6976 3e3c 2f64 6976 ix.hh
    .
    .
    .Go to the doc\n-00000ca0: 756d 656e 7461 7469 6f6e 206f 6620 7468 umentation of th\n-00000cb0: 6973 2066 696c 652e 3c2f 613e 3c64 6976 is file.
    1<\n-00000d20: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>// -\n-00000d40: 2a2d 2074 6162 2d77 6964 7468 3a20 343b *- tab-width: 4;\n-00000d50: 2069 6e64 656e 742d 7461 6273 2d6d 6f64 indent-tabs-mod\n-00000d60: 653a 206e 696c 3b20 632d 6261 7369 632d e: nil; c-basic-\n-00000d70: 6f66 6673 6574 3a20 3220 2d2a 2d3c 2f73 offset: 2 -*-
    .
    2<\n-00000de0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class=\"comm\n-00000df0: 656e 7422 3e2f 2f20 7669 3a20 7365 7420 ent\">// vi: set \n-00000e00: 6574 2074 733d 3420 7377 3d32 2073 7473 et ts=4 sw=2 sts\n-00000e10: 3d32 3a3c 2f73 7061 6e3e 3c2f 6469 763e =2:
    \n-00000e20: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00000e50: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 3// SP\n-00000e90: 4458 2d46 696c 6543 6f70 7972 6967 6874 DX-FileCopyright\n-00000ea0: 496e 666f 3a20 436f 7079 7269 6768 7420 Info: Copyright \n-00000eb0: 2843 2920 4455 4e45 2050 726f 6a65 6374 (C) DUNE Project\n-00000ec0: 2063 6f6e 7472 6962 7574 6f72 732c 2073 contributors, s\n-00000ed0: 6565 2066 696c 6520 4c49 4345 4e53 452e ee file LICENSE.\n-00000ee0: 6d64 2069 6e20 6d6f 6475 6c65 2072 6f6f md in module roo\n-00000ef0: 743c 2f73 7061 6e3e 3c2f 6469 763e 0a3c t
    .<\n-00000f00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00000f10: 3e3c 6120 6964 3d22 6c30 3030 3034 2220 > 4// SPDX\n-00000f70: 2d4c 6963 656e 7365 2d49 6465 6e74 6966 -License-Identif\n-00000f80: 6965 723a 204c 6963 656e 7365 5265 662d ier: LicenseRef-\n-00000f90: 4750 4c2d 322e 302d 6f6e 6c79 2d77 6974 GPL-2.0-only-wit\n-00000fa0: 682d 4455 4e45 2d65 7863 6570 7469 6f6e h-DUNE-exception\n-00000fb0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
    .\n-00000fd0: 3c61 2069 643d 226c 3030 3030 3522 206e 5#if\n-00001030: 6e64 6566 2044 554e 455f 464d 4154 5249 ndef DUNE_FMATRI\n-00001040: 585f 4848 3c2f 7370 616e 3e3c 2f64 6976 X_HH.
    6<\n-000010a0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#define DUNE_FM\n-000010d0: 4154 5249 585f 4848 3c2f 7370 616e 3e3c ATRIX_HH<\n-000010e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00001130: 2020 373c 2f73 7061 6e3e 203c 2f64 6976 7 .
    8<\n-00001190: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#include <cm\n-000011c0: 6174 6826 6774 3b3c 2f73 7061 6e3e 3c2f ath>.
    \n-00001220: 2039 3c2f 7370 616e 3e3c 7370 616e 2063 9#include <\n-00001250: 3b63 7374 6464 6566 2667 743b 3c2f 7370 ;cstddef>
    .
    10#includ\n-000012e0: 6520 266c 743b 696f 7374 7265 616d 2667 e <iostream&g\n-000012f0: 743b 3c2f 7370 616e 3e3c 2f64 6976 3e0a t;
    .\n-00001300: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n-000013e0: 2020 3132 3c2f 7370 616e 3e3c 7370 616e 12#include &\n-00001410: 6c74 3b69 6e69 7469 616c 697a 6572 5f6c lt;initializer_l\n-00001420: 6973 7426 6774 3b3c 2f73 7061 6e3e 3c2f ist>.
    \n-00001480: 3133 3c2f 7370 616e 3e20 3c2f 6469 763e 13
    \n-00001490: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-000014c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 14\n-00001500: 2369 6e63 6c75 6465 2026 6c74 3b3c 6120 #include <\n-00001530: 6475 6e65 2f63 6f6d 6d6f 6e2f 626f 756e dune/common/boun\n-00001540: 6473 6368 6563 6b69 6e67 2e68 683c 2f61 dschecking.hh>.
    15\n-000015b0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #include <<\n-000015e0: 6120 636c 6173 733d 2263 6f64 6522 2068 a class=\"code\" h\n-000015f0: 7265 663d 2261 3030 3334 372e 6874 6d6c ref=\"a00347.html\n-00001600: 223e 6475 6e65 2f63 6f6d 6d6f 6e2f 6578 \">dune/common/ex\n-00001610: 6365 7074 696f 6e73 2e68 683c 2f61 3e26 ceptions.hh&\n-00001620: 6774 3b3c 2f73 7061 6e3e 3c2f 6469 763e gt;
    \n-00001630: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00001730: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00001740: 6e6f 223e 2020 2031 373c 2f73 7061 6e3e no\"> 17
    \n-00001750: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl\n-00001770: 7564 6520 266c 743b 3c61 2063 6c61 7373 ude <dune/\n-000017a0: 636f 6d6d 6f6e 2f64 656e 7365 6d61 7472 common/densematr\n-000017b0: 6978 2e68 683c 2f61 3e26 6774 3b3c 2f73 ix.hh>
    .
    18<\n-00001820: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class=\"prep\n-00001830: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor\">#inclu\n-00001840: 6465 2026 6c74 3b3c 6120 636c 6173 733d de <dune/c\n-00001870: 6f6d 6d6f 6e2f 7072 6563 6973 696f 6e2e ommon/precision.\n-00001880: 6868 3c2f 613e 2667 743b 3c2f 7370 616e hh>
    .
    \n-000018e0: 2020 2031 393c 2f73 7061 6e3e 3c73 7061 19#include \n-00001910: 266c 743b 3c61 2063 6c61 7373 3d22 636f <dune/comm\n-00001940: 6f6e 2f70 726f 6d6f 7469 6f6e 7472 6169 on/promotiontrai\n-00001950: 7473 2e68 683c 2f61 3e26 6774 3b3c 2f73 ts.hh>
    .
    20<\n-000019c0: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class=\"prep\n-000019d0: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor\">#inclu\n-000019e0: 6465 2026 6c74 3b3c 6120 636c 6173 733d de <dune/c\n-00001a10: 6f6d 6d6f 6e2f 7479 7065 7472 6169 7473 ommon/typetraits\n-00001a20: 2e68 683c 2f61 3e26 6774 3b3c 2f73 7061 .hh>
    ..
    22 \n-00001b60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00001bb0: 2020 3233 3c2f 7370 616e 3e3c 7370 616e 23namespace Dune
    \n-00001c20: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00001c90: 6120 6964 3d22 6c30 3030 3235 2220 6e61 a id=\"l00025\" na\n-00001ca0: 6d65 3d22 6c30 3030 3235 223e 3c2f 613e me=\"l00025\">\n-00001cb0: 3c73 7061 6e20 636c 6173 733d 226c 696e 25
    .
    26 <\n-00001d30: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00001d40: 6f72 6422 3e6e 616d 6573 7061 6365 203c ord\">namespace <\n-00001d50: 2f73 7061 6e3e 496d 706c 3c2f 6469 763e /span>Impl
    \n-00001d60: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00001dc0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00001dd0: 3e3c 6120 6964 3d22 6c30 3030 3238 2220 > 28
    .
    29 \n-00001e70: 2020 203c 7370 616e 2063 6c61 7373 3d22 templat\n-00001e90: 653c 2f73 7061 6e3e 266c 743b 3c73 7061 e<class M\n-00001ec0: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    30 \n-00001f20: 2020 203c 7370 616e 2063 6c61 7373 3d22 class <\n-00001f40: 2f73 7061 6e3e 436f 6c75 6d6e 5665 6374 /span>ColumnVect\n-00001f50: 6f72 5669 6577 3c2f 6469 763e 0a3c 6469 orView
    .<\n-00001f70: 6120 6964 3d22 6c30 3030 3331 2220 6e61 a id=\"l00031\" na\n-00001f80: 6d65 3d22 6c30 3030 3331 223e 3c2f 613e me=\"l00031\">\n-00001f90: 3c73 7061 6e20 636c 6173 733d 226c 696e 31 {
    .<\n-00001fd0: 6120 6964 3d22 6c30 3030 3332 2220 6e61 a id=\"l00032\" na\n-00001fe0: 6d65 3d22 6c30 3030 3332 223e 3c2f 613e me=\"l00032\">\n-00001ff0: 3c73 7061 6e20 636c 6173 733d 226c 696e 32 publi\n-00002030: 633c 2f73 7061 6e3e 3a3c 2f64 6976 3e0a c:
    .\n-00002040: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-000020d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-000020e0: 6e6f 223e 2020 2033 343c 2f73 7061 6e3e no\"> 34\n-000020f0: 2020 2020 2020 3c73 7061 6e20 636c 6173 usin\n-00002110: 6720 3c2f 7370 616e 3e76 616c 7565 5f74 g value_t\n-00002120: 7970 6520 3d20 3c73 7061 6e20 636c 6173 ype = type\n-00002140: 6e61 6d65 3c2f 7370 616e 3e20 4d3a 3a76 name M::v\n-00002150: 616c 7565 5f74 7970 653b 3c2f 6469 763e alue_type;\n-00002160: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00002190: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 35 using si\n-000021e0: 7a65 5f74 7970 6520 3d20 3c73 7061 6e20 ze_type = \n-00002200: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n-00002210: 4d3a 3a73 697a 655f 7479 7065 3b3c 2f64 M::size_type;.
    3\n-00002270: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
    .\n-00002280: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n-00002380: 2020 2033 383c 2f73 7061 6e3e 2020 2020 38 \n-00002390: 2020 2020 6d61 7472 6978 5f28 6d61 7472 matrix_(matr\n-000023a0: 6978 292c 3c2f 6469 763e 0a3c 6469 7620 ix),
    .
    39 \n-00002400: 2020 2020 2020 2063 6f6c 5f28 636f 6c29 col_(col)\n-00002410: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00002460: 2020 3430 3c2f 7370 616e 3e20 2020 2020 40 \n-00002470: 207b 7d3c 2f64 6976 3e0a 3c64 6976 2063 {}
    .
    41 <\n-000024d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00002520: 2034 323c 2f73 7061 6e3e 2020 2020 2020 42 \n-00002530: 3c73 7061 6e20 636c 6173 733d 226b 6579 constexpr<\n-00002550: 2f73 7061 6e3e 2073 697a 655f 7479 7065 /span> size_type\n-00002560: 204e 2028 293c 7370 616e 2063 6c61 7373 N () cons\n-00002580: 7420 3c2f 7370 616e 3e7b 3c2f 6469 763e t {
    \n-00002590: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-000025c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 43 return matrix_.N()\n-00002620: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-00002670: 2020 2034 343c 2f73 7061 6e3e 2020 2020 44 \n-00002680: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    45 <\n-000026e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00002730: 2034 363c 2f73 7061 6e3e 2020 2020 2020 46 \n-00002740: 3c73 7061 6e20 636c 6173 733d 226b 6579 template<c\n-00002780: 6c61 7373 203c 2f73 7061 6e3e 4d5f 203d lass M_ =\n-00002790: 204d 2c3c 2f64 6976 3e0a 3c64 6976 2063 M,
    .
    47 \n-000027f0: 2020 2020 2020 7374 643a 3a65 6e61 626c std::enabl\n-00002800: 655f 6966 5f74 266c 743b 7374 643a 3a69 e_if_t<std::i\n-00002810: 735f 7361 6d65 5f76 266c 743b 4d5f 2c4d s_same_v<M_,M\n-00002820: 2667 743b 2061 6e64 206e 6f74 2073 7464 > and not std\n-00002830: 3a3a 6973 5f63 6f6e 7374 5f76 266c 743b ::is_const_v<\n-00002840: 4d5f 2667 743b 2c20 3c73 7061 6e20 636c M_>, int>\n-00002870: 203d 2030 2667 743b 3c2f 6469 763e 0a3c = 0>
    .<\n-00002880: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00002890: 3e3c 6120 6964 3d22 6c30 3030 3438 2220 > 48 c\n-000028f0: 6f6e 7374 6578 7072 3c2f 7370 616e 3e20 onstexpr \n-00002900: 7661 6c75 655f 7479 7065 2661 6d70 3b20 value_type& \n-00002910: 6f70 6572 6174 6f72 5b5d 2028 7369 7a65 operator[] (size\n-00002920: 5f74 7970 6520 726f 7729 207b 3c2f 6469 _type row) {.
    49\n-00002980: 3c2f 7370 616e 3e20 2020 2020 2020 203c <\n-00002990: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-000029a0: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n-000029b0: 2f73 7061 6e3e 206d 6174 7269 785f 5b72 /span> matrix_[r\n-000029c0: 6f77 5d5b 636f 6c5f 5d3b 3c2f 6469 763e ow][col_];
    \n-000029d0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
    53 \n-00002be0: 2020 2020 203c 7370 616e 2063 6c61 7373 r\n-00002c00: 6574 7572 6e3c 2f73 7061 6e3e 206d 6174 eturn mat\n-00002c10: 7269 785f 5b72 6f77 5d5b 636f 6c5f 5d3b rix_[row][col_];\n-00002c20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00002c70: 2020 3534 3c2f 7370 616e 3e20 2020 2020 54 \n-00002c80: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
    .
    55 .
    \n-00002d30: 3536 3c2f 7370 616e 3e20 2020 203c 7370 56 protected:
    .
    57 \n-00002dc0: 2020 2020 204d 2661 6d70 3b20 6d61 7472 M& matr\n-00002dd0: 6978 5f3b 3c2f 6469 763e 0a3c 6469 7620 ix_;
    .
    58 \n-00002e30: 2020 2020 203c 7370 616e 2063 6c61 7373 const\n-00002e50: 3c2f 7370 616e 3e20 7369 7a65 5f74 7970 size_typ\n-00002e60: 6520 636f 6c5f 3b3c 2f64 6976 3e0a 3c64 e col_;
    .\n-00002e80: 3c61 2069 643d 226c 3030 3035 3922 206e 59 };
    .<\n-00002ed0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00002ee0: 3e3c 6120 6964 3d22 6c30 3030 3630 2220 > 60
    .
    61 \n-00002f80: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
    .
    62 .
    \n-00003030: 3633 3c2f 7370 616e 3e20 203c 7370 616e 63 template\n-00003060: 266c 743b 3c73 7061 6e20 636c 6173 733d <typena\n-00003080: 6d65 3c2f 7370 616e 3e20 4d26 6774 3b3c me M><\n-00003090: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-000030e0: 2036 343c 2f73 7061 6e3e 2020 3c73 7061 64 struct \n-00003110: 4669 656c 6454 7261 6974 7326 6c74 3b20 FieldTraits< \n-00003120: 496d 706c 3a3a 436f 6c75 6d6e 5665 6374 Impl::ColumnVect\n-00003130: 6f72 5669 6577 266c 743b 4d26 6774 3b20 orView<M> \n-00003140: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    65 \n-000031a0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    ..
    \n-00003370: 2020 3637 3c2f 7370 616e 3e20 2020 203c 67 <\n-00003380: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00003390: 6f72 6422 3e75 7369 6e67 203c 2f73 7061 ord\">using real_type \n-00003400: 3d20 3c73 7061 6e20 636c 6173 733d 226b = typename\n-00003420: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 FieldTra\n-00003480: 6974 7326 6c74 3b4d 2667 743b 3a3a 7265 its<M>::re\n-00003490: 616c 5f74 7970 653c 2f61 3e3b 3c2f 6469 al_type;..
    82 \n-000036f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00003740: 2020 3833 3c2f 7370 616e 3e20 3c2f 6469 83 .
    84\n-000037a0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 t\n-000037c0: 656d 706c 6174 653c 2f73 7061 6e3e 266c emplate&l\n-000037d0: 743b 203c 7370 616e 2063 6c61 7373 3d22 t; class K, int RO\n-00003820: 5753 2c20 3c73 7061 6e20 636c 6173 733d WS, in\n-00003840: 743c 2f73 7061 6e3e 2043 4f4c 5320 2667 t COLS &g\n-00003850: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    .
    .\n-000038a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    89 \n-00003c70: 203c 7370 616e 2063 6c61 7373 3d22 636f // each r\n-00003c90: 6f77 2069 7320 696d 706c 656d 656e 7465 ow is implemente\n-00003ca0: 6420 6279 2061 2066 6965 6c64 2076 6563 d by a field vec\n-00003cb0: 746f 723c 2f73 7061 6e3e 3c2f 6469 763e tor
    \n-00003cc0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00003cf0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n-00003d50: 2039 303c 2f61 3e3c 2f73 7061 6e3e 2020 90 \n-00003d60: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef<\n-00003d80: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldVector&l\n-00003dc0: 743b 4b2c 434f 4c53 2667 743b 3c2f 613e t;K,COLS>\n-00003dd0: 203c 6120 636c 6173 733d 2263 6f64 6520 row_type;.
    \n-00003e80: 3931 3c2f 7370 616e 3e20 3c2f 6469 763e 91
    \n-00003e90: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00003ec0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n-00003f20: 2039 323c 2f61 3e3c 2f73 7061 6e3e 2020 92 \n-00003f30: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef<\n-00003f50: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> row_type \n-00003f90: 2661 6d70 3b3c 6120 636c 6173 733d 2263 &row_referen\n-00003ff0: 6365 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 ce;
    .\n-00004010: 3c61 2069 643d 226c 3030 3039 3322 206e 93\n-00004090: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c
    <\n-000040a0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-000040b0: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord\">typedef const<\n-000040e0: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> row_type \n-00004120: 2661 6d70 3b3c 6120 636c 6173 733d 2263 &const_row_r\n-00004180: 6566 6572 656e 6365 3c2f 613e 3b3c 2f64 eference;.
    9\n-000041e0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n-000041f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-00004220: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> \n-00004280: 3935 3c2f 613e 3c2f 7370 616e 3e20 2020 95 \n-00004290: 203c 7370 616e 2063 6c61 7373 3d22 6b65 typedef std::array\n-000042c0: 266c 743b 726f 775f 7479 7065 2c52 4f57 <row_type,ROW\n-000042d0: 5326 6774 3b20 3c61 2063 6c61 7373 3d22 S> container_\n-00004330: 7479 7065 3c2f 613e 3b3c 2f64 6976 3e0a type;
    .\n-00004340: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-00004480: 3c61 2069 643d 226c 3030 3039 3722 206e 97\n-00004500: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c
    <\n-00004510: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00004520: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord\">typedef typena\n-00004550: 6d65 3c2f 7370 616e 3e20 636f 6e74 6169 me contai\n-00004560: 6e65 725f 7479 7065 3a3a 7369 7a65 5f74 ner_type::size_t\n-00004570: 7970 6520 3c61 2063 6c61 7373 3d22 636f ype size_type;
    .
    98 }\n-00004630: 3b3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c ;
    .
    .<\n-00004640: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00004650: 3e3c 6120 6964 3d22 6c30 3030 3939 2220 > 99
    .
    100 \n-000046f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n-00004710: 2f73 7061 6e3e 266c 743b 203c 7370 616e /span>< class K,\n-00004740: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int ROWS, int\n-00004790: 2043 4f4c 5320 2667 743b 3c2f 6469 763e COLS >
    \n-000047a0: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
    .
    \n-00004830: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 101 struc\n-00004880: 7420 3c2f 7370 616e 3e3c 6120 636c 6173 t FieldTrait\n-000048c0: 733c 2f61 3e26 6c74 3b20 3c61 2063 6c61 s< FieldMatri\n-00004900: 783c 2f61 3e26 6c74 3b4b 2c52 4f57 532c x<K,ROWS,\n-00004910: 434f 4c53 2667 743b 2026 6774 3b3c 2f64 COLS> >.
    10\n-00004970: 323c 2f73 7061 6e3e 2020 7b3c 2f64 6976 2 {.
    \n-00004a10: 2031 3033 3c2f 613e 3c2f 7370 616e 3e20 103 \n-00004a20: 2020 203c 7370 616e 2063 6c61 7373 3d22 typedef\n-00004a40: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c ty\n-00004a60: 7065 6e61 6d65 3c2f 7370 616e 3e20 3c61 pename Fi\n-00004ac0: 656c 6454 7261 6974 7326 6c74 3b4b 2667 eldTraits<K&g\n-00004ad0: 743b 3a3a 6669 656c 645f 7479 7065 3c2f t;::field_type field_type;
    .
    104<\n-00004be0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-00004c00: 7479 7065 6465 663c 2f73 7061 6e3e 203c typedef <\n-00004c10: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00004c20: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord\">typename FieldTraits\n-00004c90: 266c 743b 4b26 6774 3b3a 3a72 6561 6c5f <K>::real_\n-00004ca0: 7479 7065 3c2f 613e 203c 6120 636c 6173 type real_ty\n-00004d00: 7065 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 pe;
    .\n-00004d20: 3c61 2069 643d 226c 3030 3130 3522 206e 105 };
    ..
    10\n-00004dc0: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
    .\n-00004dd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-00004e00: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 115 temp\n-00004e40: 6c61 7465 3c2f 7370 616e 3e26 6c74 3b3c late<<\n-00004e50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00004e60: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord\">class K, i\n-00004e90: 6e74 3c2f 7370 616e 3e20 524f 5753 2c20 nt ROWS, \n-00004ea0: 3c73 7061 6e20 636c 6173 733d 226b 6579 int COLS>.
    .
    116<\n-00004f90: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> cl\n-00004fb0: 6173 7320 3c2f 7370 616e 3e3c 6120 636c ass FieldMatr\n-00004ff0: 6978 3c2f 613e 203a 203c 7370 616e 2063 ix : p\n-00005010: 7562 6c69 633c 2f73 7061 6e3e 203c 6120 ublic DenseMa\n-00005050: 7472 6978 3c2f 613e 266c 743b 2046 6965 trix< Fie\n-00005060: 6c64 4d61 7472 6978 266c 743b 4b2c 524f ldMatrix<K,RO\n-00005070: 5753 2c43 4f4c 5326 6774 3b20 2667 743b WS,COLS> >\n-00005080: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000050d0: 2031 3137 3c2f 7370 616e 3e20 207b 3c2f 117 {.
    1\n-00005130: 3138 3c2f 7370 616e 3e20 2020 2073 7464 18 std\n-00005140: 3a3a 6172 7261 7926 6c74 3b20 4669 656c ::array< Fiel\n-00005150: 6456 6563 746f 7226 6c74 3b4b 2c43 4f4c dVector<K,COL\n-00005160: 5326 6774 3b2c 2052 4f57 5320 2667 743b S>, ROWS >\n-00005170: 205f 6461 7461 3b3c 2f64 6976 3e0a 3c64 _data;
    .\n-00005190: 3c61 2069 643d 226c 3030 3131 3922 206e 119 type\n-000051f0: 6465 663c 2f73 7061 6e3e 203c 6120 636c def DenseMatr\n-00005230: 6978 266c 743b 2046 6965 6c64 4d61 7472 ix< FieldMatr\n-00005240: 6978 266c 743b 4b2c 524f 5753 2c43 4f4c ix<K,ROWS,COL\n-00005250: 5326 6774 3b3c 2f61 3e20 2667 743b 203c S> > <\n-00005260: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-00005270: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n-00005280: 3134 3030 2e68 746d 6c22 3e42 6173 653c 1400.html\">Base<\n-00005290: 2f61 3e3b 3c2f 6469 763e 0a3c 6469 7620 /a>;
    .
    120 \n-000052f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 public:
    .<\n-00005350: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00005360: 6e6f 223e 2020 3132 313c 2f73 7061 6e3e no\"> 121\n-00005370: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-000053c0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 123 c\n-00005430: 6f6e 7374 6578 7072 3c2f 7370 616e 3e20 onstexpr \n-00005440: 3c73 7061 6e20 636c 6173 733d 226b 6579 static in\n-00005480: 743c 2f73 7061 6e3e 203c 6120 636c 6173 t rows = ROWS;
    \n-000054f0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00005520: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n-00005580: 3132 353c 2f61 3e3c 2f73 7061 6e3e 2020 125 \n-00005590: 2020 3c73 7061 6e20 636c 6173 733d 226b constexp\n-000055b0: 723c 2f73 7061 6e3e 203c 7370 616e 2063 r s\n-000055d0: 7461 7469 633c 2f73 7061 6e3e 203c 7370 tatic int cols = CO\n-00005660: 4c53 3b3c 2f64 6976 3e0a 3c64 6976 2063 LS;
    .
    126 <\n+000001c0: 666c 6f61 745f 636d 702e 6868 2053 6f75 float_cmp.hh Sou\n+000001d0: 7263 6520 4669 6c65 3c2f 7469 746c 653e rce File\n+000001e0: 0a3c 6c69 6e6b 2068 7265 663d 2274 6162 ...\n+00000290: 0a3c 6c69 6e6b 2068 7265 663d 2273 6561 .....<\n+00000670: 7363 7269 7074 2074 7970 653d 2274 6578 script type=\"tex\n+00000680: 742f 6a61 7661 7363 7269 7074 223e 0a2f t/javascript\">./\n+00000690: 2a20 406c 6963 656e 7365 206d 6167 6e65 * @license magne\n+000006a0: 743a 3f78 743d 7572 6e3a 6274 6968 3a64 t:?xt=urn:btih:d\n+000006b0: 3364 3961 3961 3635 3935 3532 3166 3936 3d9a9a6595521f96\n+000006c0: 3636 6135 6539 3463 6338 3330 6461 6238 66a5e94cc830dab8\n+000006d0: 3362 3635 3639 3926 616d 703b 646e 3d65 3b65699&dn=e\n+000006e0: 7870 6174 2e74 7874 204d 4954 202a 2f0a xpat.txt MIT */.\n+000006f0: 2428 6675 6e63 7469 6f6e 2829 207b 0a20 $(function() {. \n+00000700: 2069 6e69 744d 656e 7528 2727 2c74 7275 initMenu('',tru\n+00000710: 652c 6661 6c73 652c 2773 6561 7263 682e e,false,'search.\n+00000720: 7068 7027 2c27 5365 6172 6368 2729 3b0a php','Search');.\n+00000730: 2020 2428 646f 6375 6d65 6e74 292e 7265 $(document).re\n+00000740: 6164 7928 6675 6e63 7469 6f6e 2829 207b ady(function() {\n+00000750: 2069 6e69 745f 7365 6172 6368 2829 3b20 init_search(); \n+00000760: 7d29 3b0a 7d29 3b0a 2f2a 2040 6c69 6365 });.});./* @lice\n+00000770: 6e73 652d 656e 6420 2a2f 0a3c 2f73 6372 nse-end */..
    .<\n+000007a0: 7363 7269 7074 2074 7970 653d 2274 6578 script type=\"tex\n+000007b0: 742f 6a61 7661 7363 7269 7074 223e 0a2f t/javascript\">./\n+000007c0: 2a20 406c 6963 656e 7365 206d 6167 6e65 * @license magne\n+000007d0: 743a 3f78 743d 7572 6e3a 6274 6968 3a64 t:?xt=urn:btih:d\n+000007e0: 3364 3961 3961 3635 3935 3532 3166 3936 3d9a9a6595521f96\n+000007f0: 3636 6135 6539 3463 6338 3330 6461 6238 66a5e94cc830dab8\n+00000800: 3362 3635 3639 3926 616d 703b 646e 3d65 3b65699&dn=e\n+00000810: 7870 6174 2e74 7874 204d 4954 202a 2f0a xpat.txt MIT */.\n+00000820: 2428 646f 6375 6d65 6e74 292e 7265 6164 $(document).read\n+00000830: 7928 6675 6e63 7469 6f6e 2829 207b 2069 y(function() { i\n+00000840: 6e69 745f 636f 6465 666f 6c64 2830 293b nit_codefold(0);\n+00000850: 207d 293b 0a2f 2a20 406c 6963 656e 7365 });./* @license\n+00000860: 2d65 6e64 202a 2f0a 3c2f 7363 7269 7074 -end */....
    ..\n+00000970: 3c21 2d2d 2069 6672 616d 6520 7368 6f77 .<\n+000009b0: 6469 7620 6964 3d22 4d53 6561 7263 6852 div id=\"MSearchR\n+000009c0: 6573 756c 7473 5769 6e64 6f77 223e 0a3c esultsWindow\">.<\n+000009d0: 6469 7620 6964 3d22 4d53 6561 7263 6852 div id=\"MSearchR\n+000009e0: 6573 756c 7473 223e 0a3c 6469 7620 636c esults\">.
    .\n+00000a10: 0a3c 6469 7620 6964 3d22 5352 5265 7375 .
    .L\n+00000a50: 6f61 6469 6e67 2e2e 2e3c 2f64 6976 3e0a oading...
    .\n+00000a60: 3c64 6976 2063 6c61 7373 3d22 5352 5374
    Searching..\n+00000a90: 2e3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
    .
    No \n+00000ac0: 4d61 7463 6865 733c 2f64 6976 3e0a 3c2f Matches
    ..
    ..
    ...
    .
    . \n+00000c10: 203c 6469 7620 636c 6173 733d 2268 6561
    flo\n+00000c40: 6174 5f63 6d70 2e68 683c 2f64 6976 3e3c at_cmp.hh
    <\n+00000c50: 2f64 6976 3e0a 3c2f 6469 763e 3c21 2d2d /div>.
    .
    \n+00000c80: 0a3c 6120 6872 6566 3d22 6130 3031 3235 .Go to the\n+00000ca0: 2064 6f63 756d 656e 7461 7469 6f6e 206f documentation o\n+00000cb0: 6620 7468 6973 2066 696c 652e 3c2f 613e f this file.\n+00000cc0: 3c64 6976 2063 6c61 7373 3d22 6672 6167
    \n+00000d20: 2020 313c 2f73 7061 6e3e 3c73 7061 6e20 1\n+00000d40: 2f2f 202d 2a2d 2074 6162 2d77 6964 7468 // -*- tab-width\n+00000d50: 3a20 343b 2069 6e64 656e 742d 7461 6273 : 4; indent-tabs\n+00000d60: 2d6d 6f64 653a 206e 696c 3b20 632d 6261 -mode: nil; c-ba\n+00000d70: 7369 632d 6f66 6673 6574 3a20 3220 2d2a sic-offset: 2 -*\n+00000d80: 2d3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c -
    .<\n+00000d90: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00000da0: 3e3c 6120 6964 3d22 6c30 3030 3032 2220 > 2// vi: \n+00000e00: 7365 7420 6574 2074 733d 3420 7377 3d32 set et ts=4 sw=2\n+00000e10: 2073 7473 3d32 3a3c 2f73 7061 6e3e 3c2f sts=2:.
    \n+00000e70: 2033 3c2f 7370 616e 3e3c 7370 616e 2063 3/\n+00000e90: 2f20 5350 4458 2d46 696c 6543 6f70 7972 / SPDX-FileCopyr\n+00000ea0: 6967 6874 496e 666f 3a20 436f 7079 7269 ightInfo: Copyri\n+00000eb0: 6768 7420 2843 2920 4455 4e45 2050 726f ght (C) DUNE Pro\n+00000ec0: 6a65 6374 2063 6f6e 7472 6962 7574 6f72 ject contributor\n+00000ed0: 732c 2073 6565 2066 696c 6520 4c49 4345 s, see file LICE\n+00000ee0: 4e53 452e 6d64 2069 6e20 6d6f 6475 6c65 NSE.md in module\n+00000ef0: 2072 6f6f 743c 2f73 7061 6e3e 3c2f 6469 root.
    4\n+00000f50: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 // \n+00000f70: 5350 4458 2d4c 6963 656e 7365 2d49 6465 SPDX-License-Ide\n+00000f80: 6e74 6966 6965 723a 204c 6963 656e 7365 ntifier: License\n+00000f90: 5265 662d 4750 4c2d 322e 302d 6f6e 6c79 Ref-GPL-2.0-only\n+00000fa0: 2d77 6974 682d 4455 4e45 2d65 7863 6570 -with-DUNE-excep\n+00000fb0: 7469 6f6e 3c2f 7370 616e 3e3c 2f64 6976 tion.
    5<\n+00001010: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#ifndef DUNE_CO\n+00001040: 4d4d 4f4e 5f46 4c4f 4154 5f43 4d50 5f48 MMON_FLOAT_CMP_H\n+00001050: 483c 2f73 7061 6e3e 3c2f 6469 763e 0a3c H
    .<\n+00001060: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00001070: 3e3c 6120 6964 3d22 6c30 3030 3036 2220 > 6#d\n+000010d0: 6566 696e 6520 4455 4e45 5f43 4f4d 4d4f efine DUNE_COMMO\n+000010e0: 4e5f 464c 4f41 545f 434d 505f 4848 3c2f N_FLOAT_CMP_HH
    .<\n+00001130: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00001140: 6e6f 223e 2020 2020 373c 2f73 7061 6e3e no\"> 7\n+00001150: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+000011a0: 2020 2039 373c 2f73 7061 6e3e 3c73 7061 97namespace Dune {.
    10\n+00001260: 303c 2f73 7061 6e3e 2020 3c73 7061 6e20 0 \n+00001280: 6e61 6d65 7370 6163 6520 3c2f 7370 616e namespace FloatCmp {.
    101<\n+000012f0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00001310: 2f2f 2062 6173 6963 2063 6f6e 7374 616e // basic constan\n+00001320: 7473 3c2f 7370 616e 3e3c 2f64 6976 3e0a ts
    .\n+00001330: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
    .
    <\n+000013c0: 6120 636c 6173 733d 226c 696e 6522 2068 a class=\"line\" h\n+000013d0: 7265 663d 2261 3030 3430 392e 6874 6d6c ref=\"a00409.html\n+000013e0: 2367 6134 6165 6237 3539 6564 3964 6538 #ga4aeb759ed9de8\n+000013f0: 6234 3737 6131 3535 3439 3261 6562 3237 b477a155492aeb27\n+00001400: 3839 6222 3e20 2031 3034 3c2f 613e 3c2f 89b\"> 104 e\n+00001430: 6e75 6d3c 2f73 7061 6e3e 203c 6120 636c num \n+00001490: 436d 7053 7479 6c65 3c2f 613e 207b 3c2f CmpStyle {.
    106 \n+000015e0: 7265 6c61 7469 7665 5765 616b 3c2f 613e relativeWeak\n+000015f0: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
    .
    \n+00001640: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 108 relativeStron\n+00001740: 673c 2f61 3e2c 3c2f 6469 763e 0a3c 6469 g,
    .<\n+00001760: 6120 6964 3d22 6c30 3031 3130 2220 6e61 a id=\"l00110\" na\n+00001770: 6d65 3d22 6c30 3031 3130 223e 3c2f 613e me=\"l00110\">\n+00001780: 3c73 7061 6e20 636c 6173 733d 226c 696e 1\n+00001800: 3130 3c2f 613e 3c2f 7370 616e 3e20 2020 10 \n+00001810: 2020 203c 6120 636c 6173 733d 2263 6f64 absolute\n+00001890: 3c2f 613e 2c3c 2f64 6976 3e0a 3c64 6976 ,
    .<\n+000018d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000018e0: 6e6f 223e 2020 3131 323c 2f73 7061 6e3e no\"> 112\n+000018f0: 2020 2020 2020 3c61 2063 6c61 7373 3d22 defau\n+00001970: 6c74 436d 7053 7479 6c65 3c2f 613e 203d ltCmpStyle =\n+00001980: 203c 6120 636c 6173 733d 2263 6f64 6520 relativeWe\n+00001a00: 616b 3c2f 613e 3c2f 6469 763e 0a3c 6469 ak
    .<\n+00001a20: 6120 6964 3d22 6c30 3031 3133 2220 6e61 a id=\"l00113\" na\n+00001a30: 6d65 3d22 6c30 3031 3133 223e 3c2f 613e me=\"l00113\">\n+00001a40: 3c73 7061 6e20 636c 6173 733d 226c 696e 1\n+00001ac0: 3133 3c2f 613e 3c2f 7370 616e 3e20 2020 13 \n+00001ad0: 207d 3b3c 2f64 6976 3e0a 3c2f 6469 763e };
    .
    \n+00001ae0: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
    .
    \n+00001b70: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 116<\n+00001bc0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00001be0: 656e 756d 3c2f 7370 616e 3e20 3c61 2063 enum RoundingStyle {
    ..<\n+00001de0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00001df0: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no\"> 12\n+00001e60: 303c 2f61 3e3c 2f73 7061 6e3e 2020 2020 0 \n+00001e70: 2020 3c61 2063 6c61 7373 3d22 636f 6465 towardInf\n+00001ef0: 3c2f 613e 2c3c 2f64 6976 3e0a 3c64 6976 ,
    .<\n+00001f30: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00001f40: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no\"> 12\n+00001fb0: 323c 2f61 3e3c 2f73 7061 6e3e 2020 2020 2 \n+00001fc0: 2020 3c61 2063 6c61 7373 3d22 636f 6465 downward<\n+00002040: 2f61 3e2c 3c2f 6469 763e 0a3c 6469 7620 /a>,
    .
    124\n+00002100: 3c2f 613e 3c2f 7370 616e 3e20 2020 2020 \n+00002110: 203c 6120 636c 6173 733d 2263 6f64 6520 upward\n+00002190: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
    .
    \n+000021e0: 2020 3132 363c 2f73 7061 6e3e 2020 2020 126 \n+000021f0: 2020 3c61 2063 6c61 7373 3d22 636f 6465 defaultRo\n+00002270: 756e 6469 6e67 5374 796c 653c 2f61 3e20 undingStyle \n+00002280: 3d20 3c61 2063 6c61 7373 3d22 636f 6465 = towardZer\n+00002300: 6f3c 2f61 3e3c 2f64 6976 3e0a 3c64 6976 o
    .<\n+00002340: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00002350: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no\"> 12\n+000023c0: 373c 2f61 3e3c 2f73 7061 6e3e 2020 2020 7 \n+000023d0: 7d3b 3c2f 6469 763e 0a3c 2f64 6976 3e0a };
    .
    .\n+000023e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00002470: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00002480: 6e6f 223e 2020 3132 393c 2f73 7061 6e3e no\"> 129\n+00002490: 2020 2020 3c73 7061 6e20 636c 6173 733d templa\n+000024b0: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<class \n+000024e0: 5426 6774 3b20 3c73 7061 6e20 636c 6173 T> stru\n+00002500: 6374 203c 2f73 7061 6e3e 4570 7369 6c6f ct Epsilo\n+00002510: 6e54 7970 653b 3c2f 6469 763e 0a3c 6469 nType;
    .<\n+00002530: 6120 6964 3d22 6c30 3031 3330 2220 6e61 a id=\"l00130\" na\n+00002540: 6d65 3d22 6c30 3031 3330 223e 3c2f 613e me=\"l00130\">\n+00002550: 3c73 7061 6e20 636c 6173 733d 226c 696e 130
    .
    132 .
    1\n+00002620: 3337 3c2f 7370 616e 3e20 2020 203c 7370 37 template<clas\n+00002670: 733c 2f73 7061 6e3e 2054 2c20 436d 7053 s T, CmpS\n+00002680: 7479 6c65 2073 7479 6c65 203d 2064 6566 tyle style = def\n+00002690: 6175 6c74 436d 7053 7479 6c65 2667 743b aultCmpStyle>\n+000026a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    .\n+00002700: 3c61 2069 643d 226c 3030 3133 3822 206e 138 struct De\n+000027c0: 6661 756c 7445 7073 696c 6f6e 3c2f 613e faultEpsilon\n+000027d0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    140<\n+00002870: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> static \n+000028a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename EpsilonTyp\n+00002920: 6526 6c74 3b54 2667 743b 3a3a 5479 7065 e<T>::Type\n+00002930: 3c2f 613e 203c 6120 636c 6173 733d 2263 value(\n+00002990: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );
    .
    141 \n+000029f0: 207d 3b3c 2f64 6976 3e0a 3c2f 6469 763e };
    .
    \n+00002a00: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00002a70: 6120 6964 3d22 6c30 3031 3433 2220 6e61 a id=\"l00143\" na\n+00002a80: 6d65 3d22 6c30 3031 3433 223e 3c2f 613e me=\"l00143\">\n+00002a90: 3c73 7061 6e20 636c 6173 733d 226c 696e 143 // op\n+00002ad0: 6572 6174 696f 6e73 2069 6e20 6675 6e63 erations in func\n+00002ae0: 7469 6f6e 616c 2073 7479 6c65 3c2f 7370 tional style
    .
    144 <\n+00002b50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00002ba0: 3134 373c 2f73 7061 6e3e 203c 2f64 6976 147 .
    149<\n+00002c00: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n+00002c20: 3c61 2069 643d 226c 3030 3135 3622 206e 156 temp\n+00002c80: 6c61 7465 3c2f 7370 616e 3e20 266c 743b late <\n+00002c90: 3c73 7061 6e20 636c 6173 733d 226b 6579 class T, CmpSt\n+00002d10: 796c 653c 2f61 3e20 7374 796c 6520 3c73 yle style /*= defaultC\n+00002d40: 6d70 5374 796c 652a 2f3c 2f73 7061 6e3e mpStyle*/\n+00002d50: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    157 \n+00002db0: 2020 203c 7370 616e 2063 6c61 7373 3d22 boo\n+00002dd0: 6c3c 2f73 7061 6e3e 203c 6120 636c 6173 l eq(const T &firs\n+00002e60: 742c 3c2f 6469 763e 0a3c 6469 7620 636c t,
    .
    158 \n+00002ec0: 2020 2020 2020 2020 203c 7370 616e 2063 c\n+00002ee0: 6f6e 7374 3c2f 7370 616e 3e20 5420 2661 onst T &a\n+00002ef0: 6d70 3b73 6563 6f6e 642c 3c2f 6469 763e mp;second,
    \n+00002f00: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+00003060: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+000030d0: 6120 6964 3d22 6c30 3031 3639 2220 6e61 a id=\"l00169\" na\n+000030e0: 6d65 3d22 6c30 3031 3639 223e 3c2f 613e me=\"l00169\">\n+000030f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 169 templ\n+00003130: 6174 653c 2f73 7061 6e3e 2026 6c74 3b3c ate <<\n+00003140: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00003150: 6f72 6422 3e63 6c61 7373 203c 2f73 7061 ord\">class T, CmpSty\n+000031c0: 6c65 3c2f 613e 2073 7479 6c65 203c 7370 le style /*= defaultCm\n+000031f0: 7053 7479 6c65 2a2f 3c2f 7370 616e 3e26 pStyle*/&\n+00003200: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    170 \n+00003260: 2020 3c73 7061 6e20 636c 6173 733d 226b bool\n+00003280: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 ne\n+000032e0: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (const T &first\n+00003310: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
    .
    \n+00003360: 2020 3137 313c 2f73 7061 6e3e 2020 2020 171 \n+00003370: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n+00003390: 6e73 743c 2f73 7061 6e3e 2054 2026 616d nst T &am\n+000033a0: 703b 7365 636f 6e64 2c3c 2f64 6976 3e0a p;second,
    .\n+000033b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+000033e0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 172 \n+00003410: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename EpsilonTyp\n+00003490: 6526 6c74 3b54 2667 743b 3a3a 5479 7065 e<T>::Type\n+000034a0: 3c2f 613e 2065 7073 696c 6f6e 203d 203c epsilon = <\n+000034b0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+000034c0: 5f73 7472 7563 7422 2068 7265 663d 2261 _struct\" href=\"a\n+000034d0: 3031 3731 362e 6874 6d6c 223e 4465 6661 01716.html\">Defa\n+000034e0: 756c 7445 7073 696c 6f6e 266c 743b 542c ultEpsilon<T,\n+000034f0: 2073 7479 6c65 2667 743b 3a3a 7661 6c75 style>::valu\n+00003500: 653c 2f61 3e28 2929 3b3c 2f64 6976 3e0a e());
    .\n+00003510: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+000035a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000035b0: 6e6f 223e 2020 3138 353c 2f73 7061 6e3e no\"> 185\n+000035c0: 2020 2020 3c73 7061 6e20 636c 6173 733d templa\n+000035e0: 7465 3c2f 7370 616e 3e20 266c 743b 3c73 te <class T, CmpStyl\n+00003670: 653c 2f61 3e20 7374 796c 6520 3c73 7061 e style /*= defaultCmp\n+000036a0: 5374 796c 652a 2f3c 2f73 7061 6e3e 2667 Style*/&g\n+000036b0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    .
    186 \n+00003710: 203c 7370 616e 2063 6c61 7373 3d22 6b65 bool<\n+00003730: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> gt(\n+00003790: 3c73 7061 6e20 636c 6173 733d 226b 6579 const T &first,\n+000037c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00003810: 2031 3837 3c2f 7370 616e 3e20 2020 2020 187 \n+00003820: 2020 2020 2020 203c 7370 616e 2063 6c61 con\n+00003840: 7374 3c2f 7370 616e 3e20 5420 2661 6d70 st T &\n+00003850: 3b73 6563 6f6e 642c 3c2f 6469 763e 0a3c ;second,
    .<\n+00003860: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00003870: 3e3c 6120 6964 3d22 6c30 3031 3838 2220 > 188 <\n+000038c0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+000038d0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord\">typename EpsilonType\n+00003940: 266c 743b 5426 6774 3b3a 3a54 7970 653c <T>::Type<\n+00003950: 2f61 3e20 6570 7369 6c6f 6e20 3d20 3c61 /a> epsilon = Defau\n+00003990: 6c74 4570 7369 6c6f 6e26 6c74 3b54 2c20 ltEpsilon<T, \n+000039a0: 7374 796c 6526 6774 3b3a 3a76 616c 7565 style>::value\n+000039b0: 3c2f 613e 2829 293b 3c2f 6469 763e 0a3c ());
    .<\n+000039c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000039d0: 3e3c 6120 6964 3d22 6c30 3031 3930 2220 > 190 .
    201 \n+00003a70: 2020 203c 7370 616e 2063 6c61 7373 3d22 templat\n+00003a90: 653c 2f73 7061 6e3e 2026 6c74 3b3c 7370 e <class \n+00003ac0: 542c 203c 6120 636c 6173 733d 2263 6f64 T, CmpStyle\n+00003b20: 3c2f 613e 2073 7479 6c65 203c 7370 616e style /*= defaultCmpS\n+00003b50: 7479 6c65 2a2f 3c2f 7370 616e 3e26 6774 tyle*/>\n+00003b60: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+00003bb0: 2020 3230 323c 2f73 7061 6e3e 2020 2020 202 \n+00003bc0: 3c73 7061 6e20 636c 6173 733d 226b 6579 bool lt(<\n+00003c40: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00003c50: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const T &first,<\n+00003c70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00003cc0: 3230 333c 2f73 7061 6e3e 2020 2020 2020 203 \n+00003cd0: 2020 2020 2020 3c73 7061 6e20 636c 6173 cons\n+00003cf0: 743c 2f73 7061 6e3e 2054 2026 616d 703b t T &\n+00003d00: 7365 636f 6e64 2c3c 2f64 6976 3e0a 3c64 second,
    .\n+00003d20: 3c61 2069 643d 226c 3030 3230 3422 206e 204 typename EpsilonType&\n+00003df0: 6c74 3b54 2667 743b 3a3a 5479 7065 3c2f lt;T>::Type epsilon = Defaul\n+00003e40: 7445 7073 696c 6f6e 266c 743b 542c 2073 tEpsilon<T, s\n+00003e50: 7479 6c65 2667 743b 3a3a 7661 6c75 653c tyle>::value<\n+00003e60: 2f61 3e28 2929 3b3c 2f64 6976 3e0a 3c64 /a>());
    .\n+00003e80: 3c61 2069 643d 226c 3030 3230 3622 206e 206 .
    217 \n+00003f20: 2020 3c73 7061 6e20 636c 6173 733d 226b template\n+00003f40: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <class T\n+00003f70: 2c20 3c61 2063 6c61 7373 3d22 636f 6465 , CmpStyle<\n+00003fd0: 2f61 3e20 7374 796c 6520 3c73 7061 6e20 /a> style \n+00003ff0: 2f2a 3d20 6465 6661 756c 7443 6d70 5374 /*= defaultCmpSt\n+00004000: 796c 652a 2f3c 2f73 7061 6e3e 2667 743b yle*/>\n+00004010: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00004060: 2032 3138 3c2f 7370 616e 3e20 2020 203c 218 <\n+00004070: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00004080: 6f72 6474 7970 6522 3e62 6f6f 6c3c 2f73 ordtype\">bool ge(const\n+00004110: 2054 2026 616d 703b 6669 7273 742c 3c2f T &first,.
    2\n+00004170: 3139 3c2f 7370 616e 3e20 2020 2020 2020 19 \n+00004180: 2020 2020 203c 7370 616e 2063 6c61 7373 const\n+000041a0: 3c2f 7370 616e 3e20 5420 2661 6d70 3b73 T &s\n+000041b0: 6563 6f6e 642c 3c2f 6469 763e 0a3c 6469 econd,
    .<\n+000041d0: 6120 6964 3d22 6c30 3032 3230 2220 6e61 a id=\"l00220\" na\n+000041e0: 6d65 3d22 6c30 3032 3230 223e 3c2f 613e me=\"l00220\">\n+000041f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 220 typename EpsilonType&l\n+000042a0: 743b 5426 6774 3b3a 3a54 7970 653c 2f61 t;T>::Type epsilon = Default\n+000042f0: 4570 7369 6c6f 6e26 6c74 3b54 2c20 7374 Epsilon<T, st\n+00004300: 796c 6526 6774 3b3a 3a76 616c 7565 3c2f yle>::value());
    .<\n+00004330: 6120 6964 3d22 6c30 3032 3232 2220 6e61 a id=\"l00222\" na\n+00004340: 6d65 3d22 6c30 3032 3232 223e 3c2f 613e me=\"l00222\">\n+00004350: 3c73 7061 6e20 636c 6173 733d 226c 696e 222 .
    233 \n+000043d0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n+000043f0: 2f73 7061 6e3e 2026 6c74 3b3c 7370 616e /span> <class T,\n+00004420: 203c 6120 636c 6173 733d 2263 6f64 6520 CmpStyle style /\n+000044a0: 2a3d 2064 6566 6175 6c74 436d 7053 7479 *= defaultCmpSty\n+000044b0: 6c65 2a2f 3c2f 7370 616e 3e26 6774 3b3c le*/><\n+000044c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00004510: 3233 343c 2f73 7061 6e3e 2020 2020 3c73 234 bool le(const \n+000045c0: 5420 2661 6d70 3b66 6972 7374 2c3c 2f64 T &first,.
    23\n+00004620: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 \n+00004630: 2020 2020 3c73 7061 6e20 636c 6173 733d const<\n+00004650: 2f73 7061 6e3e 2054 2026 616d 703b 7365 /span> T &se\n+00004660: 636f 6e64 2c3c 2f64 6976 3e0a 3c64 6976 cond,
    .<\n+000046a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000046b0: 6e6f 223e 2020 3233 363c 2f73 7061 6e3e no\"> 236\n+000046c0: 2020 2020 2020 2020 2020 2020 3c73 7061 typename EpsilonType<\n+00004750: 3b54 2667 743b 3a3a 5479 7065 3c2f 613e ;T>::Type\n+00004760: 2065 7073 696c 6f6e 203d 203c 6120 636c epsilon = DefaultE\n+000047a0: 7073 696c 6f6e 266c 743b 542c 2073 7479 psilon<T, sty\n+000047b0: 6c65 2667 743b 3a3a 7661 6c75 653c 2f61 le>::value());
    .<\n+00004800: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00004810: 6e6f 223e 2020 3233 373c 2f73 7061 6e3e no\"> 237\n+00004820: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+00004870: 2020 3233 383c 2f73 7061 6e3e 2020 2020 238 \n+00004880: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // roundin\n+000048a0: 6720 6f70 6572 6174 696f 6e73 3c2f 7370 g operations
    .
    \n
    \n-
    gmpfield.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 (C) 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_GMPFIELD_HH
    \n-
    6#define DUNE_GMPFIELD_HH
    \n+
    5#ifndef DUNE_MPITRAITS_HH
    \n+
    6#define DUNE_MPITRAITS_HH
    \n
    7
    \n-
    12#include <iostream>
    \n-
    13#include <string>
    \n-
    14#include <type_traits>
    \n-
    15
    \n-
    16#if HAVE_GMP || DOXYGEN
    \n-
    17
    \n-
    18#include <gmpxx.h>
    \n+
    18#if HAVE_MPI
    \n
    19
    \n-\n-\n-
    22
    \n-
    23namespace Dune
    \n-
    24{
    \n+
    20#include <cstddef>
    \n+
    21#include <cstdint>
    \n+
    22#include <type_traits>
    \n+
    23#include <utility>
    \n+
    24#include <complex>
    \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+
    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 // 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< 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+
    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
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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+
    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:95
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,146 +1,221 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-gmpfield.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 (C) 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_GMPFIELD_HH\n-6#define DUNE_GMPFIELD_HH\n+5#ifndef DUNE_MPITRAITS_HH\n+6#define DUNE_MPITRAITS_HH\n 7\n-12#include \n-13#include \n-14#include \n-15\n-16#if HAVE_GMP || DOXYGEN\n-17\n-18#include \n+18#if HAVE_MPI\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+20#include \n+21#include \n+22#include \n+23#include \n+24#include \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+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 // 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< 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+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\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_\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+_\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:95\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/a00206.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00206.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parametertreeparser.cc File Reference\n+dune-common: mpiguard.hh File Reference\n \n \n \n \n \n \n \n@@ -65,32 +65,52 @@\n \n \n \n \n \n

    \n \n
    \n-
    parametertreeparser.cc File Reference
    \n+ \n+
    mpiguard.hh File Reference
    \n
    \n
    \n-
    #include "parametertreeparser.hh"
    \n-#include <cstdlib>
    \n-#include <iostream>
    \n-#include <ostream>
    \n-#include <string>
    \n-#include <sstream>
    \n-#include <fstream>
    \n-#include <set>
    \n-#include <map>
    \n-#include <algorithm>
    \n-#include <dune/common/exceptions.hh>
    \n+\n+

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

    \n+
    #include "mpihelper.hh"
    \n+#include "communication.hh"
    \n+#include "mpicommunication.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+Classes

    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+

    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": "@@ -1,20 +1,35 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-parametertreeparser.cc File Reference\n-#include \"_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\bp_\ba_\br_\bs_\be_\br_\b._\bh_\bh\"\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \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+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+#include \"_\bm_\bp_\bi_\bh_\be_\bl_\bp_\be_\br_\b._\bh_\bh\"\n+#include \"_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \"_\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/_\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:_\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+Implements a MPIGuard which detects an error on a remote process.\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/a00209.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00209.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: densevector.hh File Reference\n+dune-common: mpifuture.hh File Reference\n \n \n \n \n \n \n \n@@ -65,60 +65,51 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    densevector.hh File Reference
    \n+
    mpifuture.hh File Reference
    \n
    \n
    \n-\n-

    Implements the dense vector interface, with an exchangeable storage class. \n-More...

    \n-
    #include <algorithm>
    \n-#include <limits>
    \n-#include <type_traits>
    \n-#include "genericiterator.hh"
    \n-#include "ftraits.hh"
    \n-#include "matvectraits.hh"
    \n-#include "promotiontraits.hh"
    \n-#include "dotproduct.hh"
    \n-#include "boundschecking.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::FieldTraits< DenseVector< V > >
    struct  Dune::impl::Buffer< T >
     
    struct  Dune::impl::Buffer< T & >
     
    class  Dune::DenseIterator< C, T, R >
     Generic iterator class for dense vector and matrix implementations. More...
    struct  Dune::impl::Buffer< void >
     
    class  Dune::DenseVector< V >
     Interface for a class of dense vectors over a given field. 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

    \n Namespaces

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

    Detailed Description

    \n-

    Implements the dense vector interface, with an exchangeable storage class.

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,41 +1,35 @@\n dune-common\u00a02.9.0\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-densevector.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 the dense vector interface, with an exchangeable storage class.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \"_\bg_\be_\bn_\be_\br_\bi_\bc_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-#include \"_\bm_\ba_\bt_\bv_\be_\bc_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-#include \"_\bp_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-#include \"_\bd_\bo_\bt_\bp_\br_\bo_\bd_\bu_\bc_\bt_\b._\bh_\bh\"\n-#include \"_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\"\n+mpifuture.hh File Reference\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/_\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:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bV_\b _\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- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bC_\b,_\b _\bT_\b,_\b _\bR_\b _\b>\n-\u00a0 Generic iterator class for dense vector and matrix implementations.\n- _\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- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bV_\b _\b>\n-\u00a0 _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be for a class of dense vectors over a given field. _\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+ 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:_\bf_\bv_\bm_\be_\bt_\ba\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bm_\bp_\bl\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 the dense vector interface, with an exchangeable storage 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/a00209_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: densevector.hh Source File\n+dune-common: mpifuture.hh Source File\n \n \n \n \n \n \n \n@@ -70,834 +70,290 @@\n \n \n \n \n \n \n \n
    \n-
    densevector.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 (C) 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_DENSEVECTOR_HH
    \n-
    6#define DUNE_DENSEVECTOR_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH
    \n
    7
    \n-
    8#include <algorithm>
    \n-
    9#include <limits>
    \n-
    10#include <type_traits>
    \n-
    11
    \n-
    12#include "genericiterator.hh"
    \n-
    13#include "ftraits.hh"
    \n-
    14#include "matvectraits.hh"
    \n-
    15#include "promotiontraits.hh"
    \n-
    16#include "dotproduct.hh"
    \n-
    17#include "boundschecking.hh"
    \n-
    18
    \n-
    19namespace Dune {
    \n-
    20
    \n-
    21 // forward declaration of template
    \n-
    22 template<typename V> class DenseVector;
    \n-
    23
    \n-
    24 template<typename V>
    \n-\n-
    30
    \n-
    \n-
    40 namespace fvmeta
    \n-
    41 {
    \n-
    46 template<class K>
    \n-
    47 inline typename FieldTraits<K>::real_type absreal (const K& k)
    \n-
    48 {
    \n-
    49 using std::abs;
    \n-
    50 return abs(k);
    \n-
    51 }
    \n-
    52
    \n-
    57 template<class K>
    \n-
    58 inline typename FieldTraits<K>::real_type absreal (const std::complex<K>& c)
    \n-
    59 {
    \n-
    60 using std::abs;
    \n-
    61 return abs(c.real()) + abs(c.imag());
    \n-
    62 }
    \n-
    63
    \n-
    68 template<class K>
    \n-
    69 inline typename FieldTraits<K>::real_type abs2 (const K& k)
    \n-
    70 {
    \n-
    71 return k*k;
    \n-
    72 }
    \n-
    73
    \n-
    78 template<class K>
    \n-
    79 inline typename FieldTraits<K>::real_type abs2 (const std::complex<K>& c)
    \n-
    80 {
    \n-
    81 return c.real()*c.real() + c.imag()*c.imag();
    \n-
    82 }
    \n-
    83
    \n-
    88 template<class K, bool isInteger = std::numeric_limits<K>::is_integer>
    \n-
    89 struct Sqrt
    \n-
    90 {
    \n-
    91 static inline typename FieldTraits<K>::real_type sqrt (const K& k)
    \n-
    92 {
    \n-
    93 using std::sqrt;
    \n-
    94 return sqrt(k);
    \n-
    95 }
    \n-
    96 };
    \n-
    97
    \n-
    102 template<class K>
    \n-
    103 struct Sqrt<K, true>
    \n-
    104 {
    \n-
    105 static inline typename FieldTraits<K>::real_type sqrt (const K& k)
    \n-
    106 {
    \n-
    107 using std::sqrt;
    \n-
    108 return typename FieldTraits<K>::real_type(sqrt(double(k)));
    \n-
    109 }
    \n-
    110 };
    \n+
    8#include <optional>
    \n+
    9
    \n+\n+\n+\n+
    13
    \n+
    14#if HAVE_MPI
    \n+
    15namespace Dune{
    \n+
    16
    \n+
    \n+
    17 namespace impl{
    \n+
    18 template<class T>
    \n+
    \n+
    19 struct Buffer{
    \n+
    \n+
    20 Buffer(bool valid){
    \n+
    21 if(valid)
    \n+
    22 value = std::make_unique<T>();
    \n+
    23 }
    \n+
    \n+
    24 template<class V>
    \n+
    \n+
    25 Buffer(V&& t)
    \n+
    26 : value(std::make_unique<T>(std::forward<V>(t)))
    \n+
    27 {}
    \n+
    \n+
    28 std::unique_ptr<T> value;
    \n+
    \n+
    29 T get(){
    \n+
    30 T tmp = std::move(*value);
    \n+
    31 value.reset();
    \n+
    32 return tmp;
    \n+
    33 }
    \n+
    \n+
    \n+
    34 operator bool () const {
    \n+
    35 return (bool)value;
    \n+
    36 }
    \n+
    \n+
    \n+
    37 T& operator *() const{
    \n+
    38 return *value;
    \n+
    39 }
    \n+
    \n+
    40 };
    \n+
    \n+
    41
    \n+
    42 template<class T>
    \n+
    \n+
    43 struct Buffer<T&>{
    \n+
    \n+
    44 Buffer(bool valid = false)
    \n+
    45 {
    \n+
    46 if(valid)
    \n+
    47 value = T();
    \n+
    48 }
    \n+
    \n+
    49 template<class V>
    \n+
    \n+
    50 Buffer(V&& t)
    \n+
    51 : value(std::forward<V>(t))
    \n+
    52 {}
    \n+
    \n+
    53 std::optional<std::reference_wrapper<T>> value;
    \n+
    \n+
    54 T& get(){
    \n+
    55 T& tmp = *value;
    \n+
    56 value.reset();
    \n+
    57 return tmp;
    \n+
    58 }
    \n+
    \n+
    \n+
    59 operator bool () const{
    \n+
    60 return (bool)value;
    \n+
    61 }
    \n+
    \n+
    \n+
    62 T& operator *() const{
    \n+
    63 return *value;
    \n+
    64 }
    \n+
    \n+
    65 };
    \n+
    \n+
    66
    \n+
    67 template<>
    \n+
    \n+
    68 struct Buffer<void>{
    \n+
    69 bool valid_;
    \n+
    \n+
    70 Buffer(bool valid = false)
    \n+
    71 : valid_(valid)
    \n+
    72 {}
    \n+
    \n+
    \n+
    73 operator bool () const{
    \n+
    74 return valid_;
    \n+
    75 }
    \n+
    \n+
    76 void get(){}
    \n+
    77 };
    \n+
    \n+
    78 }
    \n+
    \n+
    79
    \n+
    84 template<class R, class S = void>
    \n+
    \n+
    85 class MPIFuture{
    \n+
    86 mutable MPI_Request req_;
    \n+
    87 mutable MPI_Status status_;
    \n+
    88 impl::Buffer<R> data_;
    \n+
    89 impl::Buffer<S> send_data_;
    \n+
    90 friend class Communication<MPI_Comm>;
    \n+
    91 public:
    \n+
    \n+
    92 MPIFuture(bool valid = false)
    \n+
    93 : req_(MPI_REQUEST_NULL)
    \n+
    94 , data_(valid)
    \n+
    95 {}
    \n+
    \n+
    96
    \n+
    97 // Hide this constructor if R or S is void
    \n+
    98 template<class V = R, class U = S>
    \n+
    \n+
    99 MPIFuture(V&& recv_data, U&& send_data, typename std::enable_if_t<!std::is_void<V>::value && !std::is_void<U>::value>* = 0) :
    \n+
    100 req_(MPI_REQUEST_NULL)
    \n+
    101 , data_(std::forward<R>(recv_data))
    \n+
    102 , send_data_(std::forward<S>(send_data))
    \n+
    103 {}
    \n+
    \n+
    104
    \n+
    105 // hide this constructor if R is void
    \n+
    106 template<class V = R>
    \n+
    \n+
    107 MPIFuture(V&& recv_data, typename std::enable_if_t<!std::is_void<V>::value>* = 0)
    \n+
    108 : req_(MPI_REQUEST_NULL)
    \n+
    109 , data_(std::forward<V>(recv_data))
    \n+
    110 {}
    \n+
    \n
    111
    \n-
    116 template<class K>
    \n-
    117 inline typename FieldTraits<K>::real_type sqrt (const K& k)
    \n-
    118 {
    \n-
    119 return Sqrt<K>::sqrt(k);
    \n+
    \n+\n+
    113 if(req_ != MPI_REQUEST_NULL){
    \n+
    114 try{ // might fail when it is a collective communication
    \n+
    115 MPI_Cancel(&req_);
    \n+
    116 MPI_Request_free(&req_);
    \n+
    117 }catch(...){
    \n+
    118 }
    \n+
    119 }
    \n
    120 }
    \n+
    \n
    121
    \n-
    122 }
    \n+
    \n+\n+
    123 : req_(MPI_REQUEST_NULL)
    \n+
    124 , data_(std::move(f.data_))
    \n+
    125 , send_data_(std::move(f.send_data_))
    \n+
    126 {
    \n+
    127 std::swap(req_, f.req_);
    \n+
    128 std::swap(status_, f.status_);
    \n+
    129 }
    \n+
    \n+
    130
    \n+
    \n+\n+
    132 std::swap(req_, f.req_);
    \n+
    133 std::swap(status_, f.status_);
    \n+
    134 std::swap(data_, f.data_);
    \n+
    135 std::swap(send_data_, f.send_data_);
    \n+
    136 return *this;
    \n+
    137 }
    \n
    \n-
    123
    \n-
    128 template<class C, class T, class R =T&>
    \n-
    \n-\n-
    130 public Dune::RandomAccessIteratorFacade<DenseIterator<C,T,R>,T, R, std::ptrdiff_t>
    \n-
    131 {
    \n-
    132 friend class DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type >;
    \n-
    133 friend class DenseIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type >;
    \n-
    134
    \n-
    135 typedef DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type > MutableIterator;
    \n-
    136 typedef DenseIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type > ConstIterator;
    \n-
    137 public:
    \n
    138
    \n-
    142 typedef std::ptrdiff_t DifferenceType;
    \n-
    143
    \n-
    147 typedef typename C::size_type SizeType;
    \n+
    \n+
    139 bool valid() const{
    \n+
    140 return (bool)data_;
    \n+
    141 }
    \n+
    \n+
    142
    \n+
    \n+
    143 void wait(){
    \n+
    144 if(!valid())
    \n+
    145 DUNE_THROW(InvalidFutureException, "The MPIFuture is not valid!");
    \n+
    146 MPI_Wait(&req_, &status_);
    \n+
    147 }
    \n+
    \n
    148
    \n-
    149 // Constructors needed by the base iterators.
    \n-
    \n-\n-
    151 : container_(0), position_()
    \n-
    152 {}
    \n-
    \n-
    153
    \n-
    \n-\n-
    155 : container_(&cont), position_(pos)
    \n-
    156 {}
    \n-
    \n-
    157
    \n-
    \n-\n-
    159 : container_(other.container_), position_(other.position_)
    \n-
    160 {}
    \n-
    \n-
    161
    \n-
    \n-\n-
    163 : container_(other.container_), position_(other.position_)
    \n-
    164 {}
    \n-
    \n-
    165
    \n-
    166 // Methods needed by the forward iterator
    \n-
    \n-
    167 bool equals(const MutableIterator &other) const
    \n-
    168 {
    \n-
    169 return position_ == other.position_ && container_ == other.container_;
    \n-
    170 }
    \n-
    \n-
    171
    \n-
    172
    \n-
    \n-
    173 bool equals(const ConstIterator & other) const
    \n-
    174 {
    \n-
    175 return position_ == other.position_ && container_ == other.container_;
    \n-
    176 }
    \n-
    \n-
    177
    \n-
    \n-
    178 R dereference() const {
    \n-
    179 return container_->operator[](position_);
    \n-
    180 }
    \n-
    \n-
    181
    \n-
    \n-
    182 void increment(){
    \n-
    183 ++position_;
    \n-
    184 }
    \n-
    \n-
    185
    \n-
    186 // Additional function needed by BidirectionalIterator
    \n-
    \n-
    187 void decrement(){
    \n-
    188 --position_;
    \n-
    189 }
    \n-
    \n-
    190
    \n-
    191 // Additional function needed by RandomAccessIterator
    \n-
    \n-\n-
    193 return container_->operator[](position_+i);
    \n-
    194 }
    \n-
    \n-
    195
    \n-
    \n-\n-
    197 position_=position_+n;
    \n-
    198 }
    \n-
    \n-
    199
    \n-
    \n-
    200 DifferenceType distanceTo(DenseIterator<const typename std::remove_const<C>::type,const typename std::remove_const<T>::type> other) const
    \n-
    201 {
    \n-
    202 assert(other.container_==container_);
    \n-
    203 return static_cast< DifferenceType >( other.position_ ) - static_cast< DifferenceType >( position_ );
    \n-
    204 }
    \n-
    \n-
    205
    \n-
    \n-
    206 DifferenceType distanceTo(DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type> other) const
    \n-
    207 {
    \n-
    208 assert(other.container_==container_);
    \n-
    209 return static_cast< DifferenceType >( other.position_ ) - static_cast< DifferenceType >( position_ );
    \n-
    210 }
    \n-
    \n-
    211
    \n-
    \n-\n-
    214 {
    \n-
    215 return this->position_;
    \n-
    216 }
    \n-
    \n-
    217
    \n-
    218 private:
    \n-
    219 C *container_;
    \n-
    220 SizeType position_;
    \n-
    221 };
    \n-
    \n-
    222
    \n-
    227 template<typename V>
    \n-
    \n-\n-
    229 {
    \n-\n-
    231 // typedef typename Traits::value_type K;
    \n-
    232
    \n-
    233 // Curiously recurring template pattern
    \n-
    234 V & asImp() { return static_cast<V&>(*this); }
    \n-
    235 const V & asImp() const { return static_cast<const V&>(*this); }
    \n-
    236
    \n-
    237 protected:
    \n-
    238 // construction allowed to derived classes only
    \n-
    239 constexpr DenseVector() = default;
    \n-
    240 // copying only allowed by derived classes
    \n-
    241 DenseVector(const DenseVector&) = default;
    \n-
    242
    \n-
    243 public:
    \n-
    244 //===== type definitions and constants
    \n-
    245
    \n-
    247 typedef typename Traits::derived_type derived_type;
    \n-
    248
    \n-
    250 typedef typename Traits::value_type value_type;
    \n-
    251
    \n-\n-
    254
    \n-
    256 typedef typename Traits::value_type block_type;
    \n-
    257
    \n-
    259 typedef typename Traits::size_type size_type;
    \n-
    260
    \n-
    262 constexpr static int blocklevel = 1;
    \n-
    263
    \n-
    264 //===== assignment from scalar
    \n-
    \n-\n-
    267 {
    \n-
    268 for (size_type i=0; i<size(); i++)
    \n-
    269 asImp()[i] = k;
    \n-
    270 return asImp();
    \n-
    271 }
    \n-
    \n-
    272
    \n-
    273 //===== assignment from other DenseVectors
    \n-
    274 protected:
    \n-\n-
    277
    \n-
    278 public:
    \n-
    279
    \n-
    281 template <typename W,
    \n-
    282 std::enable_if_t<
    \n-
    283 std::is_assignable<value_type&, typename DenseVector<W>::value_type>::value, int> = 0>
    \n-
    \n-\n-
    285 {
    \n-
    286 assert(other.size() == size());
    \n-
    287 for (size_type i=0; i<size(); i++)
    \n-
    288 asImp()[i] = other[i];
    \n-
    289 return asImp();
    \n-
    290 }
    \n-
    \n-
    291
    \n-
    292 //===== access to components
    \n-
    293
    \n-
    \n-\n-
    296 {
    \n-
    297 return asImp()[i];
    \n-
    298 }
    \n-
    \n-
    299
    \n-
    \n-\n-
    301 {
    \n-
    302 return asImp()[i];
    \n-
    303 }
    \n-
    \n-
    304
    \n-
    \n-\n-
    307 {
    \n-
    308 return asImp()[0];
    \n-
    309 }
    \n-
    \n-
    310
    \n-
    \n-
    312 const value_type& front() const
    \n-
    313 {
    \n-
    314 return asImp()[0];
    \n-
    315 }
    \n-
    \n-
    316
    \n-
    \n-\n-
    319 {
    \n-
    320 return asImp()[size()-1];
    \n-
    321 }
    \n-
    \n-
    322
    \n-
    \n-
    324 const value_type& back() const
    \n-
    325 {
    \n-
    326 return asImp()[size()-1];
    \n-
    327 }
    \n-
    \n-
    328
    \n-
    \n-
    330 bool empty() const
    \n-
    331 {
    \n-
    332 return size() == 0;
    \n-
    333 }
    \n-
    \n-
    334
    \n-
    \n-\n-
    337 {
    \n-
    338 return asImp().size();
    \n-
    339 }
    \n-
    \n-
    340
    \n-\n-\n-
    345
    \n-
    \n-\n-
    348 {
    \n-
    349 return Iterator(*this,0);
    \n-
    350 }
    \n-
    \n-
    351
    \n-
    \n-\n-
    354 {
    \n-
    355 return Iterator(*this,size());
    \n-
    356 }
    \n-
    \n-
    357
    \n-
    \n-\n-
    361 {
    \n-
    362 return Iterator(*this,size()-1);
    \n-
    363 }
    \n-
    \n-
    364
    \n-
    \n-\n-
    368 {
    \n-
    369 return Iterator(*this,-1);
    \n-
    370 }
    \n-
    \n-
    371
    \n-
    \n-\n-
    374 {
    \n-
    375 return Iterator(*this,std::min(i,size()));
    \n-
    376 }
    \n-
    \n-
    377
    \n-\n-\n-
    382
    \n-
    \n-\n-
    385 {
    \n-
    386 return ConstIterator(*this,0);
    \n-
    387 }
    \n-
    \n-
    388
    \n-
    \n-\n-
    391 {
    \n-
    392 return ConstIterator(*this,size());
    \n-
    393 }
    \n-
    \n-
    394
    \n-
    \n-\n-
    398 {
    \n-
    399 return ConstIterator(*this,size()-1);
    \n-
    400 }
    \n-
    \n-
    401
    \n-
    \n-\n-
    405 {
    \n-
    406 return ConstIterator(*this,-1);
    \n-
    407 }
    \n-
    \n-
    408
    \n-
    \n-\n-
    411 {
    \n-
    412 return ConstIterator(*this,std::min(i,size()));
    \n-
    413 }
    \n-
    \n-
    414
    \n-
    415 //===== vector space arithmetic
    \n-
    416
    \n-
    418 template <class Other>
    \n-
    \n-\n-
    420 {
    \n-
    421 DUNE_ASSERT_BOUNDS(x.size() == size());
    \n-
    422 for (size_type i=0; i<size(); i++)
    \n-
    423 (*this)[i] += x[i];
    \n-
    424 return asImp();
    \n-
    425 }
    \n-
    \n-
    426
    \n-
    428 template <class Other>
    \n-
    \n-\n-
    430 {
    \n-
    431 DUNE_ASSERT_BOUNDS(x.size() == size());
    \n-
    432 for (size_type i=0; i<size(); i++)
    \n-
    433 (*this)[i] -= x[i];
    \n-
    434 return asImp();
    \n-
    435 }
    \n-
    \n-
    436
    \n-
    438 template <class Other>
    \n-
    \n-\n-
    440 {
    \n-
    441 derived_type z = asImp();
    \n-
    442 return (z+=b);
    \n-
    443 }
    \n-
    \n-
    444
    \n-
    446 template <class Other>
    \n-
    \n-\n-
    448 {
    \n-
    449 derived_type z = asImp();
    \n-
    450 return (z-=b);
    \n-
    451 }
    \n-
    \n-
    452
    \n-
    \n-\n-
    455 {
    \n-
    456 V result;
    \n-
    457 using idx_type = typename decltype(result)::size_type;
    \n-
    458
    \n-
    459 for (idx_type i = 0; i < size(); ++i)
    \n-
    460 result[i] = -asImp()[i];
    \n-
    461
    \n-
    462 return result;
    \n-
    463 }
    \n-
    \n-
    464
    \n-
    466
    \n-
    474 template <typename ValueType>
    \n-
    475 typename std::enable_if<
    \n-
    476 std::is_convertible<ValueType, value_type>::value,
    \n-\n-
    478 >::type&
    \n-
    \n-
    479 operator+= (const ValueType& kk)
    \n-
    480 {
    \n-
    481 const value_type& k = kk;
    \n-
    482 for (size_type i=0; i<size(); i++)
    \n-
    483 (*this)[i] += k;
    \n-
    484 return asImp();
    \n-
    485 }
    \n-
    \n-
    486
    \n-
    488
    \n-
    496 template <typename ValueType>
    \n-
    497 typename std::enable_if<
    \n-
    498 std::is_convertible<ValueType, value_type>::value,
    \n-\n-
    500 >::type&
    \n-
    \n-
    501 operator-= (const ValueType& kk)
    \n-
    502 {
    \n-
    503 const value_type& k = kk;
    \n-
    504 for (size_type i=0; i<size(); i++)
    \n-
    505 (*this)[i] -= k;
    \n-
    506 return asImp();
    \n-
    507 }
    \n-
    \n-
    508
    \n-
    510
    \n-
    518 template <typename FieldType>
    \n-
    519 typename std::enable_if<
    \n-
    520 std::is_convertible<FieldType, field_type>::value,
    \n-\n-
    522 >::type&
    \n-
    \n-
    523 operator*= (const FieldType& kk)
    \n-
    524 {
    \n-
    525 const field_type& k = kk;
    \n-
    526 for (size_type i=0; i<size(); i++)
    \n-
    527 (*this)[i] *= k;
    \n-
    528 return asImp();
    \n-
    529 }
    \n-
    \n-
    530
    \n-
    532
    \n-
    540 template <typename FieldType>
    \n-
    541 typename std::enable_if<
    \n-
    542 std::is_convertible<FieldType, field_type>::value,
    \n-\n-
    544 >::type&
    \n-
    \n-
    545 operator/= (const FieldType& kk)
    \n-
    546 {
    \n-
    547 const field_type& k = kk;
    \n-
    548 for (size_type i=0; i<size(); i++)
    \n-
    549 (*this)[i] /= k;
    \n-
    550 return asImp();
    \n-
    551 }
    \n-
    \n-
    552
    \n-
    554 template <class Other>
    \n-
    \n-
    555 bool operator== (const DenseVector<Other>& x) const
    \n-
    556 {
    \n-
    557 DUNE_ASSERT_BOUNDS(x.size() == size());
    \n-
    558 for (size_type i=0; i<size(); i++)
    \n-
    559 if ((*this)[i]!=x[i])
    \n-
    560 return false;
    \n-
    561
    \n-
    562 return true;
    \n-
    563 }
    \n-
    \n-
    564
    \n-
    566 template <class Other>
    \n-
    \n-
    567 bool operator!= (const DenseVector<Other>& x) const
    \n-
    568 {
    \n-
    569 return !operator==(x);
    \n-
    570 }
    \n-
    \n-
    571
    \n-
    572
    \n-
    574 template <class Other>
    \n-
    \n-\n-
    576 {
    \n-
    577 DUNE_ASSERT_BOUNDS(x.size() == size());
    \n-
    578 for (size_type i=0; i<size(); i++)
    \n-
    579 (*this)[i] += a*x[i];
    \n-
    580 return asImp();
    \n-
    581 }
    \n-
    \n-
    582
    \n-
    590 template<class Other>
    \n-
    \n-\n-
    592 typedef typename PromotionTraits<field_type, typename DenseVector<Other>::field_type>::PromotedType PromotedType;
    \n-
    593 PromotedType result(0);
    \n-
    594 assert(x.size() == size());
    \n-
    595 for (size_type i=0; i<size(); i++) {
    \n-
    596 result += PromotedType((*this)[i]*x[i]);
    \n-
    597 }
    \n-
    598 return result;
    \n-
    599 }
    \n-
    \n-
    600
    \n-
    608 template<class Other>
    \n-
    \n-\n-
    610 typedef typename PromotionTraits<field_type, typename DenseVector<Other>::field_type>::PromotedType PromotedType;
    \n-
    611 PromotedType result(0);
    \n-
    612 assert(x.size() == size());
    \n-
    613 for (size_type i=0; i<size(); i++) {
    \n-
    614 result += Dune::dot((*this)[i],x[i]);
    \n-
    615 }
    \n-
    616 return result;
    \n-
    617 }
    \n-
    \n-
    618
    \n-
    619 //===== norms
    \n-
    620
    \n-
    \n-\n-
    623 using std::abs;
    \n-
    624 typename FieldTraits<value_type>::real_type result( 0 );
    \n-
    625 for (size_type i=0; i<size(); i++)
    \n-
    626 result += abs((*this)[i]);
    \n-
    627 return result;
    \n-
    628 }
    \n-
    \n-
    629
    \n-
    630
    \n-
    \n-\n-
    633 {
    \n-
    634 typename FieldTraits<value_type>::real_type result( 0 );
    \n-
    635 for (size_type i=0; i<size(); i++)
    \n-
    636 result += fvmeta::absreal((*this)[i]);
    \n-
    637 return result;
    \n-
    638 }
    \n-
    \n-
    639
    \n-
    \n-\n-
    642 {
    \n-
    643 typename FieldTraits<value_type>::real_type result( 0 );
    \n-
    644 for (size_type i=0; i<size(); i++)
    \n-
    645 result += fvmeta::abs2((*this)[i]);
    \n-
    646 return fvmeta::sqrt(result);
    \n-
    647 }
    \n-
    \n-
    648
    \n-
    \n-\n-
    651 {
    \n-
    652 typename FieldTraits<value_type>::real_type result( 0 );
    \n-
    653 for (size_type i=0; i<size(); i++)
    \n-
    654 result += fvmeta::abs2((*this)[i]);
    \n-
    655 return result;
    \n-
    656 }
    \n-
    \n-
    657
    \n-
    659 template <typename vt = value_type,
    \n-
    660 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    662 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    663 using std::abs;
    \n-
    664 using std::max;
    \n-
    665
    \n-
    666 real_type norm = 0;
    \n-
    667 for (auto const &x : *this) {
    \n-
    668 real_type const a = abs(x);
    \n-
    669 norm = max(a, norm);
    \n-
    670 }
    \n-
    671 return norm;
    \n-
    672 }
    \n-
    \n-
    673
    \n-
    675 template <typename vt = value_type,
    \n-
    676 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    678 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    679 using std::max;
    \n-
    680
    \n-
    681 real_type norm = 0;
    \n-
    682 for (auto const &x : *this) {
    \n-
    683 real_type const a = fvmeta::absreal(x);
    \n-
    684 norm = max(a, norm);
    \n-
    685 }
    \n-
    686 return norm;
    \n-
    687 }
    \n-
    \n-
    688
    \n-
    690 template <typename vt = value_type,
    \n-
    691 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    693 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    694 using std::abs;
    \n-
    695 using std::max;
    \n-
    696
    \n-
    697 real_type norm = 0;
    \n-
    698 real_type isNaN = 1;
    \n-
    699 for (auto const &x : *this) {
    \n-
    700 real_type const a = abs(x);
    \n-
    701 norm = max(a, norm);
    \n-
    702 isNaN += a;
    \n-
    703 }
    \n-
    704 return norm * (isNaN / isNaN);
    \n-
    705 }
    \n-
    \n-
    706
    \n-
    708 template <typename vt = value_type,
    \n-
    709 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
    \n-
    \n-\n-
    711 using real_type = typename FieldTraits<vt>::real_type;
    \n-
    712 using std::max;
    \n-
    713
    \n-
    714 real_type norm = 0;
    \n-
    715 real_type isNaN = 1;
    \n-
    716 for (auto const &x : *this) {
    \n-
    717 real_type const a = fvmeta::absreal(x);
    \n-
    718 norm = max(a, norm);
    \n-
    719 isNaN += a;
    \n-
    720 }
    \n-
    721 return norm * (isNaN / isNaN);
    \n-
    722 }
    \n-
    \n-
    723
    \n-
    724 //===== sizes
    \n-
    725
    \n-
    \n-
    727 size_type N () const
    \n-
    728 {
    \n-
    729 return size();
    \n-
    730 }
    \n-
    \n-
    731
    \n-
    \n-
    733 size_type dim () const
    \n-
    734 {
    \n-
    735 return size();
    \n-
    736 }
    \n-
    \n-
    737
    \n-
    738 };
    \n-
    \n-
    739
    \n-
    748 template<typename V>
    \n-
    \n-
    749 std::ostream& operator<< (std::ostream& s, const DenseVector<V>& v)
    \n-
    750 {
    \n-
    751 for (typename DenseVector<V>::size_type i=0; i<v.size(); i++)
    \n-
    752 s << ((i>0) ? " " : "") << v[i];
    \n-
    753 return s;
    \n-
    754 }
    \n-
    \n-
    755
    \n-
    758} // end namespace
    \n-
    759
    \n-
    760#endif // DUNE_DENSEVECTOR_HH
    \n-
    Type traits to determine the type of reals (when working with complex numbers)
    \n-
    Macro for wrapping boundary checks.
    \n-
    Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
    \n-
    Compute type of the result of an arithmetic operation involving two different number types.
    \n-
    Provides the functions dot(a,b) := and dotT(a,b) := .
    \n-
    Implements a generic iterator class for writing stl conformant iterators.
    \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-
    auto dot(const A &a, const B &b) -> typename std::enable_if< IsNumber< A >::value &&!IsVector< A >::value &&!std::is_same< typename FieldTraits< A >::field_type, typename FieldTraits< A >::real_type > ::value, decltype(conj(a) *b)>::type
    computes the dot product for fundamental data types according to Petsc's VectDot function: dot(a,...
    Definition dotproduct.hh:42
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    \n+
    149 bool ready() const{
    \n+
    150 int flag = -1;
    \n+
    151 MPI_Test(&req_, &flag, &status_);
    \n+
    152 return flag;
    \n+
    153 }
    \n+
    \n+
    154
    \n+
    \n+
    155 R get() {
    \n+
    156 wait();
    \n+
    157 return data_.get();
    \n+
    158 }
    \n+
    \n+
    159
    \n+
    \n+\n+
    161 wait();
    \n+
    162 return send_data_.get();
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    \n+\n+
    166 return getMPIData(*data_);
    \n+
    167 }
    \n+
    \n+
    168
    \n+
    \n+\n+
    170 return getMPIData(*send_data_);
    \n+
    171 }
    \n+
    \n+
    172 };
    \n+
    \n+
    173
    \n+
    174}
    \n+
    175#endif
    \n+
    176#endif
    \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+
    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-
    Interface for a class of dense vectors over a given field.
    Definition densevector.hh:229
    \n-
    Traits::value_type value_type
    export the type representing the field
    Definition densevector.hh:250
    \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-
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition densevector.hh:381
    \n-
    Iterator iterator
    typedef for stl compliant access
    Definition densevector.hh:344
    \n-
    ConstIterator find(size_type i) const
    return iterator to given element or end()
    Definition densevector.hh:410
    \n-
    ConstIterator end() const
    end ConstIterator
    Definition densevector.hh:390
    \n-
    value_type & front()
    return reference to first element
    Definition densevector.hh:306
    \n-
    FieldTraits< value_type >::real_type two_norm() const
    two norm sqrt(sum over squared values of entries)
    Definition densevector.hh:641
    \n-
    ConstIterator beforeBegin() const
    Definition densevector.hh:404
    \n-
    bool operator==(const DenseVector< Other > &x) const
    Binary vector comparison.
    Definition densevector.hh:555
    \n-
    Iterator begin()
    begin iterator
    Definition densevector.hh:347
    \n-
    Iterator beforeBegin()
    Definition densevector.hh:367
    \n-
    DenseIterator< const DenseVector, const value_type > ConstIterator
    ConstIterator class for sequential access.
    Definition densevector.hh:379
    \n-
    Traits::derived_type derived_type
    type of derived vector class
    Definition densevector.hh:247
    \n-
    const value_type & front() const
    return reference to first element
    Definition densevector.hh:312
    \n-
    derived_type operator+(const DenseVector< Other > &b) const
    Binary vector addition.
    Definition densevector.hh:439
    \n-
    size_type size() const
    size method
    Definition densevector.hh:336
    \n-
    size_type dim() const
    dimension of the vector space
    Definition densevector.hh:733
    \n-
    FieldTraits< vt >::real_type infinity_norm() const
    infinity norm (maximum of absolute values of entries)
    Definition densevector.hh:661
    \n-
    ConstIterator beforeEnd() const
    Definition densevector.hh:397
    \n-
    derived_type & axpy(const field_type &a, const DenseVector< Other > &x)
    vector space axpy operation ( *this += a x )
    Definition densevector.hh:575
    \n-
    derived_type & operator=(const value_type &k)
    Assignment operator for scalar.
    Definition densevector.hh:266
    \n-
    static constexpr int blocklevel
    The number of block levels we contain. This is the leaf, that is, 1.
    Definition densevector.hh:262
    \n-
    Iterator end()
    end iterator
    Definition densevector.hh:353
    \n-
    Traits::size_type size_type
    The type used for the index access and size operation.
    Definition densevector.hh:259
    \n-
    DenseIterator< DenseVector, value_type > Iterator
    Iterator class for sequential access.
    Definition densevector.hh:342
    \n-
    derived_type & operator-=(const DenseVector< Other > &x)
    vector space subtraction
    Definition densevector.hh:429
    \n-
    DenseVector(const DenseVector &)=default
    \n-
    Iterator beforeEnd()
    Definition densevector.hh:360
    \n-
    derived_type & operator+=(const DenseVector< Other > &x)
    vector space addition
    Definition densevector.hh:419
    \n-
    std::enable_if< std::is_convertible< FieldType, field_type >::value, derived_type >::type & operator*=(const FieldType &kk)
    vector space multiplication with scalar
    Definition densevector.hh:523
    \n-
    bool operator!=(const DenseVector< Other > &x) const
    Binary vector incomparison.
    Definition densevector.hh:567
    \n-
    const value_type & back() const
    return reference to last element
    Definition densevector.hh:324
    \n-
    ConstIterator begin() const
    begin ConstIterator
    Definition densevector.hh:384
    \n-
    PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::PromotedType operator*(const DenseVector< Other > &x) const
    indefinite vector dot product which corresponds to Petsc's VecTDot
    Definition densevector.hh:591
    \n-
    constexpr DenseVector()=default
    \n-
    FieldTraits< vt >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition densevector.hh:677
    \n-
    DenseVector & operator=(const DenseVector &)=default
    Assignment operator for other DenseVector of same type.
    \n-
    Traits::value_type block_type
    export the type representing the components
    Definition densevector.hh:256
    \n-
    value_type & operator[](size_type i)
    random access
    Definition densevector.hh:295
    \n-
    FieldTraits< value_type >::field_type field_type
    export the type representing the field
    Definition densevector.hh:253
    \n-
    value_type & back()
    return reference to last element
    Definition densevector.hh:318
    \n-
    derived_type operator-() const
    Vector negation.
    Definition densevector.hh:454
    \n-
    std::enable_if< std::is_convertible< FieldType, field_type >::value, derived_type >::type & operator/=(const FieldType &kk)
    vector space division by scalar
    Definition densevector.hh:545
    \n-
    FieldTraits< value_type >::real_type one_norm_real() const
    simplified one norm (uses Manhattan norm for complex values)
    Definition densevector.hh:632
    \n-
    PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::PromotedType dot(const DenseVector< Other > &x) const
    vector dot product which corresponds to Petsc's VecDot
    Definition densevector.hh:609
    \n-
    Iterator find(size_type i)
    return iterator to given element or end()
    Definition densevector.hh:373
    \n-
    FieldTraits< value_type >::real_type one_norm() const
    one norm (sum over absolute values of entries)
    Definition densevector.hh:622
    \n-
    size_type N() const
    number of blocks in the vector (are of size 1 here)
    Definition densevector.hh:727
    \n-
    bool empty() const
    checks whether the container is empty
    Definition densevector.hh:330
    \n-
    FieldTraits< typenameDenseMatVecTraits< V >::value_type >::real_type real_type
    Definition densevector.hh:28
    \n-
    FieldTraits< typenameDenseMatVecTraits< V >::value_type >::field_type field_type
    Definition densevector.hh:27
    \n-
    Generic iterator class for dense vector and matrix implementations.
    Definition densevector.hh:131
    \n-
    void increment()
    Definition densevector.hh:182
    \n-
    SizeType index() const
    return index
    Definition densevector.hh:213
    \n-
    bool equals(const MutableIterator &other) const
    Definition densevector.hh:167
    \n-
    DenseIterator(const MutableIterator &other)
    Definition densevector.hh:158
    \n-
    bool equals(const ConstIterator &other) const
    Definition densevector.hh:173
    \n-
    R elementAt(DifferenceType i) const
    Definition densevector.hh:192
    \n-
    DifferenceType distanceTo(DenseIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T >::type > other) const
    Definition densevector.hh:200
    \n-
    void decrement()
    Definition densevector.hh:187
    \n-
    DenseIterator(const ConstIterator &other)
    Definition densevector.hh:162
    \n-
    DifferenceType distanceTo(DenseIterator< typename std::remove_const< C >::type, typename std::remove_const< T >::type > other) const
    Definition densevector.hh:206
    \n-
    DenseIterator(C &cont, SizeType pos)
    Definition densevector.hh:154
    \n-
    std::ptrdiff_t DifferenceType
    The type of the difference between two positions.
    Definition densevector.hh:142
    \n-
    R dereference() const
    Definition densevector.hh:178
    \n-
    void advance(DifferenceType n)
    Definition densevector.hh:196
    \n-
    C::size_type SizeType
    The type to index the underlying container.
    Definition densevector.hh:147
    \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 'mutable' version of a reference to a const object
    Definition genericiterator.hh:116
    \n-
    Base class for stl conformant forward iterators.
    Definition iteratorfacades.hh:434
    \n-
    Definition matvectraits.hh:31
    \n-
    Compute type of the result of an arithmetic operation involving two different number types.
    Definition promotiontraits.hh:27
    \n+
    auto getMPIData(T &t)
    Definition mpidata.hh:43
    \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:18
    \n+
    Definition mpifuture.hh:19
    \n+
    std::unique_ptr< T > value
    Definition mpifuture.hh:28
    \n+
    T & operator*() const
    Definition mpifuture.hh:37
    \n+
    Buffer(V &&t)
    Definition mpifuture.hh:25
    \n+
    T get()
    Definition mpifuture.hh:29
    \n+
    Buffer(bool valid)
    Definition mpifuture.hh:20
    \n+
    std::optional< std::reference_wrapper< T > > value
    Definition mpifuture.hh:53
    \n+
    Buffer(bool valid=false)
    Definition mpifuture.hh:44
    \n+
    T & get()
    Definition mpifuture.hh:54
    \n+
    Buffer(V &&t)
    Definition mpifuture.hh:50
    \n+
    bool valid_
    Definition mpifuture.hh:69
    \n+
    void get()
    Definition mpifuture.hh:76
    \n+
    Buffer(bool valid=false)
    Definition mpifuture.hh:70
    \n+
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:85
    \n+
    MPIFuture(V &&recv_data, typename std::enable_if_t<!std::is_void< V >::value > *=0)
    Definition mpifuture.hh:107
    \n+
    bool ready() const
    Definition mpifuture.hh:149
    \n+
    bool valid() const
    Definition mpifuture.hh:139
    \n+
    ~MPIFuture()
    Definition mpifuture.hh:112
    \n+
    MPIFuture(bool valid=false)
    Definition mpifuture.hh:92
    \n+
    MPIFuture & operator=(MPIFuture &&f)
    Definition mpifuture.hh:131
    \n+
    auto get_send_mpidata()
    Definition mpifuture.hh:169
    \n+
    void wait()
    Definition mpifuture.hh:143
    \n+
    auto get_mpidata()
    Definition mpifuture.hh:165
    \n+
    R get()
    Definition mpifuture.hh:155
    \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:99
    \n+
    S get_send_data()
    Definition mpifuture.hh:160
    \n+
    MPIFuture(MPIFuture &&f)
    Definition mpifuture.hh:122
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,944 +1,297 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-densevector.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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 (C) 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_DENSEVECTOR_HH\n-6#define DUNE_DENSEVECTOR_HH\n+5#ifndef DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n+6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-12#include \"_\bg_\be_\bn_\be_\br_\bi_\bc_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n-13#include \"_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-14#include \"_\bm_\ba_\bt_\bv_\be_\bc_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-15#include \"_\bp_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-16#include \"_\bd_\bo_\bt_\bp_\br_\bo_\bd_\bu_\bc_\bt_\b._\bh_\bh\"\n-17#include \"_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\"\n-18\n-19namespace _\bD_\bu_\bn_\be {\n-20\n-21 // forward declaration of template\n-22 template class DenseVector;\n-23\n-24 template\n-_\b2_\b5 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br >\n-26 {\n-_\b2_\b7 typedef 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<_\bV_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be >_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b2_\b8 typedef 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<_\bV_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be >_\b:_\b:\n-_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-29 };\n-30\n-_\b4_\b0 namespace fvmeta\n-41 {\n-46 template\n-47 inline 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 absreal (const K& k)\n-48 {\n-49 using std::abs;\n-50 return abs(k);\n-51 }\n-52\n-57 template\n-58 inline 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 absreal (const std::complex& c)\n-59 {\n-60 using std::abs;\n-61 return abs(c.real()) + abs(c.imag());\n-62 }\n-63\n-68 template\n-69 inline 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 abs2 (const K& k)\n-70 {\n-71 return k*k;\n-72 }\n-73\n-78 template\n-79 inline 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 abs2 (const std::complex& c)\n-80 {\n-81 return c.real()*c.real() + c.imag()*c.imag();\n-82 }\n-83\n-88 template::is_integer>\n-89 struct Sqrt\n-90 {\n-91 static inline 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 sqrt (const K& k)\n-92 {\n-93 using std::sqrt;\n-94 return sqrt(k);\n-95 }\n-96 };\n-97\n-102 template\n-103 struct Sqrt\n-104 {\n-_\b1_\b0_\b5 static inline 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 sqrt (const K& k)\n-106 {\n-107 using std::sqrt;\n-108 return 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(sqrt(double(k)));\n-109 }\n-110 };\n+8#include \n+9\n+10#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+11#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+12#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+13\n+14#if HAVE_MPI\n+15namespace _\bD_\bu_\bn_\be{\n+16\n+_\b1_\b7 namespace impl{\n+18 template\n+_\b1_\b9 struct _\bB_\bu_\bf_\bf_\be_\br{\n+_\b2_\b0 _\bB_\bu_\bf_\bf_\be_\br(bool valid){\n+21 if(valid)\n+22 _\bv_\ba_\bl_\bu_\be = std::make_unique();\n+23 }\n+24 template\n+_\b2_\b5 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n+26 : _\bv_\ba_\bl_\bu_\be(_\bs_\bt_\bd::make_unique(_\bs_\bt_\bd::forward(t)))\n+27 {}\n+_\b2_\b8 std::unique_ptr _\bv_\ba_\bl_\bu_\be;\n+_\b2_\b9 T _\bg_\be_\bt(){\n+30 T tmp = std::move(*_\bv_\ba_\bl_\bu_\be);\n+31 _\bv_\ba_\bl_\bu_\be.reset();\n+32 return tmp;\n+33 }\n+_\b3_\b4 operator bool () const {\n+35 return (bool)_\bv_\ba_\bl_\bu_\be;\n+36 }\n+_\b3_\b7 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n+38 return *_\bv_\ba_\bl_\bu_\be;\n+39 }\n+40 };\n+41\n+42 template\n+_\b4_\b3 struct _\bB_\bu_\bf_\bf_\be_\br{\n+_\b4_\b4 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n+45 {\n+46 if(valid)\n+47 value = T();\n+48 }\n+49 template\n+_\b5_\b0 _\bB_\bu_\bf_\bf_\be_\br(V&& t)\n+51 : value(_\bs_\bt_\bd::forward(t))\n+52 {}\n+_\b5_\b3 std::optional> _\bv_\ba_\bl_\bu_\be;\n+_\b5_\b4 T& _\bg_\be_\bt(){\n+55 T& tmp = *value;\n+56 value.reset();\n+57 return tmp;\n+58 }\n+_\b5_\b9 operator bool () const{\n+60 return (bool)value;\n+61 }\n+_\b6_\b2 T& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b*() const{\n+63 return *value;\n+64 }\n+65 };\n+66\n+67 template<>\n+_\b6_\b8 struct _\bB_\bu_\bf_\bf_\be_\br{\n+_\b6_\b9 bool _\bv_\ba_\bl_\bi_\bd_\b_;\n+_\b7_\b0 _\bB_\bu_\bf_\bf_\be_\br(bool valid = false)\n+71 : valid_(valid)\n+72 {}\n+_\b7_\b3 operator bool () const{\n+74 return valid_;\n+75 }\n+_\b7_\b6 void _\bg_\be_\bt(){}\n+77 };\n+78 }\n+79\n+84 template\n+_\b8_\b5 class _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be{\n+86 mutable MPI_Request req_;\n+87 mutable MPI_Status status_;\n+88 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bR_\b> data_;\n+_\b8_\b9 _\bi_\bm_\bp_\bl_\b:_\b:_\bB_\bu_\bf_\bf_\be_\br_\b<_\bS_\b> send_data_;\n+90 friend class _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n+91 public:\n+_\b9_\b2 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false)\n+93 : req_(MPI_REQUEST_NULL)\n+94 , data_(_\bv_\ba_\bl_\bi_\bd)\n+95 {}\n+96\n+97 // Hide this constructor if R or S is void\n+98 template\n+_\b9_\b9 _\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+100 req_(MPI_REQUEST_NULL)\n+101 , data_(_\bs_\bt_\bd::forward(recv_data))\n+102 , send_data_(_\bs_\bt_\bd::forward(send_data))\n+103 {}\n+104\n+105 // hide this constructor if R is void\n+106 template\n+_\b1_\b0_\b7 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(V&& recv_data, typename std::enable_if_t::\n+value>* = 0)\n+108 : req_(MPI_REQUEST_NULL)\n+109 , data_(_\bs_\bt_\bd::forward(recv_data))\n+110 {}\n 111\n-116 template\n-117 inline 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 sqrt (const K& k)\n-118 {\n-119 return Sqrt::sqrt(k);\n+_\b1_\b1_\b2 _\b~_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be() {\n+113 if(req_ != MPI_REQUEST_NULL){\n+114 try{ // might fail when it is a collective communication\n+115 MPI_Cancel(&req_);\n+116 MPI_Request_free(&req_);\n+117 }catch(...){\n+118 }\n+119 }\n 120 }\n 121\n-122 }\n-123\n-128 template\n-_\b1_\b2_\b9 class _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br :\n-130 public _\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,T, R, std::\n-ptrdiff_t>\n-131 {\n-132 friend class _\bD_\be_\bn_\bs_\be_\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 >;\n-133 friend class _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type, const\n-typename std::remove_const::type, typename const_reference::type >;\n-134\n-135 typedef _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type, typename std::\n-remove_const::type, typename mutable_reference::type > _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-136 typedef _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type, const\n-typename std::remove_const::type, typename const_reference::type >\n-_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-137 public:\n+_\b1_\b2_\b2 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be(_\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be&& f)\n+123 : req_(MPI_REQUEST_NULL)\n+124 , data_(_\bs_\bt_\bd::move(f.data_))\n+125 , send_data_(_\bs_\bt_\bd::move(f.send_data_))\n+126 {\n+127 std::swap(req_, f.req_);\n+128 std::swap(status_, f.status_);\n+129 }\n+130\n+_\b1_\b3_\b1 _\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+132 std::swap(req_, f.req_);\n+133 std::swap(status_, f.status_);\n+134 std::swap(data_, f.data_);\n+135 std::swap(send_data_, f.send_data_);\n+136 return *this;\n+137 }\n 138\n-_\b1_\b4_\b2 typedef std::ptrdiff_t _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be;\n-143\n-_\b1_\b4_\b7 typedef typename C::size_type _\bS_\bi_\bz_\be_\bT_\by_\bp_\be;\n+_\b1_\b3_\b9 bool _\bv_\ba_\bl_\bi_\bd() const{\n+140 return (bool)data_;\n+141 }\n+142\n+_\b1_\b4_\b3 void _\bw_\ba_\bi_\bt(){\n+144 if(!_\bv_\ba_\bl_\bi_\bd())\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 MPIFuture is not valid!\");\n+146 MPI_Wait(&req_, &status_);\n+147 }\n 148\n-149 // Constructors needed by the base iterators.\n-_\b1_\b5_\b0 _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br()\n-151 : container_(0), position_()\n-152 {}\n-153\n-_\b1_\b5_\b4 _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(C& cont, _\bS_\bi_\bz_\be_\bT_\by_\bp_\be pos)\n-155 : container_(&cont), position_(pos)\n-156 {}\n-157\n-_\b1_\b5_\b8 _\bD_\be_\bn_\bs_\be_\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)\n-159 : container_(other.container_), position_(other.position_)\n-160 {}\n-161\n-_\b1_\b6_\b2 _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br & other)\n-163 : container_(other.container_), position_(other.position_)\n-164 {}\n-165\n-166 // Methods needed by the forward iterator\n-_\b1_\b6_\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-168 {\n-169 return position_ == other.position_ && container_ == other.container_;\n-170 }\n-171\n-172\n-_\b1_\b7_\b3 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br & other) const\n-174 {\n-175 return position_ == other.position_ && container_ == other.container_;\n-176 }\n-177\n-_\b1_\b7_\b8 R _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const {\n-179 return container_->operator[](position_);\n-180 }\n-181\n-_\b1_\b8_\b2 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt(){\n-183 ++position_;\n-184 }\n-185\n-186 // Additional function needed by BidirectionalIterator\n-_\b1_\b8_\b7 void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt(){\n-188 --position_;\n-189 }\n-190\n-191 // Additional function needed by RandomAccessIterator\n-_\b1_\b9_\b2 R _\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-193 return container_->operator[](position_+i);\n-194 }\n-195\n-_\b1_\b9_\b6 void _\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be n){\n-197 position_=position_+n;\n-198 }\n-199\n-_\b2_\b0_\b0 _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,const typename std::remove_const::type> other) const\n-201 {\n-202 assert(other.container_==container_);\n-203 return static_cast< _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be >( other.position_ ) - static_cast<\n-_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be >( position_ );\n-204 }\n-205\n-_\b2_\b0_\b6 _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::\n-type, typename std::remove_const::type> other) const\n-207 {\n-208 assert(other.container_==container_);\n-209 return static_cast< _\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be >( other.position_ ) - static_cast<\n-_\bD_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\bT_\by_\bp_\be >( position_ );\n-210 }\n-211\n-_\b2_\b1_\b3 _\bS_\bi_\bz_\be_\bT_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n-214 {\n-215 return this->position_;\n-216 }\n-217\n-218 private:\n-219 C *container_;\n-220 _\bS_\bi_\bz_\be_\bT_\by_\bp_\be position_;\n-221 };\n-222\n-227 template\n-_\b2_\b2_\b8 class _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br\n-229 {\n-230 typedef _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bV_\b> _\bT_\br_\ba_\bi_\bt_\bs;\n-231 // typedef typename Traits::value_type K;\n-232\n-233 // Curiously recurring template pattern\n-234 V & asImp() { return static_cast(*this); }\n-235 const V & asImp() const { return static_cast(*this); }\n-236\n-237 protected:\n-238 // construction allowed to derived classes only\n-_\b2_\b3_\b9 constexpr _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br() = default;\n-240 // copying only allowed by derived classes\n-_\b2_\b4_\b1 _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br&) = default;\n-242\n-243 public:\n-244 //===== type definitions and constants\n-245\n-_\b2_\b4_\b7 typedef typename Traits::derived_type _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n-248\n-_\b2_\b5_\b0 typedef typename Traits::value_type _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-251\n-_\b2_\b5_\b3 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-254\n-_\b2_\b5_\b6 typedef typename Traits::value_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-257\n-_\b2_\b5_\b9 typedef typename Traits::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-260\n-_\b2_\b6_\b2 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n-263\n-264 //===== assignment from scalar\n-_\b2_\b6_\b6 inline _\bd_\be_\br_\bi_\bv_\be_\bd_\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& k)\n-267 {\n-268 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-269 asImp()[i] = k;\n-270 return asImp();\n-271 }\n-272\n-273 //===== assignment from other DenseVectors\n-274 protected:\n-_\b2_\b7_\b6 _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br&) = default;\n-277\n-278 public:\n-279\n-281 template ::value_type>::\n-value, int> = 0>\n-_\b2_\b8_\b4 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bW_\b>& other)\n-285 {\n-286 assert(other._\bs_\bi_\bz_\be() == _\bs_\bi_\bz_\be());\n-287 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-288 asImp()[i] = other[i];\n-289 return asImp();\n-290 }\n-291\n-292 //===== access to components\n-293\n-_\b2_\b9_\b5 _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be & _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-296 {\n-297 return asImp()[i];\n-298 }\n-299\n-_\b3_\b0_\b0 const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be & _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-301 {\n-302 return asImp()[i];\n-303 }\n-304\n-_\b3_\b0_\b6 _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\bf_\br_\bo_\bn_\bt()\n-307 {\n-308 return asImp()[0];\n-309 }\n-310\n-_\b3_\b1_\b2 const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\bf_\br_\bo_\bn_\bt() const\n-313 {\n-314 return asImp()[0];\n-315 }\n-316\n-_\b3_\b1_\b8 _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\bb_\ba_\bc_\bk()\n-319 {\n-320 return asImp()[_\bs_\bi_\bz_\be()-1];\n-321 }\n-322\n-_\b3_\b2_\b4 const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\bb_\ba_\bc_\bk() const\n-325 {\n-326 return asImp()[_\bs_\bi_\bz_\be()-1];\n-327 }\n-328\n-_\b3_\b3_\b0 bool _\be_\bm_\bp_\bt_\by() const\n-331 {\n-332 return _\bs_\bi_\bz_\be() == 0;\n-333 }\n-334\n-_\b3_\b3_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n-337 {\n-338 return asImp().size();\n-339 }\n-340\n-_\b3_\b4_\b2 typedef _\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b,_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b3_\b4_\b4 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-345\n-_\b3_\b4_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n-348 {\n-349 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n-350 }\n-351\n-_\b3_\b5_\b3 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n-354 {\n-355 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\bs_\bi_\bz_\be());\n-356 }\n-357\n-_\b3_\b6_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n-361 {\n-362 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\bs_\bi_\bz_\be()-1);\n-363 }\n-364\n-_\b3_\b6_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n-368 {\n-369 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,-1);\n-370 }\n-371\n-_\b3_\b7_\b3 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-374 {\n-375 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,std::min(i,_\bs_\bi_\bz_\be()));\n-376 }\n-377\n-_\b3_\b7_\b9 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_\bV_\be_\bc_\bt_\bo_\br_\b,_\bc_\bo_\bn_\bs_\bt_\b _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b3_\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-382\n-_\b3_\b8_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n-385 {\n-386 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n-387 }\n-388\n-_\b3_\b9_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n-391 {\n-392 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\bs_\bi_\bz_\be());\n-393 }\n-394\n-_\b3_\b9_\b7 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd () const\n-398 {\n-399 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\bs_\bi_\bz_\be()-1);\n-400 }\n-401\n-_\b4_\b0_\b4 _\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-405 {\n-406 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,-1);\n-407 }\n-408\n-_\b4_\b1_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-411 {\n-412 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,std::min(i,_\bs_\bi_\bz_\be()));\n-413 }\n-414\n-415 //===== vector space arithmetic\n-416\n-418 template \n-_\b4_\b1_\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& x)\n-420 {\n-421 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(x._\bs_\bi_\bz_\be() == _\bs_\bi_\bz_\be());\n-422 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-423 (*this)[i] += x[i];\n-424 return asImp();\n-425 }\n-426\n-428 template \n-_\b4_\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 _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& x)\n-430 {\n-431 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(x._\bs_\bi_\bz_\be() == _\bs_\bi_\bz_\be());\n-432 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-433 (*this)[i] -= x[i];\n-434 return asImp();\n-435 }\n-436\n-438 template \n-_\b4_\b3_\b9 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& b) const\n-440 {\n-441 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be z = asImp();\n-442 return (z+=b);\n-443 }\n-444\n-446 template \n-_\b4_\b4_\b7 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& b) const\n-448 {\n-449 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be z = asImp();\n-450 return (z-=b);\n-451 }\n-452\n-_\b4_\b5_\b4 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b () const\n-455 {\n-456 V result;\n-457 using idx_type = typename decltype(result)_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-458\n-459 for (idx_type i = 0; i < _\bs_\bi_\bz_\be(); ++i)\n-460 result[i] = -asImp()[i];\n-461\n-462 return result;\n-463 }\n-464\n-466\n-474 template \n-475 typename std::enable_if<\n-476 std::is_convertible::value,\n-477 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-478 >::type&\n-_\b4_\b7_\b9 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const ValueType& kk)\n-480 {\n-481 const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& k = kk;\n-482 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-483 (*this)[i] += k;\n-484 return asImp();\n-485 }\n-486\n-488\n-496 template \n-497 typename std::enable_if<\n-498 std::is_convertible::value,\n-499 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-500 >::type&\n-_\b5_\b0_\b1 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const ValueType& kk)\n-502 {\n-503 const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& k = kk;\n-504 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-505 (*this)[i] -= k;\n-506 return asImp();\n-507 }\n-508\n-510\n-518 template \n-519 typename std::enable_if<\n-520 std::is_convertible::value,\n-521 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-522 >::type&\n-_\b5_\b2_\b3 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const FieldType& kk)\n-524 {\n-525 const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k = kk;\n-526 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-527 (*this)[i] *= k;\n-528 return asImp();\n-529 }\n-530\n-532\n-540 template \n-541 typename std::enable_if<\n-542 std::is_convertible::value,\n-543 _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-544 >::type&\n-_\b5_\b4_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const FieldType& kk)\n-546 {\n-547 const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k = kk;\n-548 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-549 (*this)[i] /= k;\n-550 return asImp();\n-551 }\n-552\n-554 template \n-_\b5_\b5_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const\n-556 {\n-557 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(x._\bs_\bi_\bz_\be() == _\bs_\bi_\bz_\be());\n-558 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-559 if ((*this)[i]!=x[i])\n-560 return false;\n-561\n-562 return true;\n-563 }\n-564\n-566 template \n-_\b5_\b6_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const\n-568 {\n-569 return !_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(x);\n-570 }\n-571\n-572\n-574 template \n-_\b5_\b7_\b5 _\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& x)\n-576 {\n-577 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(x._\bs_\bi_\bz_\be() == _\bs_\bi_\bz_\be());\n-578 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-579 (*this)[i] += a*x[i];\n-580 return asImp();\n-581 }\n-582\n-590 template\n-_\b5_\b9_\b1 typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>::PromotedType _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const {\n-592 typedef typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>::PromotedType PromotedType;\n-593 PromotedType result(0);\n-594 assert(x._\bs_\bi_\bz_\be() == _\bs_\bi_\bz_\be());\n-595 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++) {\n-596 result += PromotedType((*this)[i]*x[i]);\n-597 }\n-598 return result;\n-599 }\n-600\n-608 template\n-_\b6_\b0_\b9 typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>::PromotedType _\bd_\bo_\bt(const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>& x) const {\n-610 typedef typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bO_\bt_\bh_\be_\br_\b>_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>::PromotedType PromotedType;\n-611 PromotedType result(0);\n-612 assert(x._\bs_\bi_\bz_\be() == _\bs_\bi_\bz_\be());\n-613 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++) {\n-614 result += _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bo_\bt((*this)[i],x[i]);\n-615 }\n-616 return result;\n-617 }\n-618\n-619 //===== norms\n-620\n-_\b6_\b2_\b2 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 _\bo_\bn_\be_\b__\bn_\bo_\br_\bm() const {\n-623 using std::abs;\n-624 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 result( 0 );\n-625 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-626 result += abs((*this)[i]);\n-627 return result;\n-628 }\n-629\n-630\n-_\b6_\b3_\b2 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 _\bo_\bn_\be_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl () const\n-633 {\n-634 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 result( 0 );\n-635 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-636 result += fvmeta::absreal((*this)[i]);\n-637 return result;\n-638 }\n-639\n-_\b6_\b4_\b1 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 _\bt_\bw_\bo_\b__\bn_\bo_\br_\bm () const\n-642 {\n-643 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 result( 0 );\n-644 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-645 result += fvmeta::abs2((*this)[i]);\n-646 return fvmeta::sqrt(result);\n-647 }\n-648\n-_\b6_\b5_\b0 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 _\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2 () const\n-651 {\n-652 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 result( 0 );\n-653 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be(); i++)\n-654 result += fvmeta::abs2((*this)[i]);\n-655 return result;\n-656 }\n-657\n-659 template ::value, int>::type = 0>\n-_\b6_\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() const {\n-662 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-663 using std::abs;\n-664 using std::max;\n-665\n-666 real_type norm = 0;\n-667 for (auto const &x : *this) {\n-668 real_type const a = abs(x);\n-669 norm = max(a, norm);\n-670 }\n-671 return norm;\n-672 }\n-673\n-675 template ::value, int>::type = 0>\n-_\b6_\b7_\b7 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-678 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-679 using std::max;\n-680\n-681 real_type norm = 0;\n-682 for (auto const &x : *this) {\n-683 real_type const a = fvmeta::absreal(x);\n-684 norm = max(a, norm);\n-685 }\n-686 return norm;\n-687 }\n-688\n-690 template ::value, int>::type = 0>\n-_\b6_\b9_\b2 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-693 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-694 using std::abs;\n-695 using std::max;\n-696\n-697 real_type norm = 0;\n-698 real_type isNaN = 1;\n-699 for (auto const &x : *this) {\n-700 real_type const a = abs(x);\n-701 norm = max(a, norm);\n-702 isNaN += a;\n-703 }\n-704 return norm * (isNaN / isNaN);\n-705 }\n-706\n-708 template ::value, int>::type = 0>\n-_\b7_\b1_\b0 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-711 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-712 using std::max;\n-713\n-714 real_type norm = 0;\n-715 real_type isNaN = 1;\n-716 for (auto const &x : *this) {\n-717 real_type const a = fvmeta::absreal(x);\n-718 norm = max(a, norm);\n-719 isNaN += a;\n-720 }\n-721 return norm * (isNaN / isNaN);\n-722 }\n-723\n-724 //===== sizes\n-725\n-_\b7_\b2_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN () const\n-728 {\n-729 return _\bs_\bi_\bz_\be();\n-730 }\n-731\n-_\b7_\b3_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bm () const\n-734 {\n-735 return _\bs_\bi_\bz_\be();\n-736 }\n-737\n-738 };\n-739\n-748 template\n-_\b7_\b4_\b9 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b>& v)\n-750 {\n-751 for (typename _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i0) ? \" \" : \"\") << v[i];\n-753 return s;\n-754 }\n-755\n-758} // end namespace\n-759\n-760#endif // DUNE_DENSEVECTOR_HH\n-_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Type traits to determine the type of reals (when working with complex numbers)\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-_\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_\bo_\bt_\bp_\br_\bo_\bd_\bu_\bc_\bt_\b._\bh_\bh\n-Provides the functions dot(a,b) := and dotT(a,b) := .\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-_\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_\bo_\bt\n-auto dot(const A &a, const B &b) -> typename std::enable_if< IsNumber< A >::\n-value &&!IsVector< A >::value &&!std::is_same< typename FieldTraits< A >::\n-field_type, typename FieldTraits< A >::real_type > ::value, decltype(conj(a)\n-*b)>::type\n-computes the dot product for fundamental data types according to Petsc's\n-VectDot function: dot(a,...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dotproduct.hh:42\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+_\b1_\b4_\b9 bool _\br_\be_\ba_\bd_\by() const{\n+150 int flag = -1;\n+151 MPI_Test(&req_, &flag, &status_);\n+152 return flag;\n+153 }\n+154\n+_\b1_\b5_\b5 R _\bg_\be_\bt() {\n+156 _\bw_\ba_\bi_\bt();\n+157 return data_.get();\n+158 }\n+159\n+_\b1_\b6_\b0 S _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bd_\ba_\bt_\ba(){\n+161 _\bw_\ba_\bi_\bt();\n+162 return send_data_._\bg_\be_\bt();\n+163 }\n+164\n+_\b1_\b6_\b5 auto _\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n+166 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*data_);\n+167 }\n+168\n+_\b1_\b6_\b9 auto _\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba(){\n+170 return _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(*send_data_);\n+171 }\n+172 };\n+173\n+174}\n+175#endif\n+176#endif\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+_\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:_\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:_\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 densevector.hh:250\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:_\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 densevector.hh:381\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:344\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\bn_\bd\n-ConstIterator find(size_type i) const\n-return iterator to given element or end()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:410\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-ConstIterator end() const\n-end ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:390\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-value_type & front()\n-return reference to first element\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:306\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_\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 densevector.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const DenseVector< Other > &x) const\n-Binary vector comparison.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:555\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:_\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 densevector.hh:367\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-DenseIterator< const DenseVector, const value_type > ConstIterator\n-ConstIterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:379\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-Traits::derived_type derived_type\n-type of derived vector class\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:247\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-const value_type & front() const\n-return reference to first element\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:312\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n-derived_type operator+(const DenseVector< Other > &b) const\n-Binary vector addition.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:439\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_\bV_\be_\bc_\bt_\bo_\br_\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 densevector.hh:733\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:_\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 densevector.hh:397\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bx_\bp_\by\n-derived_type & axpy(const field_type &a, const DenseVector< Other > &x)\n-vector space axpy operation ( *this += a x )\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:575\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-derived_type & operator=(const value_type &k)\n-Assignment operator for scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\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 densevector.hh:262\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:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\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 densevector.hh:259\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-DenseIterator< DenseVector, value_type > Iterator\n-Iterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:342\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-derived_type & operator-=(const DenseVector< Other > &x)\n-vector space subtraction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:429\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br\n-DenseVector(const DenseVector &)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:360\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-derived_type & operator+=(const DenseVector< Other > &x)\n-vector space addition\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:419\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-std::enable_if< std::is_convertible< FieldType, field_type >::value,\n-derived_type >::type & operator*=(const FieldType &kk)\n-vector space multiplication with scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:523\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const DenseVector< Other > &x) const\n-Binary vector incomparison.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:567\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n-const value_type & back() const\n-return reference to last element\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:324\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-ConstIterator begin() const\n-begin ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:384\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::\n-PromotedType operator*(const DenseVector< Other > &x) const\n-indefinite vector dot product which corresponds to Petsc's VecTDot\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:591\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br\n-constexpr DenseVector()=default\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_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-DenseVector & operator=(const DenseVector &)=default\n-Assignment operator for other DenseVector of same type.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\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 densevector.hh:256\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-value_type & operator[](size_type i)\n-random access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< value_type >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n-value_type & back()\n-return reference to last element\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:318\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n-derived_type operator-() const\n-Vector negation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:454\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-std::enable_if< std::is_convertible< FieldType, field_type >::value,\n-derived_type >::type & operator/=(const FieldType &kk)\n-vector space division by scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:545\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bn_\be_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-FieldTraits< value_type >::real_type one_norm_real() const\n-simplified one norm (uses Manhattan norm for complex values)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:632\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bt\n-PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::\n-PromotedType dot(const DenseVector< Other > &x) const\n-vector dot product which corresponds to Petsc's VecDot\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:609\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\bn_\bd\n-Iterator find(size_type i)\n-return iterator to given element or end()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:373\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bn_\be_\b__\bn_\bo_\br_\bm\n-FieldTraits< value_type >::real_type one_norm() const\n-one norm (sum over absolute values of entries)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:622\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\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 densevector.hh:727\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bm_\bp_\bt_\by\n-bool empty() const\n-checks whether the container is empty\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:330\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bV_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< typenameDenseMatVecTraits< V >::value_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:28\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bV_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< typenameDenseMatVecTraits< V >::value_type >::field_type\n-field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:27\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:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-SizeType index() const\n-return index\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:213\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:167\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-DenseIterator(const MutableIterator &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:173\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n-R elementAt(DifferenceType i) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-DifferenceType distanceTo(DenseIterator< const typename std::remove_const< C\n->::type, const typename std::remove_const< T >::type > other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-DenseIterator(const ConstIterator &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-DifferenceType distanceTo(DenseIterator< typename std::remove_const< C >::type,\n-typename std::remove_const< T >::type > other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-DenseIterator(C &cont, SizeType pos)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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-std::ptrdiff_t DifferenceType\n-The type of the difference between two positions.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\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 densevector.hh:196\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bi_\bz_\be_\bT_\by_\bp_\be\n-C::size_type SizeType\n-The type to index the underlying container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn densevector.hh:147\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:_\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:_\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:434\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:_\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+_\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:43\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:18\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:19\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:28\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: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(V &&t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpifuture.hh:25\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:29\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:20\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:53\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:44\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:54\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:50\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:69\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:76\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:70\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:85\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:107\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:149\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:139\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:112\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:92\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:131\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:169\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:143\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:165\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:155\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:99\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:160\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:122\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/a00212.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00212.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: boundschecking.hh File Reference\n+dune-common: collectivecommunication.hh File Reference\n \n \n \n \n \n \n \n@@ -65,38 +65,24 @@\n
    \n \n \n \n \n \n \n
    \n-
    \n-Macros
    \n-
    boundschecking.hh File Reference
    \n+
    collectivecommunication.hh File Reference
    \n
    \n
    \n-\n-

    Macro for wrapping boundary checks. \n-More...

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

    Go to the source code of this file.

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

    \n-Macros

    #define DUNE_ASSERT_BOUNDS(cond)
     If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
     
    \n-

    Detailed Description

    \n-

    Macro for wrapping boundary checks.

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,20 +1,12 @@\n dune-common\u00a02.9.0\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-boundschecking.hh File Reference\n-Macro for wrapping boundary checks. _\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+ * _\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 _\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__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(cond)\n-\u00a0 If DUNE_CHECK_BOUNDS is defined: check if condition c\bco\bon\bnd\bd holds;\n- otherwise, do nothing.\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-Macro for wrapping boundary checks.\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/a00212_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: boundschecking.hh Source File\n+dune-common: collectivecommunication.hh Source File\n \n \n \n \n \n \n \n@@ -70,48 +70,27 @@\n \n \n \n \n \n \n \n
    \n-
    boundschecking.hh
    \n+
    collectivecommunication.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_BOUNDSCHECKING_HH
    \n-
    4#define DUNE_BOUNDSCHECKING_HH
    \n-
    5
    \n-\n-
    7
    \n-
    19#ifndef DUNE_ASSERT_BOUNDS
    \n-
    20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN)
    \n-
    21
    \n-
    \n-
    30#define DUNE_ASSERT_BOUNDS(cond) \\
    \n-
    31 do { \\
    \n-
    32 if (!(cond)) \\
    \n-
    33 DUNE_THROW(Dune::RangeError, "Index out of bounds."); \\
    \n-
    34 } while (false)
    \n-
    \n-
    35
    \n-
    36#else
    \n-
    37#define DUNE_ASSERT_BOUNDS(cond)
    \n-
    38#endif
    \n-
    39#endif
    \n-
    40
    \n-
    41/* @} */
    \n-
    42
    \n-
    43#endif // DUNE_BOUNDSCHECKING_HH
    \n-
    A few common exception classes.
    \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,37 +1,21 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-boundschecking.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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// SPDX-FileCopyrightInfo: Copyright (C) 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_BOUNDSCHECKING_HH\n-4#define DUNE_BOUNDSCHECKING_HH\n-5\n-6#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-7\n-19#ifndef DUNE_ASSERT_BOUNDS\n-20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN)\n-21\n-_\b3_\b0#define DUNE_ASSERT_BOUNDS(cond) \\\n-31 do { \\\n-32 if (!(cond)) \\\n-33 DUNE_THROW(Dune::RangeError, \"Index out of bounds.\"); \\\n-34 } while (false)\n-35\n-36#else\n-37#define DUNE_ASSERT_BOUNDS(cond)\n-38#endif\n-39#endif\n-40\n-41/* @} */\n-42\n-43#endif // DUNE_BOUNDSCHECKING_HH\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\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/a00215.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00215.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: make_array.hh File Reference\n+dune-common: indicessyncer.hh File Reference\n \n \n \n \n \n \n \n@@ -65,45 +65,86 @@\n \n \n \n \n \n \n \n
    \n \n-
    make_array.hh File Reference
    \n+ \n
    \n
    \n-
    #include <array>
    \n-#include <type_traits>
    \n+\n+

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

    \n+
    #include "indexset.hh"
    \n+#include "remoteindices.hh"
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/sllist.hh>
    \n+#include <cassert>
    \n+#include <cmath>
    \n+#include <limits>
    \n+#include <algorithm>
    \n+#include <functional>
    \n+#include <map>
    \n+#include <tuple>
    \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-\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 Functions

    template<typename... Args>
    std::array< typename std::common_type< Args... >::type, sizeof...(Args)> Dune::Std::make_array (const Args &... args)
     Create and initialize an array.
     
    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-
    \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 Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,27 +1,77 @@\n dune-common\u00a02.9.0\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-make_array.hh File Reference\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 | _\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 \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n+#include \"_\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/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+#include \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_\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-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-std::array< typename std::common_type< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\ba_\bk_\be_\b__\ba_\br_\br_\ba_\by (const Args &...\n- Args... >::type, sizeof...(Args)>\u00a0 args)\n-\u00a0 Create and initialize an array.\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/a00215_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: make_array.hh Source File\n+dune-common: indicessyncer.hh Source File\n \n \n \n \n \n \n \n@@ -70,64 +70,1051 @@\n \n \n \n \n \n \n \n
    \n-
    make_array.hh
    \n+
    indicessyncer.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_MAKE_ARRAY_HH
    \n-
    4#define DUNE_COMMON_STD_MAKE_ARRAY_HH
    \n-
    5
    \n-
    6#include <array>
    \n-
    7#include <type_traits>
    \n-
    8
    \n-
    9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n-
    10#include <experimental/array>
    \n-
    11#endif
    \n-
    12
    \n-
    13#warning make_array.hh is deprecated and will be removed after Dune 2.9. \\
    \n-
    14 Use deduction guide of `std::array` or `std::to_array`.
    \n-
    15
    \n-
    16namespace Dune {
    \n-
    17namespace Std {
    \n-
    18
    \n-
    19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n-
    20
    \n-
    22 using std::experimental::make_array;
    \n-
    23
    \n-
    24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n-
    25
    \n-
    27
    \n-
    41 template <typename... Args>
    \n-
    42 std::array<typename std::common_type<Args...>::type, sizeof...(Args)>
    \n-
    \n-
    43 make_array(const Args&... args) {
    \n-
    44 std::array<typename std::common_type<Args...>::type, sizeof...(Args)>
    \n-
    45 result = {{args...}};
    \n-
    46 return result;
    \n-
    47 }
    \n-
    \n-
    48
    \n-
    49#endif // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
    \n-
    50
    \n-
    51}
    \n-
    52}
    \n-
    53
    \n-
    54#endif
    \n-
    std::array< typename std::common_type< Args... >::type, sizeof...(Args)> make_array(const Args &... args)
    Create and initialize an array.
    Definition make_array.hh:43
    \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 (C) 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_INDICESSYNCER_HH
    \n+
    6#define DUNE_INDICESSYNCER_HH
    \n+
    7
    \n+
    8#include "indexset.hh"
    \n+
    9#include "remoteindices.hh"
    \n+\n+
    11#include <dune/common/sllist.hh>
    \n+
    12#include <cassert>
    \n+
    13#include <cmath>
    \n+
    14#include <limits>
    \n+
    15#include <algorithm>
    \n+
    16#include <functional>
    \n+
    17#include <map>
    \n+
    18#include <tuple>
    \n+
    19
    \n+
    20#if HAVE_MPI
    \n+
    21namespace Dune
    \n+
    22{
    \n+
    39 template<typename T>
    \n+
    \n+\n+
    41 {
    \n+
    42 public:
    \n+
    43
    \n+\n+
    46
    \n+\n+
    49
    \n+\n+
    52
    \n+
    54 typedef typename ParallelIndexSet::LocalIndex::Attribute Attribute;
    \n+
    55
    \n+\n+
    60
    \n+\n+
    71 RemoteIndices& remoteIndices);
    \n+
    72
    \n+
    82 void sync();
    \n+
    83
    \n+
    94 template<typename T1>
    \n+
    95 void sync(T1& numberer);
    \n+
    96
    \n+
    97 private:
    \n+
    98
    \n+
    100 ParallelIndexSet& indexSet_;
    \n+
    101
    \n+
    103 RemoteIndices& remoteIndices_;
    \n+
    104
    \n+
    106 char** sendBuffers_;
    \n+
    107
    \n+
    109 char* receiveBuffer_;
    \n+
    110
    \n+
    112 std::size_t* sendBufferSizes_;
    \n+
    113
    \n+
    115 int receiveBufferSize_; // int because of MPI
    \n+
    116
    \n+
    120 struct MessageInformation
    \n+
    121 {
    \n+
    \n+\n+
    123 : publish(), pairs()
    \n+
    124 {}
    \n+
    \n+\n+
    131 int pairs;
    \n+
    132 };
    \n+
    133
    \n+
    137 class DefaultNumberer
    \n+
    138 {
    \n+
    139 public:
    \n+
    145 std::size_t operator()([[maybe_unused]] const GlobalIndex& global)
    \n+
    146 {
    \n+
    147 return std::numeric_limits<size_t>::max();
    \n+
    148 }
    \n+
    149 };
    \n+
    150
    \n+
    152 MPI_Datatype datatype_;
    \n+
    153
    \n+
    155 int rank_;
    \n+
    156
    \n+
    161 typedef SLList<std::pair<GlobalIndex,Attribute>, typename RemoteIndices::Allocator> GlobalIndexList;
    \n+
    162
    \n+
    164 typedef typename GlobalIndexList::ModifyIterator GlobalIndexModifier;
    \n+
    165
    \n+\n+
    170 GlobalIndexIterator;
    \n+
    171
    \n+
    173 typedef std::map<int, GlobalIndexList> GlobalIndicesMap;
    \n+
    174
    \n+
    183 GlobalIndicesMap globalMap_;
    \n+
    184
    \n+\n+
    189
    \n+
    193 typedef typename BoolList::iterator BoolIterator;
    \n+
    194
    \n+
    196 typedef typename BoolList::ModifyIterator BoolListModifier;
    \n+
    197
    \n+
    199 typedef std::map<int,BoolList> BoolMap;
    \n+
    200
    \n+
    205 BoolMap oldMap_;
    \n+
    206
    \n+
    208 std::map<int,MessageInformation> infoSend_;
    \n+
    209
    \n+
    211 typedef typename RemoteIndices::RemoteIndexList RemoteIndexList;
    \n+
    212
    \n+
    214 typedef typename RemoteIndexList::ModifyIterator RemoteIndexModifier;
    \n+
    215
    \n+\n+
    218
    \n+
    220 typedef typename RemoteIndexList::iterator RemoteIndexIterator;
    \n+
    221
    \n+
    223 typedef typename RemoteIndexList::const_iterator ConstRemoteIndexIterator;
    \n+
    224
    \n+
    226 typedef std::tuple<RemoteIndexModifier,GlobalIndexModifier,BoolListModifier,
    \n+
    227 const ConstRemoteIndexIterator> IteratorTuple;
    \n+
    228
    \n+
    236 class Iterators
    \n+
    237 {
    \n+
    238 friend class IndicesSyncer<T>;
    \n+
    239 public:
    \n+
    249 Iterators(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n+
    250 BoolList& booleans);
    \n+
    251
    \n+
    255 Iterators();
    \n+
    256
    \n+\n+
    261
    \n+
    267 void insert(const RemoteIndex& index,
    \n+
    268 const std::pair<GlobalIndex,Attribute>& global);
    \n+
    269
    \n+
    274 RemoteIndex& remoteIndex() const;
    \n+
    275
    \n+
    280 std::pair<GlobalIndex,Attribute>& globalIndexPair() const;
    \n+
    281
    \n+\n+
    283
    \n+
    289 bool isOld() const;
    \n+
    290
    \n+
    300 void reset(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
    \n+
    301 BoolList& booleans);
    \n+
    302
    \n+
    308 bool isNotAtEnd() const;
    \n+
    309
    \n+
    315 bool isAtEnd() const;
    \n+
    316
    \n+
    317 private:
    \n+
    327 IteratorTuple iterators_;
    \n+
    328 };
    \n+
    329
    \n+
    331 typedef std::map<int,Iterators> IteratorsMap;
    \n+
    332
    \n+
    344 IteratorsMap iteratorsMap_;
    \n+
    345
    \n+
    347 void calculateMessageSizes();
    \n+
    348
    \n+
    356 void packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& req);
    \n+
    357
    \n+
    362 template<typename T1>
    \n+
    363 void recvAndUnpack(T1& numberer);
    \n+
    364
    \n+
    368 void registerMessageDatatype();
    \n+
    369
    \n+
    373 void insertIntoRemoteIndexList(int process,
    \n+
    374 const std::pair<GlobalIndex,Attribute>& global,
    \n+
    375 char attribute);
    \n+
    376
    \n+
    380 void resetIteratorsMap();
    \n+
    381
    \n+
    386 bool checkReset();
    \n+
    387
    \n+
    396 bool checkReset(const Iterators& iterators, RemoteIndexList& rlist, GlobalIndexList& gList,
    \n+
    397 BoolList& bList);
    \n+
    398 };
    \n+
    \n+
    399
    \n+
    400 template<typename TG, typename TA>
    \n+
    \n+\n+
    402 const std::pair<TG,TA>& i2)
    \n+
    403 {
    \n+
    404 return i1.global() < i2.first ||
    \n+
    405 (i1.global() == i2.first && i1.local().attribute()<i2.second);
    \n+
    406 }
    \n+
    \n+
    407
    \n+
    408 template<typename TG, typename TA>
    \n+
    \n+
    409 bool operator<(const std::pair<TG,TA>& i1,
    \n+
    410 const IndexPair<TG,ParallelLocalIndex<TA> >& i2)
    \n+
    411 {
    \n+
    412 return i1.first < i2.global() ||
    \n+
    413 (i1.first == i2.global() && i1.second<i2.local().attribute());
    \n+
    414 }
    \n+
    \n+
    415
    \n+
    416 template<typename TG, typename TA>
    \n+
    \n+\n+
    418 const std::pair<TG,TA>& i2)
    \n+
    419 {
    \n+
    420 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n+
    421 }
    \n+
    \n+
    422
    \n+
    423 template<typename TG, typename TA>
    \n+
    \n+\n+
    425 const std::pair<TG,TA>& i2)
    \n+
    426 {
    \n+
    427 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n+
    428 }
    \n+
    \n+
    429
    \n+
    430 template<typename TG, typename TA>
    \n+
    \n+
    431 bool operator==(const std::pair<TG,TA>& i2,
    \n+
    432 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n+
    433 {
    \n+
    434 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
    \n+
    435 }
    \n+
    \n+
    436
    \n+
    437 template<typename TG, typename TA>
    \n+
    \n+
    438 bool operator!=(const std::pair<TG,TA>& i2,
    \n+
    439 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
    \n+
    440 {
    \n+
    441 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
    \n+
    442 }
    \n+
    \n+
    443
    \n+
    460 template<typename T, typename A, typename A1>
    \n+
    \n+
    461 void storeGlobalIndicesOfRemoteIndices(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n+
    462 const RemoteIndices<T,A1>& remoteIndices)
    \n+
    463 {
    \n+
    464 for(auto remote = remoteIndices.begin(), end =remoteIndices.end(); remote != end; ++remote) {
    \n+
    465 typedef typename RemoteIndices<T,A1>::RemoteIndexList RemoteIndexList;
    \n+\n+
    467 GlobalIndexList& global = globalMap[remote->first];
    \n+
    468 RemoteIndexList& rList = *(remote->second.first);
    \n+
    469
    \n+
    470 for(auto index = rList.begin(), riEnd = rList.end();
    \n+
    471 index != riEnd; ++index) {
    \n+
    472 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n+
    473 index->localIndexPair().local().attribute()));
    \n+
    474 }
    \n+
    475 }
    \n+
    476 }
    \n+
    \n+
    477
    \n+
    486 template<typename T, typename A, typename A1>
    \n+
    \n+
    487 inline void repairLocalIndexPointers(std::map<int,
    \n+
    488 SLList<std::pair<typename T::GlobalIndex,
    \n+
    489 typename T::LocalIndex::Attribute>,A> >& globalMap,
    \n+
    490 RemoteIndices<T,A1>& remoteIndices,
    \n+
    491 const T& indexSet)
    \n+
    492 {
    \n+
    493 assert(globalMap.size()==static_cast<std::size_t>(remoteIndices.neighbours()));
    \n+
    494 // Repair pointers to index set in remote indices.
    \n+
    495 auto global = globalMap.begin();
    \n+
    496 auto end = remoteIndices.remoteIndices_.end();
    \n+
    497
    \n+
    498 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end; ++remote, ++global) {
    \n+
    499 assert(remote->first==global->first);
    \n+
    500 assert(remote->second.first->size() == global->second.size());
    \n+
    501
    \n+
    502 auto riEnd = remote->second.first->end();
    \n+
    503 auto rIndex = remote->second.first->begin();
    \n+
    504 auto gIndex = global->second.begin();
    \n+
    505 auto index = indexSet.begin();
    \n+
    506
    \n+
    507 assert(rIndex==riEnd || gIndex != global->second.end());
    \n+
    508 while(rIndex != riEnd) {
    \n+
    509 // Search for the index in the set.
    \n+
    510 assert(gIndex != global->second.end());
    \n+
    511
    \n+
    512 while(!(index->global() == gIndex->first
    \n+
    513 && index->local().attribute() == gIndex->second)) {
    \n+
    514 ++index;
    \n+
    515 // this is only needed for ALU, where there may exist
    \n+
    516 // more entries with the same global index in the remote index set
    \n+
    517 // than in the index set
    \n+
    518 if (index->global() > gIndex->first) {
    \n+
    519 index=indexSet.begin();
    \n+
    520 }
    \n+
    521 }
    \n+
    522
    \n+
    523 assert(index != indexSet.end() && *index == *gIndex);
    \n+
    524
    \n+
    525 rIndex->localIndex_ = &(*index);
    \n+
    526 ++index;
    \n+
    527 ++rIndex;
    \n+
    528 ++gIndex;
    \n+
    529 }
    \n+
    530 }
    \n+
    531 remoteIndices.sourceSeqNo_ = remoteIndices.source_->seqNo();
    \n+
    532 remoteIndices.destSeqNo_ = remoteIndices.target_->seqNo();
    \n+
    533 }
    \n+
    \n+
    534
    \n+
    535 template<typename T>
    \n+
    \n+\n+
    537 RemoteIndices& remoteIndices)
    \n+
    538 : indexSet_(indexSet), remoteIndices_(remoteIndices)
    \n+
    539 {
    \n+
    540 // index sets must match.
    \n+
    541 assert(remoteIndices.source_ == remoteIndices.target_);
    \n+
    542 assert(remoteIndices.source_ == &indexSet);
    \n+
    543 MPI_Comm_rank(remoteIndices_.communicator(), &rank_);
    \n+
    544 }
    \n+
    \n+
    545
    \n+
    546 template<typename T>
    \n+
    \n+\n+
    548 GlobalIndexList& globalIndices,
    \n+
    549 BoolList& booleans)
    \n+
    550 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),
    \n+
    551 booleans.beginModify(), remoteIndices.end())
    \n+
    552 { }
    \n+
    \n+
    553
    \n+
    554 template<typename T>
    \n+
    \n+\n+
    556 : iterators_()
    \n+
    557 {}
    \n+
    \n+
    558
    \n+
    559 template<typename T>
    \n+
    \n+\n+
    561 {
    \n+
    562 ++(std::get<0>(iterators_));
    \n+
    563 ++(std::get<1>(iterators_));
    \n+
    564 ++(std::get<2>(iterators_));
    \n+
    565 return *this;
    \n+
    566 }
    \n+
    \n+
    567
    \n+
    568 template<typename T>
    \n+
    \n+\n+
    570 const std::pair<GlobalIndex,Attribute>& global)
    \n+
    571 {
    \n+
    572 std::get<0>(iterators_).insert(index);
    \n+
    573 std::get<1>(iterators_).insert(global);
    \n+
    574 std::get<2>(iterators_).insert(false);
    \n+
    575 }
    \n+
    \n+
    576
    \n+
    577 template<typename T>
    \n+
    578 inline typename IndicesSyncer<T>::RemoteIndex&
    \n+
    \n+\n+
    580 {
    \n+
    581 return *(std::get<0>(iterators_));
    \n+
    582 }
    \n+
    \n+
    583
    \n+
    584 template<typename T>
    \n+
    585 inline std::pair<typename IndicesSyncer<T>::GlobalIndex,typename IndicesSyncer<T>::Attribute>&
    \n+
    \n+\n+
    587 {
    \n+
    588 return *(std::get<1>(iterators_));
    \n+
    589 }
    \n+
    \n+
    590
    \n+
    591 template<typename T>
    \n+
    \n+\n+
    593 {
    \n+
    594 return *(std::get<2>(iterators_));
    \n+
    595 }
    \n+
    \n+
    596
    \n+
    597 template<typename T>
    \n+
    \n+\n+
    599 GlobalIndexList& globalIndices,
    \n+
    600 BoolList& booleans)
    \n+
    601 {
    \n+
    602 std::get<0>(iterators_) = remoteIndices.beginModify();
    \n+
    603 std::get<1>(iterators_) = globalIndices.beginModify();
    \n+
    604 std::get<2>(iterators_) = booleans.beginModify();
    \n+
    605 }
    \n+
    \n+
    606
    \n+
    607 template<typename T>
    \n+
    \n+\n+
    609 {
    \n+
    610 return std::get<0>(iterators_) != std::get<3>(iterators_);
    \n+
    611 }
    \n+
    \n+
    612
    \n+
    613 template<typename T>
    \n+
    \n+\n+
    615 {
    \n+
    616 return std::get<0>(iterators_) == std::get<3>(iterators_);
    \n+
    617 }
    \n+
    \n+
    618
    \n+
    619 template<typename T>
    \n+\n+
    621 {
    \n+
    622 MPI_Datatype type[2] = {MPI_INT, MPI_INT};
    \n+
    623 int blocklength[2] = {1,1};
    \n+
    624 MPI_Aint displacement[2];
    \n+
    625 MPI_Aint base;
    \n+
    626
    \n+
    627 // Compute displacement
    \n+
    628 MessageInformation message;
    \n+
    629
    \n+
    630 MPI_Get_address( &(message.publish), displacement);
    \n+
    631 MPI_Get_address( &(message.pairs), displacement+1);
    \n+
    632
    \n+
    633 // Make the displacement relative
    \n+
    634 MPI_Get_address(&message, &base);
    \n+
    635 displacement[0] -= base;
    \n+
    636 displacement[1] -= base;
    \n+
    637
    \n+
    638 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);
    \n+
    639 MPI_Type_commit(&datatype_);
    \n+
    640 }
    \n+
    641
    \n+
    642 template<typename T>
    \n+
    643 void IndicesSyncer<T>::calculateMessageSizes()
    \n+
    644 {
    \n+
    645 auto iEnd = indexSet_.end();
    \n+
    646 auto collIter = remoteIndices_.template iterator<true>();
    \n+
    647
    \n+
    648 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n+
    649 collIter.advance(index->global(), index->local().attribute());
    \n+
    650 if(collIter.empty())
    \n+
    651 break;
    \n+
    652 int knownRemote=0;
    \n+
    653 auto end = collIter.end();
    \n+
    654
    \n+
    655 // Count the remote indices we know.
    \n+
    656 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n+
    657 ++knownRemote;
    \n+
    658 }
    \n+
    659
    \n+
    660 if(knownRemote>0) {
    \n+
    661 Dune::dverb<<rank_<<": publishing "<<knownRemote<<" for index "<<index->global()<< " for processes ";
    \n+
    662
    \n+
    663 // Update MessageInformation
    \n+
    664 for(auto valid = collIter.begin(); valid != end; ++valid) {
    \n+
    665 ++(infoSend_[valid.process()].publish);
    \n+
    666 (infoSend_[valid.process()].pairs) += knownRemote;
    \n+
    667 Dune::dverb<<valid.process()<<" ";
    \n+
    668 Dune::dverb<<"(publish="<<infoSend_[valid.process()].publish<<", pairs="<<infoSend_[valid.process()].pairs
    \n+
    669 <<") ";
    \n+
    670 }
    \n+
    671 Dune::dverb<<std::endl;
    \n+
    672 }
    \n+
    673 }
    \n+
    674
    \n+
    675 const auto end = infoSend_.end();
    \n+
    676
    \n+
    677 // Now determine the buffersizes needed for each neighbour using MPI_Pack_size
    \n+
    678 MessageInformation dummy;
    \n+
    679
    \n+
    680 auto messageIter= infoSend_.begin();
    \n+
    681 const auto rend = remoteIndices_.end();
    \n+
    682 int neighbour=0;
    \n+
    683
    \n+
    684 for(auto remote = remoteIndices_.begin(); remote != rend; ++remote, ++neighbour) {
    \n+
    685 MessageInformation* message;
    \n+
    686 MessageInformation recv;
    \n+
    687
    \n+
    688 if(messageIter != end && messageIter->first==remote->first) {
    \n+
    689 // We want to send message information to that process
    \n+
    690 message = const_cast<MessageInformation*>(&(messageIter->second));
    \n+
    691 ++messageIter;
    \n+
    692 }else
    \n+
    693 // We do not want to send information but the other process might.
    \n+
    694 message = &dummy;
    \n+
    695
    \n+
    696 sendBufferSizes_[neighbour]=0;
    \n+
    697 int tsize;
    \n+
    698 // The number of indices published
    \n+
    699 MPI_Pack_size(1, MPI_INT,remoteIndices_.communicator(), &tsize);
    \n+
    700 sendBufferSizes_[neighbour] += tsize;
    \n+
    701
    \n+
    702 for(int i=0; i < message->publish; ++i) {
    \n+
    703 // The global index
    \n+
    704 MPI_Pack_size(1, MPITraits<GlobalIndex>::getType(), remoteIndices_.communicator(), &tsize);
    \n+
    705 sendBufferSizes_[neighbour] += tsize;
    \n+
    706 // The attribute in the local index
    \n+
    707 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n+
    708 sendBufferSizes_[neighbour] += tsize;
    \n+
    709 // The number of corresponding remote indices
    \n+
    710 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n+
    711 sendBufferSizes_[neighbour] += tsize;
    \n+
    712 }
    \n+
    713 for(int i=0; i < message->pairs; ++i) {
    \n+
    714 // The process of the remote index
    \n+
    715 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
    \n+
    716 sendBufferSizes_[neighbour] += tsize;
    \n+
    717 // The attribute of the remote index
    \n+
    718 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
    \n+
    719 sendBufferSizes_[neighbour] += tsize;
    \n+
    720 }
    \n+
    721
    \n+
    722 Dune::dverb<<rank_<<": Buffer (neighbour="<<remote->first<<") size is "<< sendBufferSizes_[neighbour]<<" for publish="<<message->publish<<" pairs="<<message->pairs<<std::endl;
    \n+
    723 }
    \n+
    724
    \n+
    725 }
    \n+
    726
    \n+
    727 template<typename T>
    \n+
    \n+\n+
    729 {
    \n+
    730 DefaultNumberer numberer;
    \n+
    731 sync(numberer);
    \n+
    732 }
    \n+
    \n+
    733
    \n+
    734 template<typename T>
    \n+
    735 template<typename T1>
    \n+
    \n+
    736 void IndicesSyncer<T>::sync(T1& numberer)
    \n+
    737 {
    \n+
    738 // The pointers to the local indices in the remote indices
    \n+
    739 // will become invalid due to the resorting of the index set.
    \n+
    740 // Therefore store the corresponding global indices.
    \n+
    741 // Mark all indices as not added
    \n+
    742 const auto end = remoteIndices_.end();
    \n+
    743
    \n+
    744 // Number of neighbours might change during the syncing.
    \n+
    745 // save the old neighbours
    \n+
    746 std::size_t noOldNeighbours = remoteIndices_.neighbours();
    \n+
    747 int* oldNeighbours = new int[noOldNeighbours];
    \n+
    748 sendBufferSizes_ = new std::size_t[noOldNeighbours];
    \n+
    749 std::size_t neighbourI = 0;
    \n+
    750
    \n+
    751 for(auto remote = remoteIndices_.begin(); remote != end; ++remote, ++neighbourI) {
    \n+
    752 oldNeighbours[neighbourI] = remote->first;
    \n+
    753
    \n+
    754 // Make sure we only have one remote index list.
    \n+
    755 assert(remote->second.first==remote->second.second);
    \n+
    756
    \n+
    757 RemoteIndexList& rList = *(remote->second.first);
    \n+
    758
    \n+
    759 // Store the corresponding global indices.
    \n+
    760 GlobalIndexList& global = globalMap_[remote->first];
    \n+
    761 BoolList& added = oldMap_[remote->first];
    \n+
    762 auto riEnd = rList.end();
    \n+
    763
    \n+
    764 for(auto index = rList.begin();
    \n+
    765 index != riEnd; ++index) {
    \n+
    766 global.push_back(std::make_pair(index->localIndexPair().global(),
    \n+
    767 index->localIndexPair().local().attribute()));
    \n+
    768 added.push_back(true);
    \n+
    769 }
    \n+
    770
    \n+
    771 Iterators iterators(rList, global, added);
    \n+
    772 iteratorsMap_.insert(std::make_pair(remote->first, iterators));
    \n+
    773 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));
    \n+
    774 }
    \n+
    775
    \n+
    776 // Exchange indices with each neighbour
    \n+
    777 calculateMessageSizes();
    \n+
    778
    \n+
    779 // Allocate the buffers
    \n+
    780 receiveBufferSize_=1;
    \n+
    781 sendBuffers_ = new char*[noOldNeighbours];
    \n+
    782
    \n+
    783 for(std::size_t i=0; i<noOldNeighbours; ++i) {
    \n+
    784 sendBuffers_[i] = new char[sendBufferSizes_[i]];
    \n+
    785 receiveBufferSize_ = std::max(receiveBufferSize_, static_cast<int>(sendBufferSizes_[i]));
    \n+
    786 }
    \n+
    787
    \n+
    788 receiveBuffer_=new char[receiveBufferSize_];
    \n+
    789
    \n+
    790 indexSet_.beginResize();
    \n+
    791
    \n+
    792 Dune::dverb<<rank_<<": Neighbours: ";
    \n+
    793
    \n+
    794 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n+
    795 Dune::dverb<<oldNeighbours[i]<<" ";
    \n+
    796
    \n+
    797 Dune::dverb<<std::endl;
    \n+
    798
    \n+
    799 MPI_Request* requests = new MPI_Request[noOldNeighbours];
    \n+
    800 MPI_Status* statuses = new MPI_Status[noOldNeighbours];
    \n+
    801
    \n+
    802 // Pack Message data and start the sends
    \n+
    803 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n+
    804 packAndSend(oldNeighbours[i], sendBuffers_[i], sendBufferSizes_[i], requests[i]);
    \n+
    805
    \n+
    806 // Probe for incoming messages, receive and unpack them
    \n+
    807 for(std::size_t i = 0; i<noOldNeighbours; ++i)
    \n+
    808 recvAndUnpack(numberer);
    \n+
    809 // }else{
    \n+
    810 // recvAndUnpack(oldNeighbours[i], numberer);
    \n+
    811 // packAndSend(oldNeighbours[i]);
    \n+
    812 // }
    \n+
    813 // }
    \n+
    814
    \n+
    815 delete[] receiveBuffer_;
    \n+
    816
    \n+
    817 // Wait for the completion of the sends
    \n+
    818 // Wait for completion of sends
    \n+
    819 if(MPI_SUCCESS!=MPI_Waitall(noOldNeighbours, requests, statuses)) {
    \n+
    820 std::cerr<<": MPI_Error occurred while sending message"<<std::endl;
    \n+
    821 for(std::size_t i=0; i< noOldNeighbours; i++)
    \n+
    822 if(MPI_SUCCESS!=statuses[i].MPI_ERROR)
    \n+
    823 std::cerr<<"Destination "<<statuses[i].MPI_SOURCE<<" error code: "<<statuses[i].MPI_ERROR<<std::endl;
    \n+
    824 }
    \n+
    825
    \n+
    826 delete[] statuses;
    \n+
    827 delete[] requests;
    \n+
    828
    \n+
    829 for(std::size_t i=0; i<noOldNeighbours; ++i)
    \n+
    830 delete[] sendBuffers_[i];
    \n+
    831
    \n+
    832 delete[] sendBuffers_;
    \n+
    833 delete[] sendBufferSizes_;
    \n+
    834
    \n+
    835 // No need for the iterator tuples any more
    \n+
    836 iteratorsMap_.clear();
    \n+
    837
    \n+
    838 indexSet_.endResize();
    \n+
    839
    \n+
    840 delete[] oldNeighbours;
    \n+
    841
    \n+
    842 repairLocalIndexPointers(globalMap_, remoteIndices_, indexSet_);
    \n+
    843
    \n+
    844 oldMap_.clear();
    \n+
    845 globalMap_.clear();
    \n+
    846
    \n+
    847 // update the sequence number
    \n+
    848 remoteIndices_.sourceSeqNo_ = remoteIndices_.destSeqNo_ = indexSet_.seqNo();
    \n+
    849 }
    \n+
    \n+
    850
    \n+
    851 template<typename T>
    \n+
    852 void IndicesSyncer<T>::packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& request)
    \n+
    853 {
    \n+
    854 auto iEnd = indexSet_.end();
    \n+
    855 int bpos = 0;
    \n+
    856 int published = 0;
    \n+
    857 int pairs = 0;
    \n+
    858
    \n+
    859 assert(checkReset());
    \n+
    860
    \n+
    861 // Pack the number of indices we publish
    \n+
    862 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize, &bpos,
    \n+
    863 remoteIndices_.communicator());
    \n+
    864
    \n+
    865 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
    \n+
    866 // Search for corresponding remote indices in all iterator tuples
    \n+
    867 auto iteratorsEnd = iteratorsMap_.end();
    \n+
    868
    \n+
    869 // advance all iterators to a position with global index >= index->global()
    \n+
    870 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators) {
    \n+
    871 while(iterators->second.isNotAtEnd() &&
    \n+
    872 iterators->second.globalIndexPair().first < index->global())
    \n+
    873 ++(iterators->second);
    \n+
    874 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair().first >= index->global());
    \n+
    875 }
    \n+
    876
    \n+
    877 // Add all remote indices positioned at global which were already present before calling sync
    \n+
    878 // to the message.
    \n+
    879 // Count how many remote indices we will send
    \n+
    880 int indices = 0;
    \n+
    881 bool knownRemote = false; // Is the remote process supposed to know this index?
    \n+
    882
    \n+
    883 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n+
    884 {
    \n+
    885 std::pair<GlobalIndex,Attribute> p;
    \n+
    886 if (iterators->second.isNotAtEnd())
    \n+
    887 {
    \n+
    888 p = iterators->second.globalIndexPair();
    \n+
    889 }
    \n+
    890
    \n+
    891 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n+
    892 && iterators->second.globalIndexPair().first == index->global()) {
    \n+
    893 indices++;
    \n+
    894 if(destination == iterators->first)
    \n+
    895 knownRemote = true;
    \n+
    896 }
    \n+
    897 }
    \n+
    898
    \n+
    899 if(!knownRemote)
    \n+
    900 // We do not need to send any indices
    \n+
    901 continue;
    \n+
    902
    \n+
    903 Dune::dverb<<rank_<<": sending "<<indices<<" for index "<<index->global()<<" to "<<destination<<std::endl;
    \n+
    904
    \n+
    905
    \n+
    906 // Pack the global index, the attribute and the number
    \n+
    907 MPI_Pack(const_cast<GlobalIndex*>(&(index->global())), 1, MPITraits<GlobalIndex>::getType(), buffer, bufferSize, &bpos,
    \n+
    908 remoteIndices_.communicator());
    \n+
    909
    \n+
    910 char attr = index->local().attribute();
    \n+
    911 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n+
    912 remoteIndices_.communicator());
    \n+
    913
    \n+
    914 // Pack the number of remote indices we send.
    \n+
    915 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n+
    916 remoteIndices_.communicator());
    \n+
    917
    \n+
    918 // Pack the information about the remote indices
    \n+
    919 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
    \n+
    920 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
    \n+
    921 && iterators->second.globalIndexPair().first == index->global()) {
    \n+
    922 int process = iterators->first;
    \n+
    923
    \n+
    924 ++pairs;
    \n+
    925 assert(pairs <= infoSend_[destination].pairs);
    \n+
    926 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,
    \n+
    927 remoteIndices_.communicator());
    \n+
    928 char attr2 = iterators->second.remoteIndex().attribute();
    \n+
    929
    \n+
    930 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,
    \n+
    931 remoteIndices_.communicator());
    \n+
    932 --indices;
    \n+
    933 }
    \n+
    934 assert(indices==0);
    \n+
    935 ++published;
    \n+
    936 Dune::dvverb<<" (publish="<<published<<", pairs="<<pairs<<")"<<std::endl;
    \n+
    937 assert(published <= infoSend_[destination].publish);
    \n+
    938 }
    \n+
    939
    \n+
    940 // Make sure we send all expected entries
    \n+
    941 assert(published == infoSend_[destination].publish);
    \n+
    942 assert(pairs == infoSend_[destination].pairs);
    \n+
    943 resetIteratorsMap();
    \n+
    944
    \n+
    945 Dune::dverb << rank_<<": Sending message of "<<bpos<<" bytes to "<<destination<<std::endl;
    \n+
    946
    \n+
    947 MPI_Issend(buffer, bpos, MPI_PACKED, destination, 345, remoteIndices_.communicator(),&request);
    \n+
    948 }
    \n+
    949
    \n+
    950 template<typename T>
    \n+
    951 inline void IndicesSyncer<T>::insertIntoRemoteIndexList(int process,
    \n+
    952 const std::pair<GlobalIndex,Attribute>& globalPair,
    \n+
    953 char attribute)
    \n+
    954 {
    \n+
    955 Dune::dverb<<"Inserting from "<<process<<" "<<globalPair.first<<", "<<
    \n+
    956 globalPair.second<<" "<<attribute<<std::endl;
    \n+
    957
    \n+
    958 resetIteratorsMap();
    \n+
    959
    \n+
    960 // There might be cases where there no remote indices for that process yet
    \n+
    961 typename IteratorsMap::iterator found = iteratorsMap_.find(process);
    \n+
    962
    \n+
    963 if( found == iteratorsMap_.end() ) {
    \n+
    964 Dune::dverb<<"Discovered new neighbour "<<process<<std::endl;
    \n+
    965 RemoteIndexList* rlist = new RemoteIndexList();
    \n+
    966 remoteIndices_.remoteIndices_.insert(std::make_pair(process,std::make_pair(rlist,rlist)));
    \n+
    967 Iterators iterators = Iterators(*rlist, globalMap_[process], oldMap_[process]);
    \n+
    968 found = iteratorsMap_.insert(std::make_pair(process, iterators)).first;
    \n+
    969 }
    \n+
    970
    \n+
    971 Iterators& iterators = found->second;
    \n+
    972
    \n+
    973 // Search for the remote index
    \n+
    974 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {
    \n+
    975 // Increment all iterators
    \n+
    976 ++iterators;
    \n+
    977
    \n+
    978 }
    \n+
    979
    \n+
    980 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {
    \n+
    981 // The entry is not yet known
    \n+
    982 // Insert in the list and do not change the first iterator.
    \n+
    983 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n+
    984 return;
    \n+
    985 }
    \n+
    986
    \n+
    987 // Global indices match
    \n+
    988 bool indexIsThere=false;
    \n+
    989 for(Iterators tmpIterators = iterators;
    \n+
    990 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;
    \n+
    991 ++tmpIterators)
    \n+
    992 //entry already exists with the same attribute
    \n+
    993 if(tmpIterators.globalIndexPair().second == attribute) {
    \n+
    994 indexIsThere=true;
    \n+
    995 break;
    \n+
    996 }
    \n+
    997
    \n+
    998 if(!indexIsThere)
    \n+
    999 // The entry is not yet known
    \n+
    1000 // Insert in the list and do not change the first iterator.
    \n+
    1001 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
    \n+
    1002 }
    \n+
    1003
    \n+
    1004 template<typename T>
    \n+
    1005 template<typename T1>
    \n+
    1006 void IndicesSyncer<T>::recvAndUnpack(T1& numberer)
    \n+
    1007 {
    \n+
    1008 const ParallelIndexSet& constIndexSet = indexSet_;
    \n+
    1009 auto iEnd = constIndexSet.end();
    \n+
    1010 auto index = constIndexSet.begin();
    \n+
    1011 int bpos = 0;
    \n+
    1012 int publish;
    \n+
    1013
    \n+
    1014 assert(checkReset());
    \n+
    1015
    \n+
    1016 MPI_Status status;
    \n+
    1017
    \n+
    1018 // We have to determine the message size and source before the receive
    \n+
    1019 MPI_Probe(MPI_ANY_SOURCE, 345, remoteIndices_.communicator(), &status);
    \n+
    1020
    \n+
    1021 int source=status.MPI_SOURCE;
    \n+
    1022 int count;
    \n+
    1023 MPI_Get_count(&status, MPI_PACKED, &count);
    \n+
    1024
    \n+
    1025 Dune::dvverb<<rank_<<": Receiving message from "<< source<<" with "<<count<<" bytes"<<std::endl;
    \n+
    1026
    \n+
    1027 if(count>receiveBufferSize_) {
    \n+
    1028 receiveBufferSize_=count;
    \n+
    1029 delete[] receiveBuffer_;
    \n+
    1030 receiveBuffer_ = new char[receiveBufferSize_];
    \n+
    1031 }
    \n+
    1032
    \n+
    1033 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345, remoteIndices_.communicator(), &status);
    \n+
    1034
    \n+
    1035 // How many global entries were published?
    \n+
    1036 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT, remoteIndices_.communicator());
    \n+
    1037
    \n+
    1038 // Now unpack the remote indices and add them.
    \n+
    1039 while(publish>0) {
    \n+
    1040
    \n+
    1041 // Unpack information about the local index on the source process
    \n+
    1042 GlobalIndex global; // global index of the current entry
    \n+
    1043 char sourceAttribute; // Attribute on the source process
    \n+
    1044 int pairs;
    \n+
    1045
    \n+
    1046 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1, MPITraits<GlobalIndex>::getType(),
    \n+
    1047 remoteIndices_.communicator());
    \n+
    1048 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,
    \n+
    1049 remoteIndices_.communicator());
    \n+
    1050 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,
    \n+
    1051 remoteIndices_.communicator());
    \n+
    1052
    \n+
    1053 // Insert the entry on the remote process to our
    \n+
    1054 // remote index list
    \n+
    1055 SLList<std::pair<int,Attribute> > sourceAttributeList;
    \n+
    1056 sourceAttributeList.push_back(std::make_pair(source,Attribute(sourceAttribute)));
    \n+
    1057#ifndef NDEBUG
    \n+
    1058 bool foundSelf = false;
    \n+
    1059#endif
    \n+
    1060 Attribute myAttribute=Attribute();
    \n+
    1061
    \n+
    1062 // Unpack the remote indices
    \n+
    1063 for(; pairs>0; --pairs) {
    \n+
    1064 // Unpack the process id that knows the index
    \n+
    1065 int process;
    \n+
    1066 char attribute;
    \n+
    1067 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,
    \n+
    1068 remoteIndices_.communicator());
    \n+
    1069 // Unpack the attribute
    \n+
    1070 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,
    \n+
    1071 remoteIndices_.communicator());
    \n+
    1072
    \n+
    1073 if(process==rank_) {
    \n+
    1074#ifndef NDEBUG
    \n+
    1075 foundSelf=true;
    \n+
    1076#endif
    \n+
    1077 myAttribute=Attribute(attribute);
    \n+
    1078 // Now we know the local attribute of the global index
    \n+
    1079 //Only add the index if it is unknown.
    \n+
    1080 // Do we know that global index already?
    \n+
    1081 auto pos = std::lower_bound(index, iEnd, IndexPair(global));
    \n+
    1082
    \n+
    1083 if(pos == iEnd || pos->global() != global) {
    \n+
    1084 // no entry with this global index
    \n+
    1085 indexSet_.add(global,
    \n+
    1086 ParallelLocalIndex<Attribute>(numberer(global),
    \n+
    1087 myAttribute, true));
    \n+
    1088 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n+
    1089 continue;
    \n+
    1090 }
    \n+
    1091
    \n+
    1092 // because of above the global indices match. Add only if the attribute is different
    \n+
    1093 bool indexIsThere = false;
    \n+
    1094 index=pos;
    \n+
    1095
    \n+
    1096 for(; pos->global()==global; ++pos)
    \n+
    1097 if(pos->local().attribute() == myAttribute) {
    \n+
    1098 Dune::dvverb<<"found "<<global<<" "<<myAttribute<<std::endl;
    \n+
    1099 indexIsThere = true;
    \n+
    1100 break;
    \n+
    1101 }
    \n+
    1102
    \n+
    1103 if(!indexIsThere) {
    \n+
    1104 indexSet_.add(global,
    \n+
    1105 ParallelLocalIndex<Attribute>(numberer(global),
    \n+
    1106 myAttribute, true));
    \n+
    1107 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
    \n+
    1108 }
    \n+
    1109
    \n+
    1110 }else{
    \n+
    1111 sourceAttributeList.push_back(std::make_pair(process,Attribute(attribute)));
    \n+
    1112 }
    \n+
    1113 }
    \n+
    1114 assert(foundSelf);
    \n+
    1115 // Insert remote indices
    \n+
    1116 typedef typename SLList<std::pair<int,Attribute> >::const_iterator Iter;
    \n+
    1117 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();
    \n+
    1118 i!=end; ++i)
    \n+
    1119 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),
    \n+
    1120 i->second);
    \n+
    1121 --publish;
    \n+
    1122 }
    \n+
    1123
    \n+
    1124 resetIteratorsMap();
    \n+
    1125 }
    \n+
    1126
    \n+
    1127 template<typename T>
    \n+
    1128 void IndicesSyncer<T>::resetIteratorsMap(){
    \n+
    1129
    \n+
    1130 // Reset iterators in all tuples.
    \n+
    1131 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n+
    1132 auto iterators = iteratorsMap_.begin();
    \n+
    1133 auto global = globalMap_.begin();
    \n+
    1134 auto added = oldMap_.begin();
    \n+
    1135
    \n+
    1136 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n+
    1137 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n+
    1138 iterators->second.reset(*(remote->second.first), global->second, added->second);
    \n+
    1139 }
    \n+
    1140 }
    \n+
    1141
    \n+
    1142 template<typename T>
    \n+
    1143 bool IndicesSyncer<T>::checkReset(const Iterators& iterators, RemoteIndexList& rList, GlobalIndexList& gList,
    \n+
    1144 BoolList& bList){
    \n+
    1145
    \n+
    1146 if(std::get<0>(iterators.iterators_) != rList.begin())
    \n+
    1147 return false;
    \n+
    1148 if(std::get<1>(iterators.iterators_) != gList.begin())
    \n+
    1149 return false;
    \n+
    1150 if(std::get<2>(iterators.iterators_) != bList.begin())
    \n+
    1151 return false;
    \n+
    1152 return true;
    \n+
    1153 }
    \n+
    1154
    \n+
    1155
    \n+
    1156 template<typename T>
    \n+
    1157 bool IndicesSyncer<T>::checkReset(){
    \n+
    1158
    \n+
    1159 // Reset iterators in all tuples.
    \n+
    1160 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
    \n+
    1161 auto iterators = iteratorsMap_.begin();
    \n+
    1162 auto global = globalMap_.begin();
    \n+
    1163 auto added = oldMap_.begin();
    \n+
    1164 bool ret = true;
    \n+
    1165
    \n+
    1166 for(auto remote = remoteIndices_.remoteIndices_.begin();
    \n+
    1167 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
    \n+
    1168 if(!checkReset(iterators->second, *(remote->second.first), global->second,
    \n+
    1169 added->second))
    \n+
    1170 ret=false;
    \n+
    1171 }
    \n+
    1172 return ret;
    \n+
    1173 }
    \n+
    1174}
    \n+
    1175
    \n+
    1176#endif
    \n+
    1177#endif
    \n+
    Provides a map between global and local indices.
    \n+
    Classes describing a distributed indexset.
    \n+
    Implements a singly linked list together with the necessary iterators.
    \n+
    Standard Dune debug streams.
    \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:637
    \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:237
    \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:259
    \n+
    Iterators()
    Default constructor.
    Definition indicessyncer.hh:555
    \n+
    Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
    Type of the remote indices.
    Definition indicessyncer.hh:59
    \n+
    bool isOld() const
    Was this entry already in the remote index list before the sync process?
    Definition indicessyncer.hh:592
    \n+
    int publish
    The number of indices we publish for the other process.
    Definition indicessyncer.hh:126
    \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:487
    \n+
    bool isAtEnd() const
    Are we at the end of the list?
    Definition indicessyncer.hh:614
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    Type of the global index used in the index set.
    Definition indicessyncer.hh:51
    \n+
    int pairs
    The number of pairs (attribute and process number) we publish to the neighbour process.
    Definition indicessyncer.hh:131
    \n+
    Attribute & attribute() const
    \n+
    Iterators & operator++()
    Increment all iteraors.
    Definition indicessyncer.hh:560
    \n+
    ParallelIndexSet::LocalIndex::Attribute Attribute
    Type of the attribute used in the index set.
    Definition indicessyncer.hh:54
    \n+
    std::pair< GlobalIndex, Attribute > & globalIndexPair() const
    Get the global index of the remote index at current position.
    Definition indicessyncer.hh:586
    \n+
    IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)
    Constructor.
    Definition indicessyncer.hh:536
    \n+
    void reset(RemoteIndexList &remoteIndices, GlobalIndexList &globalIndices, BoolList &booleans)
    Reset all the underlying iterators.
    Definition indicessyncer.hh:598
    \n+
    std::size_t operator()(const GlobalIndex &global)
    Provide the local index, always std::numeric_limits<size_t>::max()
    Definition indicessyncer.hh:145
    \n+
    T ParallelIndexSet
    The type of the index set.
    Definition indicessyncer.hh:45
    \n+
    bool isNotAtEnd() const
    Are we not at the end of the list?
    Definition indicessyncer.hh:608
    \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:461
    \n+
    void sync()
    Sync the index set.
    Definition indicessyncer.hh:728
    \n+
    int seqNo() const
    Get the internal sequence number.
    \n+
    ParallelIndexSet::IndexPair IndexPair
    The type of the index pair.
    Definition indicessyncer.hh:48
    \n+
    RemoteIndex & remoteIndex() const
    Get the remote index at current position.
    Definition indicessyncer.hh:579
    \n+
    MessageInformation()
    Definition indicessyncer.hh:122
    \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:569
    \n+
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:95
    \n+
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:116
    \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:41
    \n+
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:49
    \n+
    The indices present on remote processes.
    Definition remoteindices.hh:189
    \n+
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1696
    \n+
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1529
    \n+
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1446
    \n+
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:237
    \n+
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1522
    \n+
    Information about an index residing on another processor.
    Definition remoteindices.hh:73
    \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,59 +1,1204 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-make_array.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_STD_MAKE_ARRAY_HH\n-4#define DUNE_COMMON_STD_MAKE_ARRAY_HH\n-5\n-6#include \n-7#include \n-8\n-9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n-10#include \n-11#endif\n-12\n-13#warning make_array.hh is deprecated and will be removed after Dune 2.9. \\\n-14 Use deduction guide of `std::array` or `std::to_array`.\n-15\n-16namespace _\bD_\bu_\bn_\be {\n-17namespace Std {\n-18\n-19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n-20\n-22 using std::experimental::make_array;\n-23\n-24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n-25\n-27\n-41 template \n-42 std::array::type, sizeof...(Args)>\n-_\b4_\b3 _\bm_\ba_\bk_\be_\b__\ba_\br_\br_\ba_\by(const Args&... args) {\n-44 std::array::type, sizeof...(Args)>\n-45 result = {{args...}};\n-46 return result;\n-47 }\n-48\n-49#endif // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY\n-50\n-51}\n-52}\n-53\n-54#endif\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bm_\ba_\bk_\be_\b__\ba_\br_\br_\ba_\by\n-std::array< typename std::common_type< Args... >::type, sizeof...(Args)>\n-make_array(const Args &... args)\n-Create and initialize an array.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn make_array.hh:43\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_INDICESSYNCER_HH\n+6#define DUNE_INDICESSYNCER_HH\n+7\n+8#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n+9#include \"_\br_\be_\bm_\bo_\bt_\be_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\"\n+10#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+11#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\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#if HAVE_MPI\n+21namespace _\bD_\bu_\bn_\be\n+22{\n+39 template\n+_\b4_\b0 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br\n+41 {\n+42 public:\n+43\n+_\b4_\b5 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+46\n+_\b4_\b8 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+49\n+_\b5_\b1 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+52\n+_\b5_\b4 typedef typename ParallelIndexSet::LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+55\n+_\b5_\b9 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+60\n+70 _\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+71 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices);\n+72\n+82 void _\bs_\by_\bn_\bc();\n+83\n+94 template\n+95 void _\bs_\by_\bn_\bc(T1& numberer);\n+96\n+97 private:\n+98\n+100 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet_;\n+101\n+103 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices_;\n+104\n+106 char** sendBuffers_;\n+107\n+109 char* receiveBuffer_;\n+110\n+112 std::size_t* sendBufferSizes_;\n+113\n+115 int receiveBufferSize_; // int because of MPI\n+116\n+120 struct MessageInformation\n+121 {\n+_\b1_\b2_\b2 _\bM_\be_\bs_\bs_\ba_\bg_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n+123 : _\bp_\bu_\bb_\bl_\bi_\bs_\bh(), _\bp_\ba_\bi_\br_\bs()\n+124 {}\n+_\b1_\b2_\b6 int _\bp_\bu_\bb_\bl_\bi_\bs_\bh;\n+_\b1_\b3_\b1 int _\bp_\ba_\bi_\br_\bs;\n+132 };\n+133\n+137 class DefaultNumberer\n+138 {\n+139 public:\n+_\b1_\b4_\b5 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+146 {\n+147 return std::numeric_limits::max();\n+148 }\n+149 };\n+150\n+152 MPI_Datatype datatype_;\n+153\n+155 int rank_;\n+156\n+161 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+162\n+164 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+165\n+169 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+170 GlobalIndexIterator;\n+171\n+173 typedef std::map GlobalIndicesMap;\n+174\n+183 GlobalIndicesMap globalMap_;\n+184\n+188 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+189\n+193 typedef typename _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br BoolIterator;\n+194\n+196 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+197\n+199 typedef std::map BoolMap;\n+200\n+205 BoolMap oldMap_;\n+206\n+208 std::map infoSend_;\n+209\n+211 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+212\n+214 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+215\n+217 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+218\n+220 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+221\n+223 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+224\n+226 typedef std::\n+tuple IteratorTuple;\n+228\n+236 class Iterators\n+237 {\n+238 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+239 public:\n+249 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,\n+250 BoolList& booleans);\n+251\n+255 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs();\n+256\n+260 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+261\n+267 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index,\n+268 const std::pair& global);\n+269\n+274 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx() const;\n+275\n+280 std::pair& _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br() const;\n+281\n+_\b2_\b8_\b2 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n+283\n+289 bool _\bi_\bs_\bO_\bl_\bd() const;\n+290\n+300 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+301 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans);\n+302\n+308 bool _\bi_\bs_\bN_\bo_\bt_\bA_\bt_\bE_\bn_\bd() const;\n+309\n+315 bool _\bi_\bs_\bA_\bt_\bE_\bn_\bd() const;\n+316\n+317 private:\n+327 IteratorTuple iterators_;\n+328 };\n+329\n+331 typedef std::map IteratorsMap;\n+332\n+344 IteratorsMap iteratorsMap_;\n+345\n+347 void calculateMessageSizes();\n+348\n+356 void packAndSend(int destination, char* buffer, std::size_t bufferSize,\n+MPI_Request& req);\n+357\n+362 template\n+363 void recvAndUnpack(T1& numberer);\n+364\n+368 void registerMessageDatatype();\n+369\n+373 void insertIntoRemoteIndexList(int process,\n+374 const std::pair& global,\n+375 char attribute);\n+376\n+380 void resetIteratorsMap();\n+381\n+386 bool checkReset();\n+387\n+396 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+397 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& bList);\n+398 };\n+399\n+400 template\n+_\b4_\b0_\b1 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n+402 const std::pair& i2)\n+403 {\n+404 return i1.global() < i2.first ||\n+405 (i1.global() == i2.first && i1.local().attribute()\n+_\b4_\b0_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const std::pair& i1,\n+410 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i2)\n+411 {\n+412 return i1.first < i2.global() ||\n+413 (i1.first == i2.global() && i1.second\n+_\b4_\b1_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n+418 const std::pair& i2)\n+419 {\n+420 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n+421 }\n+422\n+423 template\n+_\b4_\b2_\b4 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1,\n+425 const std::pair& i2)\n+426 {\n+427 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n+428 }\n+429\n+430 template\n+_\b4_\b3_\b1 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const std::pair& i2,\n+432 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n+433 {\n+434 return (i1.global() == i2.first && i1.local().attribute()==i2.second);\n+435 }\n+436\n+437 template\n+_\b4_\b3_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const std::pair& i2,\n+439 const _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br >& i1)\n+440 {\n+441 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);\n+442 }\n+443\n+460 template\n+_\b4_\b6_\b1 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+462 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices)\n+463 {\n+464 for(auto remote = remoteIndices._\bb_\be_\bg_\bi_\bn(), end =remoteIndices._\be_\bn_\bd(); remote\n+!= end; ++remote) {\n+465 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+466 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+467 GlobalIndexList& global = globalMap[remote->first];\n+468 RemoteIndexList& rList = *(remote->second.first);\n+469\n+470 for(auto index = rList.begin(), riEnd = rList.end();\n+471 index != riEnd; ++index) {\n+472 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n+473 index->localIndexPair().local().attribute()));\n+474 }\n+475 }\n+476 }\n+477\n+486 template\n+_\b4_\b8_\b7 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+490 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>& remoteIndices,\n+491 const T& indexSet)\n+492 {\n+493 assert(globalMap.size()==static_cast(remoteIndices._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+()));\n+494 // Repair pointers to index set in remote indices.\n+495 auto global = globalMap.begin();\n+496 auto end = remoteIndices.remoteIndices_.end();\n+497\n+498 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end;\n+++remote, ++global) {\n+499 assert(remote->first==global->first);\n+500 assert(remote->second.first->size() == global->second.size());\n+501\n+502 auto riEnd = remote->second.first->end();\n+503 auto rIndex = remote->second.first->begin();\n+504 auto gIndex = global->second.begin();\n+505 auto index = indexSet.begin();\n+506\n+507 assert(rIndex==riEnd || gIndex != global->second.end());\n+508 while(rIndex != riEnd) {\n+509 // Search for the index in the set.\n+510 assert(gIndex != global->second.end());\n+511\n+512 while(!(index->global() == gIndex->first\n+513 && index->local().attribute() == gIndex->second)) {\n+514 ++index;\n+515 // this is only needed for ALU, where there may exist\n+516 // more entries with the same global index in the remote index set\n+517 // than in the index set\n+518 if (index->global() > gIndex->first) {\n+519 index=indexSet.begin();\n+520 }\n+521 }\n+522\n+523 assert(index != indexSet.end() && *index == *gIndex);\n+524\n+525 rIndex->localIndex_ = &(*index);\n+526 ++index;\n+527 ++rIndex;\n+528 ++gIndex;\n+529 }\n+530 }\n+531 remoteIndices.sourceSeqNo_ = remoteIndices.source_->_\bs_\be_\bq_\bN_\bo();\n+532 remoteIndices.destSeqNo_ = remoteIndices.target_->_\bs_\be_\bq_\bN_\bo();\n+533 }\n+534\n+535 template\n+_\b5_\b3_\b6 _\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+537 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& remoteIndices)\n+538 : indexSet_(indexSet), remoteIndices_(remoteIndices)\n+539 {\n+540 // index sets must match.\n+541 assert(remoteIndices.source_ == remoteIndices.target_);\n+542 assert(remoteIndices.source_ == &indexSet);\n+543 MPI_Comm_rank(remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &rank_);\n+544 }\n+545\n+546 template\n+_\b5_\b4_\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:_\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+548 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n+549 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n+550 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),\n+551 booleans.beginModify(), remoteIndices.end())\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()\n+556 : iterators_()\n+557 {}\n+558\n+559 template\n+_\b5_\b6_\b0 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+561 {\n+562 ++(std::get<0>(iterators_));\n+563 ++(std::get<1>(iterators_));\n+564 ++(std::get<2>(iterators_));\n+565 return *this;\n+566 }\n+567\n+568 template\n+_\b5_\b6_\b9 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+570 const std::pair& global)\n+571 {\n+572 std::get<0>(iterators_).insert(index);\n+573 std::get<1>(iterators_).insert(global);\n+574 std::get<2>(iterators_).insert(false);\n+575 }\n+576\n+577 template\n+578 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_\b7_\b9 _\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+580 {\n+581 return *(std::get<0>(iterators_));\n+582 }\n+583\n+584 template\n+585 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_\b8_\b6 _\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+587 {\n+588 return *(std::get<1>(iterators_));\n+589 }\n+590\n+591 template\n+_\b5_\b9_\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_\bO_\bl_\bd() const\n+593 {\n+594 return *(std::get<2>(iterators_));\n+595 }\n+596\n+597 template\n+_\b5_\b9_\b8 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+599 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& globalIndices,\n+600 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& booleans)\n+601 {\n+602 std::get<0>(iterators_) = remoteIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n+603 std::get<1>(iterators_) = globalIndices._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n+604 std::get<2>(iterators_) = booleans._\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by();\n+605 }\n+606\n+607 template\n+_\b6_\b0_\b8 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+609 {\n+610 return std::get<0>(iterators_) != std::get<3>(iterators_);\n+611 }\n+612\n+613 template\n+_\b6_\b1_\b4 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+615 {\n+616 return std::get<0>(iterators_) == std::get<3>(iterators_);\n+617 }\n+618\n+619 template\n+620 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+621 {\n+622 MPI_Datatype type[2] = {MPI_INT, MPI_INT};\n+623 int blocklength[2] = {1,1};\n+624 MPI_Aint displacement[2];\n+625 MPI_Aint base;\n+626\n+627 // Compute displacement\n+628 MessageInformation message;\n+629\n+630 MPI_Get_address( &(message.publish), displacement);\n+631 MPI_Get_address( &(message.pairs), displacement+1);\n+632\n+633 // Make the displacement relative\n+634 MPI_Get_address(&message, &base);\n+635 displacement[0] -= base;\n+636 displacement[1] -= base;\n+637\n+638 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);\n+639 MPI_Type_commit(&datatype_);\n+640 }\n+641\n+642 template\n+643 void IndicesSyncer::calculateMessageSizes()\n+644 {\n+645 auto iEnd = indexSet_.end();\n+646 auto collIter = remoteIndices_.template iterator();\n+647\n+648 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n+649 collIter.advance(index->global(), index->local().attribute());\n+650 if(collIter.empty())\n+651 break;\n+652 int knownRemote=0;\n+653 auto end = collIter.end();\n+654\n+655 // Count the remote indices we know.\n+656 for(auto valid = collIter.begin(); valid != end; ++valid) {\n+657 ++knownRemote;\n+658 }\n+659\n+660 if(knownRemote>0) {\n+661 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<global()<< \" for processes \";\n+662\n+663 // Update MessageInformation\n+664 for(auto valid = collIter.begin(); valid != end; ++valid) {\n+665 ++(infoSend_[valid.process()].publish);\n+666 (infoSend_[valid.process()].pairs) += knownRemote;\n+667 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<first==remote->first) {\n+689 // We want to send message information to that process\n+690 message = const_cast(&(messageIter->second));\n+691 ++messageIter;\n+692 }else\n+693 // We do not want to send information but the other process might.\n+694 message = &dummy;\n+695\n+696 sendBufferSizes_[neighbour]=0;\n+697 int tsize;\n+698 // The number of indices published\n+699 MPI_Pack_size(1, MPI_INT,remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+700 sendBufferSizes_[neighbour] += tsize;\n+701\n+702 for(int i=0; i < message->publish; ++i) {\n+703 // The global index\n+704 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+705 sendBufferSizes_[neighbour] += tsize;\n+706 // The attribute in the local index\n+707 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+708 sendBufferSizes_[neighbour] += tsize;\n+709 // The number of corresponding remote indices\n+710 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+711 sendBufferSizes_[neighbour] += tsize;\n+712 }\n+713 for(int i=0; i < message->pairs; ++i) {\n+714 // The process of the remote index\n+715 MPI_Pack_size(1, MPI_INT, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+716 sendBufferSizes_[neighbour] += tsize;\n+717 // The attribute of the remote index\n+718 MPI_Pack_size(1, MPI_CHAR, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &tsize);\n+719 sendBufferSizes_[neighbour] += tsize;\n+720 }\n+721\n+722 _\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_\b2_\b8 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+729 {\n+730 DefaultNumberer numberer;\n+731 _\bs_\by_\bn_\bc(numberer);\n+732 }\n+733\n+734 template\n+735 template\n+_\b7_\b3_\b6 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)\n+737 {\n+738 // The pointers to the local indices in the remote indices\n+739 // will become invalid due to the resorting of the index set.\n+740 // Therefore store the corresponding global indices.\n+741 // Mark all indices as not added\n+742 const auto end = remoteIndices_._\be_\bn_\bd();\n+743\n+744 // Number of neighbours might change during the syncing.\n+745 // save the old neighbours\n+746 std::size_t noOldNeighbours = remoteIndices_._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs();\n+747 int* oldNeighbours = new int[noOldNeighbours];\n+748 sendBufferSizes_ = new std::size_t[noOldNeighbours];\n+749 std::size_t neighbourI = 0;\n+750\n+751 for(auto remote = remoteIndices_._\bb_\be_\bg_\bi_\bn(); remote != end; ++remote,\n+++neighbourI) {\n+752 oldNeighbours[neighbourI] = remote->first;\n+753\n+754 // Make sure we only have one remote index list.\n+755 assert(remote->second.first==remote->second.second);\n+756\n+757 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList = *(remote->second.first);\n+758\n+759 // Store the corresponding global indices.\n+760 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& global = globalMap_[remote->first];\n+761 _\bB_\bo_\bo_\bl_\bL_\bi_\bs_\bt& added = oldMap_[remote->first];\n+762 auto riEnd = rList._\be_\bn_\bd();\n+763\n+764 for(auto index = rList._\bb_\be_\bg_\bi_\bn();\n+765 index != riEnd; ++index) {\n+766 global._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(std::make_pair(index->localIndexPair().global(),\n+767 index->localIndexPair().local().attribute()));\n+768 added._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(true);\n+769 }\n+770\n+771 Iterators iterators(rList, global, added);\n+772 iteratorsMap_.insert(std::make_pair(remote->first, iterators));\n+773 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));\n+774 }\n+775\n+776 // Exchange indices with each neighbour\n+777 calculateMessageSizes();\n+778\n+779 // Allocate the buffers\n+780 receiveBufferSize_=1;\n+781 sendBuffers_ = new char*[noOldNeighbours];\n+782\n+783 for(std::size_t i=0; i\n+(sendBufferSizes_[i]));\n+786 }\n+787\n+788 receiveBuffer_=new char[receiveBufferSize_];\n+789\n+790 indexSet_.beginResize();\n+791\n+792 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<\n+852 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+853 {\n+854 auto iEnd = indexSet_.end();\n+855 int bpos = 0;\n+856 int published = 0;\n+857 int pairs = 0;\n+858\n+859 assert(checkReset());\n+860\n+861 // Pack the number of indices we publish\n+862 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize,\n+&bpos,\n+863 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+864\n+865 for(auto index = indexSet_.begin(); index != iEnd; ++index) {\n+866 // Search for corresponding remote indices in all iterator tuples\n+867 auto iteratorsEnd = iteratorsMap_.end();\n+868\n+869 // advance all iterators to a position with global index >= index->global()\n+870 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n+++iterators) {\n+871 while(iterators->second.isNotAtEnd() &&\n+872 iterators->second.globalIndexPair().first < index->global())\n+873 ++(iterators->second);\n+874 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair\n+().first >= index->global());\n+875 }\n+876\n+877 // Add all remote indices positioned at global which were already present\n+before calling sync\n+878 // to the message.\n+879 // Count how many remote indices we will send\n+880 int indices = 0;\n+881 bool knownRemote = false; // Is the remote process supposed to know this\n+index?\n+882\n+883 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n+++iterators)\n+884 {\n+885 std::pair p;\n+886 if (iterators->second.isNotAtEnd())\n+887 {\n+888 p = iterators->second.globalIndexPair();\n+889 }\n+890\n+891 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n+892 && iterators->second.globalIndexPair().first == index->global()) {\n+893 indices++;\n+894 if(destination == iterators->first)\n+895 knownRemote = true;\n+896 }\n+897 }\n+898\n+899 if(!knownRemote)\n+900 // We do not need to send any indices\n+901 continue;\n+902\n+903 _\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+908 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+909\n+910 char attr = index->local().attribute();\n+911 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n+912 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+913\n+914 // Pack the number of remote indices we send.\n+915 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,\n+916 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+917\n+918 // Pack the information about the remote indices\n+919 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators;\n+++iterators)\n+920 if(iterators->second.isNotAtEnd() && iterators->second.isOld()\n+921 && iterators->second.globalIndexPair().first == index->global()) {\n+922 int process = iterators->first;\n+923\n+924 ++pairs;\n+925 assert(pairs <= infoSend_[destination].pairs);\n+926 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,\n+927 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+928 char attr2 = iterators->second.remoteIndex().attribute();\n+929\n+930 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,\n+931 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+932 --indices;\n+933 }\n+934 assert(indices==0);\n+935 ++published;\n+936 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\" (publish=\"<\n+951 inline void IndicesSyncer::insertIntoRemoteIndexList(int process,\n+952 const std::pair& globalPair,\n+953 char attribute)\n+954 {\n+955 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb<<\"Inserting from \"<second;\n+972\n+973 // Search for the remote index\n+974 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {\n+975 // Increment all iterators\n+976 ++iterators;\n+977\n+978 }\n+979\n+980 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {\n+981 // The entry is not yet known\n+982 // Insert in the list and do not change the first iterator.\n+983 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n+984 return;\n+985 }\n+986\n+987 // Global indices match\n+988 bool indexIsThere=false;\n+989 for(Iterators tmpIterators = iterators;\n+990 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;\n+991 ++tmpIterators)\n+992 //entry already exists with the same attribute\n+993 if(tmpIterators.globalIndexPair().second == attribute) {\n+994 indexIsThere=true;\n+995 break;\n+996 }\n+997\n+998 if(!indexIsThere)\n+999 // The entry is not yet known\n+1000 // Insert in the list and do not change the first iterator.\n+1001 iterators.insert(RemoteIndex(_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute)),globalPair);\n+1002 }\n+1003\n+1004 template\n+1005 template\n+1006 void IndicesSyncer::recvAndUnpack(T1& numberer)\n+1007 {\n+1008 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& constIndexSet = indexSet_;\n+1009 auto iEnd = constIndexSet.end();\n+1010 auto index = constIndexSet.begin();\n+1011 int bpos = 0;\n+1012 int publish;\n+1013\n+1014 assert(checkReset());\n+1015\n+1016 MPI_Status status;\n+1017\n+1018 // We have to determine the message size and source before the receive\n+1019 MPI_Probe(MPI_ANY_SOURCE, 345, remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &status);\n+1020\n+1021 int source=status.MPI_SOURCE;\n+1022 int count;\n+1023 MPI_Get_count(&status, MPI_PACKED, &count);\n+1024\n+1025 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<receiveBufferSize_) {\n+1028 receiveBufferSize_=count;\n+1029 delete[] receiveBuffer_;\n+1030 receiveBuffer_ = new char[receiveBufferSize_];\n+1031 }\n+1032\n+1033 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345,\n+remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &status);\n+1034\n+1035 // How many global entries were published?\n+1036 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT,\n+remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1037\n+1038 // Now unpack the remote indices and add them.\n+1039 while(publish>0) {\n+1040\n+1041 // Unpack information about the local index on the source process\n+1042 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global; // global index of the current entry\n+1043 char sourceAttribute; // Attribute on the source process\n+1044 int pairs;\n+1045\n+1046 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+1047 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1048 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,\n+1049 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1050 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,\n+1051 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1052\n+1053 // Insert the entry on the remote process to our\n+1054 // remote index list\n+1055 SLList > sourceAttributeList;\n+1056 sourceAttributeList.push_back(std::make_pair(source,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+(sourceAttribute)));\n+1057#ifndef NDEBUG\n+1058 bool foundSelf = false;\n+1059#endif\n+1060 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be();\n+1061\n+1062 // Unpack the remote indices\n+1063 for(; pairs>0; --pairs) {\n+1064 // Unpack the process id that knows the index\n+1065 int process;\n+1066 char attribute;\n+1067 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,\n+1068 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1069 // Unpack the attribute\n+1070 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,\n+1071 remoteIndices_._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br());\n+1072\n+1073 if(process==rank_) {\n+1074#ifndef NDEBUG\n+1075 foundSelf=true;\n+1076#endif\n+1077 myAttribute=_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(attribute);\n+1078 // Now we know the local attribute of the global index\n+1079 //Only add the index if it is unknown.\n+1080 // Do we know that global index already?\n+1081 auto pos = std::lower_bound(index, iEnd, _\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br(global));\n+1082\n+1083 if(pos == iEnd || pos->global() != global) {\n+1084 // no entry with this global index\n+1085 indexSet_.add(global,\n+1086 ParallelLocalIndex(numberer(global),\n+1087 myAttribute, true));\n+1088 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"<global()==global; ++pos)\n+1097 if(pos->local().attribute() == myAttribute) {\n+1098 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<<\"found \"<(numberer(global),\n+1106 myAttribute, true));\n+1107 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb << \"Adding \"< >::const_iterator Iter;\n+1117 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();\n+1118 i!=end; ++i)\n+1119 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),\n+1120 i->second);\n+1121 --publish;\n+1122 }\n+1123\n+1124 resetIteratorsMap();\n+1125 }\n+1126\n+1127 template\n+1128 void IndicesSyncer::resetIteratorsMap(){\n+1129\n+1130 // Reset iterators in all tuples.\n+1131 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n+1132 auto iterators = iteratorsMap_.begin();\n+1133 auto global = globalMap_.begin();\n+1134 auto added = oldMap_.begin();\n+1135\n+1136 for(auto remote = remoteIndices_.remoteIndices_.begin();\n+1137 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n+1138 iterators->second.reset(*(remote->second.first), global->second, added-\n+>second);\n+1139 }\n+1140 }\n+1141\n+1142 template\n+1143 bool IndicesSyncer::checkReset(const Iterators& iterators,\n+RemoteIndexList& rList, GlobalIndexList& gList,\n+1144 BoolList& bList){\n+1145\n+1146 if(std::get<0>(iterators.iterators_) != rList.begin())\n+1147 return false;\n+1148 if(std::get<1>(iterators.iterators_) != gList.begin())\n+1149 return false;\n+1150 if(std::get<2>(iterators.iterators_) != bList.begin())\n+1151 return false;\n+1152 return true;\n+1153 }\n+1154\n+1155\n+1156 template\n+1157 bool IndicesSyncer::checkReset(){\n+1158\n+1159 // Reset iterators in all tuples.\n+1160 const auto remoteEnd = remoteIndices_.remoteIndices_.end();\n+1161 auto iterators = iteratorsMap_.begin();\n+1162 auto global = globalMap_.begin();\n+1163 auto added = oldMap_.begin();\n+1164 bool ret = true;\n+1165\n+1166 for(auto remote = remoteIndices_.remoteIndices_.begin();\n+1167 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {\n+1168 if(!checkReset(iterators->second, *(remote->second.first), global->second,\n+1169 added->second))\n+1170 ret=false;\n+1171 }\n+1172 return ret;\n+1173 }\n+1174}\n+1175\n+1176#endif\n+1177#endif\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_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh\n+Implements a singly linked list together with the necessary iterators.\n+_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n+Standard Dune debug streams.\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:637\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:237\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:259\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:555\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:59\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:592\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:126\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:487\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:614\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:51\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:131\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 iteraors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicessyncer.hh:560\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:54\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:586\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:536\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:598\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:145\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:45\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:608\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:461\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:728\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:48\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:579\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:122\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:569\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:95\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:116\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:41\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:49\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:189\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:1696\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:1529\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:1446\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:237\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:1522\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:73\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/a00218.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00218.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: variant.hh File Reference\n+dune-common: variablesizecommunicator.hh File Reference\n \n \n \n \n \n \n \n@@ -65,36 +65,79 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    variant.hh File Reference
    \n+
    variablesizecommunicator.hh File Reference
    \n
    \n
    \n-
    #include <variant>
    \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 <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

    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 Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
    namespace  Dune::Concept
     Namespace for concepts.
     
    \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 \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,20 +1,50 @@\n dune-common\u00a02.9.0\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\n-variant.hh File Reference\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+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 _\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:_\bS_\bt_\bd\n-\u00a0 Namespace for features backported from new C++ standards.\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\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/a00218_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: variant.hh Source File\n+dune-common: variablesizecommunicator.hh Source File\n \n \n \n \n \n \n \n@@ -70,48 +70,914 @@\n
    \n \n \n \n \n \n \n
    \n-
    variant.hh
    \n+
    variablesizecommunicator.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 (C) 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_VARIANT_HH
    \n-
    6#define DUNE_COMMON_STD_VARIANT_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH // Still fits the line!
    \n+
    6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH
    \n
    7
    \n-
    8#warning dune/common/std/variant.hh is deprecated and will be removed after Dune 2.8.\\
    \n-
    9 Include <variant> instead
    \n-
    10
    \n-
    11#include <variant>
    \n-
    12
    \n-
    13namespace Dune {
    \n-
    14namespace Std {
    \n-
    15 using std::variant;
    \n-
    16 using std::visit;
    \n-
    17 using std::variant_size;
    \n-
    18 using std::variant_size_v;
    \n-
    19 using std::get;
    \n-
    20 using std::get_if;
    \n-
    21 using std::holds_alternative;
    \n-
    22 using std::monostate;
    \n-
    23}
    \n-
    24}
    \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#include <algorithm>
    \n+
    19
    \n+
    20#include <mpi.h>
    \n+
    21
    \n+\n+\n+\n
    25
    \n-
    26#endif
    \n+
    38namespace Dune
    \n+
    39{
    \n+
    40
    \n+
    41namespace Concept {
    \n+
    42
    \n+
    \n+\n+
    44 template <typename H> auto require(H &&h) -> decltype(h.fixedSize());
    \n+
    45};
    \n+
    \n+
    46
    \n+
    47} // namespace Concept
    \n+
    48
    \n+
    49namespace Impl {
    \n+
    50
    \n+
    51template <typename H,
    \n+
    52 std::enable_if_t<models<Concept::HasFixedSize, H>(), int> = 0>
    \n+
    53constexpr bool callFixedSize(H &&handle) {
    \n+
    54 return handle.fixedSize();
    \n+
    55}
    \n+
    56
    \n+
    57} // namespace Impl
    \n+
    58
    \n+
    59namespace
    \n+
    60{
    \n+
    65template<class T, class Allocator=std::allocator<T> >
    \n+
    66class MessageBuffer
    \n+
    67{
    \n+
    68public:
    \n+
    73 explicit MessageBuffer(int size)
    \n+
    74 : buffer_(new T[size]), size_(size), position_(0)
    \n+
    75 {}
    \n+
    80 explicit MessageBuffer(const MessageBuffer& o)
    \n+
    81 : buffer_(new T[o.size_]), size_(o.size_), position_(o.position_)
    \n+
    82 {
    \n+
    83 }
    \n+
    85 ~MessageBuffer()
    \n+
    86 {
    \n+
    87 delete[] buffer_;
    \n+
    88 }
    \n+
    93 void write(const T& data)
    \n+
    94 {
    \n+
    95 buffer_[position_++]=data;
    \n+
    96 }
    \n+
    97
    \n+
    102 void read(T& data)
    \n+
    103 {
    \n+
    104 data=buffer_[position_++];
    \n+
    105 }
    \n+
    106
    \n+
    112 void reset()
    \n+
    113 {
    \n+
    114 position_=0;
    \n+
    115 }
    \n+
    116
    \n+
    121 bool finished()
    \n+
    122 {
    \n+
    123 return position_==size_;
    \n+
    124 }
    \n+
    125
    \n+
    131 bool hasSpaceForItems(int noItems)
    \n+
    132 {
    \n+
    133 return position_+noItems<=size_;
    \n+
    134 }
    \n+
    139 std::size_t size() const
    \n+
    140 {
    \n+
    141 return size_;
    \n+
    142 }
    \n+
    147 operator T*()
    \n+
    148 {
    \n+
    149 return buffer_;
    \n+
    150 }
    \n+
    151
    \n+
    152private:
    \n+
    156 T* buffer_;
    \n+
    160 std::size_t size_;
    \n+
    164 std::size_t position_;
    \n+
    165};
    \n+
    166
    \n+
    170class InterfaceTracker
    \n+
    171{
    \n+
    172public:
    \n+
    178 InterfaceTracker(int rank, InterfaceInformation info, std::size_t fixedsize=0,
    \n+
    179 bool allocateSizes=false)
    \n+
    180 : fixedSize(fixedsize),rank_(rank), index_(), interface_(info), sizes_()
    \n+
    181 {
    \n+
    182 if(allocateSizes)
    \n+
    183 {
    \n+
    184 sizes_.resize(info.size());
    \n+
    185 }
    \n+
    186 }
    \n+
    187
    \n+
    191 void moveToNextIndex()
    \n+
    192 {
    \n+
    193 index_++;
    \n+
    194 assert(index_<=interface_.size());
    \n+
    195 skipZeroIndices();
    \n+
    196 }
    \n+
    201 void increment(std::size_t i)
    \n+
    202 {
    \n+
    203 index_+=i;
    \n+
    204 assert(index_<=interface_.size());
    \n+
    205 }
    \n+
    210 bool finished() const
    \n+
    211 {
    \n+
    212 return index_==interface_.size();
    \n+
    213 }
    \n+
    214
    \n+
    215 void skipZeroIndices()
    \n+
    216 {
    \n+
    217 // skip indices with size zero!
    \n+
    218 while(sizes_.size() && index_!=interface_.size() &&!size())
    \n+
    219 ++index_;
    \n+
    220 }
    \n+
    221
    \n+
    226 std::size_t index() const
    \n+
    227 {
    \n+
    228 return interface_[index_];
    \n+
    229 }
    \n+
    233 std::size_t size() const
    \n+
    234 {
    \n+
    235 assert(sizes_.size());
    \n+
    236 return sizes_[index_];
    \n+
    237 }
    \n+
    241 std::size_t* getSizesPointer()
    \n+
    242 {
    \n+
    243 return &sizes_[0];
    \n+
    244 }
    \n+
    249 bool empty() const
    \n+
    250 {
    \n+
    251 return !interface_.size();
    \n+
    252 }
    \n+
    253
    \n+
    258 std::size_t indicesLeft() const
    \n+
    259 {
    \n+
    260 return interface_.size()-index_;
    \n+
    261 }
    \n+
    265 std::size_t fixedSize;
    \n+
    269 int rank() const
    \n+
    270 {
    \n+
    271 return rank_;
    \n+
    272 }
    \n+
    276 std::size_t offset() const
    \n+
    277 {
    \n+
    278 return index_;
    \n+
    279 }
    \n+
    280private:
    \n+
    282 int rank_;
    \n+
    284 std::size_t index_;
    \n+
    286 InterfaceInformation interface_;
    \n+
    287 std::vector<std::size_t> sizes_;
    \n+
    288};
    \n+
    289
    \n+
    290
    \n+
    291} // end unnamed namespace
    \n+
    292
    \n+
    330template<class Allocator=std::allocator<std::pair<InterfaceInformation,InterfaceInformation> > >
    \n+
    \n+\n+
    332{
    \n+
    333public:
    \n+
    338 typedef std::map<int,std::pair<InterfaceInformation,InterfaceInformation>,
    \n+
    339 std::less<int>,
    \n+
    340 typename std::allocator_traits<Allocator>::template rebind_alloc< std::pair<const int,std::pair<InterfaceInformation,InterfaceInformation> > > > InterfaceMap;
    \n+
    341
    \n+
    342#ifndef DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE
    \n+
    \n+
    349 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf)
    \n+
    350 : maxBufferSize_(32768), interface_(&inf)
    \n+
    351 {
    \n+
    352 MPI_Comm_dup(comm, &communicator_);
    \n+
    353 }
    \n+
    \n+
    \n+\n+
    359 : maxBufferSize_(32768), interface_(&inf.interfaces())
    \n+
    360 {
    \n+
    361 MPI_Comm_dup(inf.communicator(), &communicator_);
    \n+
    362 }
    \n+
    \n+
    363#else
    \n+
    370 VariableSizeCommunicator(MPI_Comm comm, InterfaceMap& inf)
    \n+
    371 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),
    \n+
    372 interface_(&inf)
    \n+
    373 {
    \n+
    374 MPI_Comm_dup(comm, &communicator_);
    \n+
    375 }
    \n+
    380 VariableSizeCommunicator(const Interface& inf)
    \n+
    381 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),
    \n+
    382 interface_(&inf.interfaces())
    \n+
    383 {
    \n+
    384 MPI_Comm_dup(inf.communicator(), &communicator_);
    \n+
    385 }
    \n+
    386#endif
    \n+
    \n+
    393 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf, std::size_t max_buffer_size)
    \n+
    394 : maxBufferSize_(max_buffer_size), interface_(&inf)
    \n+
    395 {
    \n+
    396 MPI_Comm_dup(comm, &communicator_);
    \n+
    397 }
    \n+
    \n+
    398
    \n+
    \n+
    404 VariableSizeCommunicator(const Interface& inf, std::size_t max_buffer_size)
    \n+
    405 : maxBufferSize_(max_buffer_size), interface_(&inf.interfaces())
    \n+
    406 {
    \n+
    407 MPI_Comm_dup(inf.communicator(), &communicator_);
    \n+
    408 }
    \n+
    \n+
    409
    \n+
    \n+\n+
    411 {
    \n+
    412 MPI_Comm_free(&communicator_);
    \n+
    413 }
    \n+
    \n+
    414
    \n+
    \n+\n+
    420 maxBufferSize_ = other.maxBufferSize_;
    \n+
    421 interface_ = other.interface_;
    \n+
    422 MPI_Comm_dup(other.communicator_, &communicator_);
    \n+
    423 }
    \n+
    \n+
    424
    \n+
    \n+\n+
    430 if(this == &other) // don't do anything if objects are the same
    \n+
    431 return *this;
    \n+
    432
    \n+
    433 maxBufferSize_ = other.maxBufferSize_;
    \n+
    434 interface_ = other.interface_;
    \n+
    435 MPI_Comm_free(&communicator_);
    \n+
    436 MPI_Comm_dup(other.communicator_, &communicator_);
    \n+
    437
    \n+
    438 return *this;
    \n+
    439 }
    \n+
    \n+
    440
    \n+
    460 template<class DataHandle>
    \n+
    \n+
    461 void forward(DataHandle& handle)
    \n+
    462 {
    \n+
    463 communicate<true>(handle);
    \n+
    464 }
    \n+
    \n+
    465
    \n+
    485 template<class DataHandle>
    \n+
    \n+
    486 void backward(DataHandle& handle)
    \n+
    487 {
    \n+
    488 communicate<false>(handle);
    \n+
    489 }
    \n+
    \n+
    490
    \n+
    491private:
    \n+
    492 template<bool FORWARD, class DataHandle>
    \n+
    493 void communicateSizes(DataHandle& handle,
    \n+
    494 std::vector<InterfaceTracker>& recv_trackers);
    \n+
    495
    \n+
    502 template<bool forward,class DataHandle>
    \n+
    503 void communicate(DataHandle& handle);
    \n+
    513 template<bool FORWARD, class DataHandle>
    \n+
    514 void setupInterfaceTrackers(DataHandle& handle,
    \n+
    515 std::vector<InterfaceTracker>& send_trackers,
    \n+
    516 std::vector<InterfaceTracker>& recv_trackers);
    \n+
    524 template<bool FORWARD, class DataHandle>
    \n+
    525 void communicateFixedSize(DataHandle& handle);
    \n+
    533 template<bool FORWARD, class DataHandle>
    \n+
    534 void communicateVariableSize(DataHandle& handle);
    \n+
    541 std::size_t maxBufferSize_;
    \n+
    549 const InterfaceMap* interface_;
    \n+
    555 MPI_Comm communicator_;
    \n+
    556};
    \n+
    \n+
    557
    \n+
    559namespace
    \n+
    560{
    \n+
    564template<class DataHandle>
    \n+
    565class SizeDataHandle
    \n+
    566{
    \n+
    567public:
    \n+
    568 typedef std::size_t DataType;
    \n+
    569
    \n+
    570 SizeDataHandle(DataHandle& data,
    \n+
    571 std::vector<InterfaceTracker>& trackers)
    \n+
    572 : data_(data), trackers_(trackers), index_()
    \n+
    573 {}
    \n+
    574 bool fixedSize()
    \n+
    575 {
    \n+
    576 return true;
    \n+
    577 }
    \n+
    578 std::size_t size([[maybe_unused]] std::size_t i)
    \n+
    579 {
    \n+
    580 return 1;
    \n+
    581 }
    \n+
    582 template<class B>
    \n+
    583 void gather(B& buf, int i)
    \n+
    584 {
    \n+
    585 buf.write(data_.size(i));
    \n+
    586 }
    \n+
    587 void setReceivingIndex(std::size_t i)
    \n+
    588 {
    \n+
    589 index_=i;
    \n+
    590 }
    \n+
    591 std::size_t* getSizesPointer()
    \n+
    592 {
    \n+
    593 return trackers_[index_].getSizesPointer();
    \n+
    594 }
    \n+
    595
    \n+
    596private:
    \n+
    597 DataHandle& data_;
    \n+
    598 std::vector<InterfaceTracker>& trackers_;
    \n+
    599 int index_;
    \n+
    600};
    \n+
    601
    \n+
    602template<class T>
    \n+
    603void setReceivingIndex(T&, int)
    \n+
    604{}
    \n+
    605
    \n+
    606template<class T>
    \n+
    607void setReceivingIndex(SizeDataHandle<T>& t, int i)
    \n+
    608{
    \n+
    609 t.setReceivingIndex(i);
    \n+
    610}
    \n+
    611
    \n+
    612
    \n+
    618template<bool FORWARD>
    \n+
    619struct InterfaceInformationChooser
    \n+
    620{
    \n+
    624 static const InterfaceInformation&
    \n+
    625 getSend(const std::pair<InterfaceInformation,InterfaceInformation>& info)
    \n+
    626 {
    \n+
    627 return info.first;
    \n+
    628 }
    \n+
    629
    \n+
    633 static const InterfaceInformation&
    \n+
    634 getReceive(const std::pair<InterfaceInformation,InterfaceInformation>& info)
    \n+
    635 {
    \n+
    636 return info.second;
    \n+
    637 }
    \n+
    638};
    \n+
    639
    \n+
    640template<>
    \n+
    641struct InterfaceInformationChooser<false>
    \n+
    642{
    \n+
    643 static const InterfaceInformation&
    \n+
    644 getSend(const std::pair<InterfaceInformation,InterfaceInformation>& info)
    \n+
    645 {
    \n+
    646 return info.second;
    \n+
    647 }
    \n+
    648
    \n+
    649 static const InterfaceInformation&
    \n+
    650 getReceive(const std::pair<InterfaceInformation,InterfaceInformation>& info)
    \n+
    651 {
    \n+
    652 return info.first;
    \n+
    653 }
    \n+
    654};
    \n+
    655
    \n+
    661template<class DataHandle>
    \n+
    662struct PackEntries
    \n+
    663{
    \n+
    664
    \n+
    665 int operator()(DataHandle& handle, InterfaceTracker& tracker,
    \n+
    666 MessageBuffer<typename DataHandle::DataType>& buffer,
    \n+
    667 [[maybe_unused]] int i) const
    \n+
    668 {
    \n+
    669 return operator()(handle,tracker,buffer);
    \n+
    670 }
    \n+
    671
    \n+
    679 int operator()(DataHandle& handle, InterfaceTracker& tracker,
    \n+
    680 MessageBuffer<typename DataHandle::DataType>& buffer) const
    \n+
    681 {
    \n+
    682 if(tracker.fixedSize) // fixed size if variable is >0!
    \n+
    683 {
    \n+
    684
    \n+
    685 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, tracker.indicesLeft());
    \n+
    686 for(std::size_t i=0; i< noIndices; ++i)
    \n+
    687 {
    \n+
    688 handle.gather(buffer, tracker.index());
    \n+
    689 tracker.moveToNextIndex();
    \n+
    690 }
    \n+
    691 return noIndices*tracker.fixedSize;
    \n+
    692 }
    \n+
    693 else
    \n+
    694 {
    \n+
    695 int packed=0;
    \n+
    696 tracker.skipZeroIndices();
    \n+
    697 while(!tracker.finished())
    \n+
    698 if(buffer.hasSpaceForItems(handle.size(tracker.index())))
    \n+
    699 {
    \n+
    700 handle.gather(buffer, tracker.index());
    \n+
    701 packed+=handle.size(tracker.index());
    \n+
    702 tracker.moveToNextIndex();
    \n+
    703 }
    \n+
    704 else
    \n+
    705 break;
    \n+
    706 return packed;
    \n+
    707 }
    \n+
    708 }
    \n+
    709};
    \n+
    710
    \n+
    716template<class DataHandle>
    \n+
    717struct UnpackEntries{
    \n+
    718
    \n+
    726 bool operator()(DataHandle& handle, InterfaceTracker& tracker,
    \n+
    727 MessageBuffer<typename DataHandle::DataType>& buffer,
    \n+
    728 int count=0)
    \n+
    729 {
    \n+
    730 if(tracker.fixedSize) // fixed size if variable is >0!
    \n+
    731 {
    \n+
    732 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, tracker.indicesLeft());
    \n+
    733
    \n+
    734 for(std::size_t i=0; i< noIndices; ++i)
    \n+
    735 {
    \n+
    736 handle.scatter(buffer, tracker.index(), tracker.fixedSize);
    \n+
    737 tracker.moveToNextIndex();
    \n+
    738 }
    \n+
    739 return tracker.finished();
    \n+
    740 }
    \n+
    741 else
    \n+
    742 {
    \n+
    743 assert(count);
    \n+
    744 for(int unpacked=0;unpacked<count;)
    \n+
    745 {
    \n+
    746 assert(!tracker.finished());
    \n+
    747 assert(buffer.hasSpaceForItems(tracker.size()));
    \n+
    748 handle.scatter(buffer, tracker.index(), tracker.size());
    \n+
    749 unpacked+=tracker.size();
    \n+
    750 tracker.moveToNextIndex();
    \n+
    751 }
    \n+
    752 return tracker.finished();
    \n+
    753 }
    \n+
    754 }
    \n+
    755};
    \n+
    756
    \n+
    757
    \n+
    761template<class DataHandle>
    \n+
    762struct UnpackSizeEntries{
    \n+
    763
    \n+
    771 bool operator()(SizeDataHandle<DataHandle>& handle, InterfaceTracker& tracker,
    \n+
    772 MessageBuffer<typename SizeDataHandle<DataHandle>::DataType>& buffer) const
    \n+
    773 {
    \n+
    774 std::size_t noIndices=std::min(buffer.size(), tracker.indicesLeft());
    \n+
    775 std::copy(static_cast<std::size_t*>(buffer), static_cast<std::size_t*>(buffer)+noIndices,
    \n+
    776 handle.getSizesPointer()+tracker.offset());
    \n+
    777 tracker.increment(noIndices);
    \n+
    778 return noIndices;
    \n+
    779 }
    \n+
    780 bool operator()(SizeDataHandle<DataHandle>& handle, InterfaceTracker& tracker,
    \n+
    781 MessageBuffer<typename SizeDataHandle<DataHandle>::DataType>& buffer, int) const
    \n+
    782 {
    \n+
    783 return operator()(handle,tracker,buffer);
    \n+
    784 }
    \n+
    785};
    \n+
    786
    \n+
    794void sendFixedSize(std::vector<InterfaceTracker>& send_trackers,
    \n+
    795 std::vector<MPI_Request>& send_requests,
    \n+
    796 std::vector<InterfaceTracker>& recv_trackers,
    \n+
    797 std::vector<MPI_Request>& recv_requests,
    \n+
    798 MPI_Comm communicator)
    \n+
    799{
    \n+
    800 typedef std::vector<InterfaceTracker>::iterator TIter;
    \n+
    801 std::vector<MPI_Request>::iterator mIter=recv_requests.begin();
    \n+
    802
    \n+
    803 for(TIter iter=recv_trackers.begin(), end=recv_trackers.end(); iter!=end;
    \n+
    804 ++iter, ++mIter)
    \n+
    805 {
    \n+
    806 MPI_Irecv(&(iter->fixedSize), 1, MPITraits<std::size_t>::getType(),
    \n+
    807 iter->rank(), 933881, communicator, &(*mIter));
    \n+
    808 }
    \n+
    809
    \n+
    810 // Send our size to all neighbours using non-blocking synchronous communication.
    \n+
    811 std::vector<MPI_Request>::iterator mIter1=send_requests.begin();
    \n+
    812 for(TIter iter=send_trackers.begin(), end=send_trackers.end();
    \n+
    813 iter!=end;
    \n+
    814 ++iter, ++mIter1)
    \n+
    815 {
    \n+
    816 MPI_Issend(&(iter->fixedSize), 1, MPITraits<std::size_t>::getType(),
    \n+
    817 iter->rank(), 933881, communicator, &(*mIter1));
    \n+
    818 }
    \n+
    819}
    \n+
    820
    \n+
    821
    \n+
    826template<class DataHandle>
    \n+
    827struct SetupSendRequest{
    \n+
    828 void operator()(DataHandle& handle,
    \n+
    829 InterfaceTracker& tracker,
    \n+
    830 MessageBuffer<typename DataHandle::DataType>& buffer,
    \n+
    831 MPI_Request& request,
    \n+
    832 MPI_Comm comm) const
    \n+
    833 {
    \n+
    834 buffer.reset();
    \n+
    835 int size=PackEntries<DataHandle>()(handle, tracker, buffer);
    \n+
    836 // Skip indices of zero size.
    \n+
    837 while(!tracker.finished() && !handle.size(tracker.index()))
    \n+
    838 tracker.moveToNextIndex();
    \n+
    839 if(size)
    \n+
    840 MPI_Issend(buffer, size, MPITraits<typename DataHandle::DataType>::getType(),
    \n+
    841 tracker.rank(), 933399, comm, &request);
    \n+
    842 }
    \n+
    843};
    \n+
    844
    \n+
    845
    \n+
    850template<class DataHandle>
    \n+
    851struct SetupRecvRequest{
    \n+
    852 void operator()(DataHandle& /*handle*/,
    \n+
    853 InterfaceTracker& tracker,
    \n+
    854 MessageBuffer<typename DataHandle::DataType>& buffer,
    \n+
    855 MPI_Request& request,
    \n+
    856 MPI_Comm comm) const
    \n+
    857 {
    \n+
    858 buffer.reset();
    \n+
    859 if(tracker.indicesLeft())
    \n+
    860 MPI_Irecv(buffer, buffer.size(), MPITraits<typename DataHandle::DataType>::getType(),
    \n+
    861 tracker.rank(), 933399, comm, &request);
    \n+
    862 }
    \n+
    863};
    \n+
    864
    \n+
    868template<class DataHandle>
    \n+
    869struct NullPackUnpackFunctor
    \n+
    870{
    \n+
    871 int operator()(DataHandle&, InterfaceTracker&,
    \n+
    872 MessageBuffer<typename DataHandle::DataType>&, int)
    \n+
    873 {
    \n+
    874 return 0;
    \n+
    875 }
    \n+
    876 int operator()(DataHandle&, InterfaceTracker&,
    \n+
    877 MessageBuffer<typename DataHandle::DataType>&)
    \n+
    878 {
    \n+
    879 return 0;
    \n+
    880 }
    \n+
    881};
    \n+
    882
    \n+
    897template<class DataHandle, class BufferFunctor, class CommunicationFunctor>
    \n+
    898std::size_t checkAndContinue(DataHandle& handle,
    \n+
    899 std::vector<InterfaceTracker>& trackers,
    \n+
    900 std::vector<MPI_Request>& requests,
    \n+
    901 std::vector<MPI_Request>& requests2,
    \n+
    902 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
    \n+
    903 MPI_Comm comm,
    \n+
    904 BufferFunctor buffer_func,
    \n+
    905 CommunicationFunctor comm_func,
    \n+
    906 bool valid=true,
    \n+
    907 bool getCount=false)
    \n+
    908{
    \n+
    909 std::size_t size=requests.size();
    \n+
    910 std::vector<MPI_Status> statuses(size);
    \n+
    911 int no_completed;
    \n+
    912 std::vector<int> indices(size, -1); // the indices for which the communication finished.
    \n+
    913
    \n+
    914 MPI_Testsome(size, &(requests[0]), &no_completed, &(indices[0]), &(statuses[0]));
    \n+
    915 indices.resize(no_completed);
    \n+
    916 for(std::vector<int>::iterator index=indices.begin(), end=indices.end();
    \n+
    917 index!=end; ++index)
    \n+
    918 {
    \n+
    919 InterfaceTracker& tracker=trackers[*index];
    \n+
    920 setReceivingIndex(handle, *index);
    \n+
    921 if(getCount)
    \n+
    922 {
    \n+
    923 // Get the number of entries received
    \n+
    924 int count;
    \n+
    925 MPI_Get_count(&(statuses[index-indices.begin()]),
    \n+\n+
    927 &count);
    \n+
    928 // Communication completed, we can reuse the buffers, e.g. unpack or repack
    \n+
    929 buffer_func(handle, tracker, buffers[*index], count);
    \n+
    930 }else
    \n+
    931 buffer_func(handle, tracker, buffers[*index]);
    \n+
    932 tracker.skipZeroIndices();
    \n+
    933 if(!tracker.finished()){
    \n+
    934 // Maybe start another communication.
    \n+
    935 comm_func(handle, tracker, buffers[*index], requests2[*index], comm);
    \n+
    936 tracker.skipZeroIndices();
    \n+
    937 if(valid)
    \n+
    938 --no_completed; // communication not finished, decrement counter for finished ones.
    \n+
    939 }
    \n+
    940 }
    \n+
    941 return no_completed;
    \n+
    942
    \n+
    943}
    \n+
    944
    \n+
    954template<class DataHandle>
    \n+
    955std::size_t receiveSizeAndSetupReceive(DataHandle& handle,
    \n+
    956 std::vector<InterfaceTracker>& trackers,
    \n+
    957 std::vector<MPI_Request>& size_requests,
    \n+
    958 std::vector<MPI_Request>& data_requests,
    \n+
    959 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
    \n+
    960 MPI_Comm comm)
    \n+
    961{
    \n+
    962 return checkAndContinue(handle, trackers, size_requests, data_requests, buffers, comm,
    \n+
    963 NullPackUnpackFunctor<DataHandle>(), SetupRecvRequest<DataHandle>(), false);
    \n+
    964}
    \n+
    965
    \n+
    974template<class DataHandle>
    \n+
    975std::size_t checkSendAndContinueSending(DataHandle& handle,
    \n+
    976 std::vector<InterfaceTracker>& trackers,
    \n+
    977 std::vector<MPI_Request>& requests,
    \n+
    978 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
    \n+
    979 MPI_Comm comm)
    \n+
    980{
    \n+
    981 return checkAndContinue(handle, trackers, requests, requests, buffers, comm,
    \n+
    982 NullPackUnpackFunctor<DataHandle>(), SetupSendRequest<DataHandle>());
    \n+
    983}
    \n+
    984
    \n+
    993template<class DataHandle>
    \n+
    994std::size_t checkReceiveAndContinueReceiving(DataHandle& handle,
    \n+
    995 std::vector<InterfaceTracker>& trackers,
    \n+
    996 std::vector<MPI_Request>& requests,
    \n+
    997 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
    \n+
    998 MPI_Comm comm)
    \n+
    999{
    \n+
    1000 return checkAndContinue(handle, trackers, requests, requests, buffers, comm,
    \n+
    1001 UnpackEntries<DataHandle>(), SetupRecvRequest<DataHandle>(),
    \n+
    1002 true, !Impl::callFixedSize(handle));
    \n+
    1003}
    \n+
    1004
    \n+
    1005
    \n+
    1006bool validRecvRequests(const std::vector<MPI_Request> reqs)
    \n+
    1007{
    \n+
    1008 for(std::vector<MPI_Request>::const_iterator i=reqs.begin(), end=reqs.end();
    \n+
    1009 i!=end; ++i)
    \n+
    1010 if(*i!=MPI_REQUEST_NULL)
    \n+
    1011 return true;
    \n+
    1012 return false;
    \n+
    1013}
    \n+
    1014
    \n+
    1025template<class DataHandle, class Functor>
    \n+
    1026std::size_t setupRequests(DataHandle& handle,
    \n+
    1027 std::vector<InterfaceTracker>& trackers,
    \n+
    1028 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
    \n+
    1029 std::vector<MPI_Request>& requests,
    \n+
    1030 const Functor& setupFunctor,
    \n+
    1031 MPI_Comm communicator)
    \n+
    1032{
    \n+
    1033 typedef typename std::vector<InterfaceTracker>::iterator TIter;
    \n+
    1034 typename std::vector<MessageBuffer<typename DataHandle::DataType> >::iterator
    \n+
    1035 biter=buffers.begin();
    \n+
    1036 typename std::vector<MPI_Request>::iterator riter=requests.begin();
    \n+
    1037 std::size_t complete=0;
    \n+
    1038 for(TIter titer=trackers.begin(), end=trackers.end(); titer!=end; ++titer, ++biter, ++riter)
    \n+
    1039 {
    \n+
    1040 setupFunctor(handle, *titer, *biter, *riter, communicator);
    \n+
    1041 complete+=titer->finished();
    \n+
    1042 }
    \n+
    1043 return complete;
    \n+
    1044}
    \n+
    1045} // end unnamed namespace
    \n+
    1046
    \n+
    1047template<class Allocator>
    \n+
    1048template<bool FORWARD, class DataHandle>
    \n+
    1049void VariableSizeCommunicator<Allocator>::setupInterfaceTrackers(DataHandle& handle,
    \n+
    1050 std::vector<InterfaceTracker>& send_trackers,
    \n+
    1051 std::vector<InterfaceTracker>& recv_trackers)
    \n+
    1052{
    \n+
    1053 if(interface_->size()==0)
    \n+
    1054 return;
    \n+
    1055 send_trackers.reserve(interface_->size());
    \n+
    1056 recv_trackers.reserve(interface_->size());
    \n+
    1057
    \n+
    1058 int fixedsize=0;
    \n+
    1059 if(Impl::callFixedSize(handle))
    \n+
    1060 ++fixedsize;
    \n+
    1061
    \n+
    1062
    \n+
    1063 typedef typename InterfaceMap::const_iterator IIter;
    \n+
    1064 for(IIter inf=interface_->begin(), end=interface_->end(); inf!=end; ++inf)
    \n+
    1065 {
    \n+
    1066
    \n+
    1067 if(Impl::callFixedSize(handle) && InterfaceInformationChooser<FORWARD>::getSend(inf->second).size())
    \n+
    1068 fixedsize=handle.size(InterfaceInformationChooser<FORWARD>::getSend(inf->second)[0]);
    \n+
    1069 assert(!Impl::callFixedSize(handle)||fixedsize>0);
    \n+
    1070 send_trackers.push_back(InterfaceTracker(inf->first,
    \n+
    1071 InterfaceInformationChooser<FORWARD>::getSend(inf->second), fixedsize));
    \n+
    1072 recv_trackers.push_back(InterfaceTracker(inf->first,
    \n+
    1073 InterfaceInformationChooser<FORWARD>::getReceive(inf->second), fixedsize, fixedsize==0));
    \n+
    1074 }
    \n+
    1075}
    \n+
    1076
    \n+
    1077template<class Allocator>
    \n+
    1078template<bool FORWARD, class DataHandle>
    \n+
    1079void VariableSizeCommunicator<Allocator>::communicateFixedSize(DataHandle& handle)
    \n+
    1080{
    \n+
    1081 std::vector<MPI_Request> size_send_req(interface_->size());
    \n+
    1082 std::vector<MPI_Request> size_recv_req(interface_->size());
    \n+
    1083
    \n+
    1084 std::vector<InterfaceTracker> send_trackers;
    \n+
    1085 std::vector<InterfaceTracker> recv_trackers;
    \n+
    1086 setupInterfaceTrackers<FORWARD>(handle,send_trackers, recv_trackers);
    \n+
    1087 sendFixedSize(send_trackers, size_send_req, recv_trackers, size_recv_req, communicator_);
    \n+
    1088
    \n+
    1089 std::vector<MPI_Request> data_send_req(interface_->size(), MPI_REQUEST_NULL);
    \n+
    1090 std::vector<MPI_Request> data_recv_req(interface_->size(), MPI_REQUEST_NULL);
    \n+
    1091 typedef typename DataHandle::DataType DataType;
    \n+
    1092 std::vector<MessageBuffer<DataType> > send_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_)),
    \n+
    1093 recv_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_));
    \n+
    1094
    \n+
    1095
    \n+
    1096 setupRequests(handle, send_trackers, send_buffers, data_send_req,
    \n+
    1097 SetupSendRequest<DataHandle>(), communicator_);
    \n+
    1098
    \n+
    1099 std::size_t no_size_to_recv, no_to_send, no_to_recv, old_size;
    \n+
    1100 no_size_to_recv = no_to_send = no_to_recv = old_size = interface_->size();
    \n+
    1101
    \n+
    1102 // Skip empty interfaces.
    \n+
    1103 typedef typename std::vector<InterfaceTracker>::const_iterator Iter;
    \n+
    1104 for(Iter i=recv_trackers.begin(), end=recv_trackers.end(); i!=end; ++i)
    \n+
    1105 if(i->empty())
    \n+
    1106 --no_to_recv;
    \n+
    1107 for(Iter i=send_trackers.begin(), end=send_trackers.end(); i!=end; ++i)
    \n+
    1108 if(i->empty())
    \n+
    1109 --no_to_send;
    \n+
    1110
    \n+
    1111 while(no_size_to_recv+no_to_send+no_to_recv)
    \n+
    1112 {
    \n+
    1113 // Receive the fixedsize and setup receives accordingly
    \n+
    1114 if(no_size_to_recv)
    \n+
    1115 no_size_to_recv -= receiveSizeAndSetupReceive(handle,recv_trackers, size_recv_req,
    \n+
    1116 data_recv_req, recv_buffers,
    \n+
    1117 communicator_);
    \n+
    1118
    \n+
    1119 // Check send completion and initiate other necessary sends
    \n+
    1120 if(no_to_send)
    \n+
    1121 no_to_send -= checkSendAndContinueSending(handle, send_trackers, data_send_req,
    \n+
    1122 send_buffers, communicator_);
    \n+
    1123 if(validRecvRequests(data_recv_req))
    \n+
    1124 // Receive data and setup new unblocking receives if necessary
    \n+
    1125 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, data_recv_req,
    \n+
    1126 recv_buffers, communicator_);
    \n+
    1127 }
    \n+
    1128
    \n+
    1129 // Wait for completion of sending the size.
    \n+
    1130 //std::vector<MPI_Status> statuses(interface_->size(), MPI_STATUSES_IGNORE);
    \n+
    1131 MPI_Waitall(size_send_req.size(), &(size_send_req[0]), MPI_STATUSES_IGNORE);
    \n+
    1132
    \n+
    1133}
    \n+
    1134
    \n+
    1135template<class Allocator>
    \n+
    1136template<bool FORWARD, class DataHandle>
    \n+
    1137void VariableSizeCommunicator<Allocator>::communicateSizes(DataHandle& handle,
    \n+
    1138 std::vector<InterfaceTracker>& data_recv_trackers)
    \n+
    1139{
    \n+
    1140 std::vector<InterfaceTracker> send_trackers;
    \n+
    1141 std::vector<InterfaceTracker> recv_trackers;
    \n+
    1142 std::size_t size = interface_->size();
    \n+
    1143 std::vector<MPI_Request> send_requests(size, MPI_REQUEST_NULL);
    \n+
    1144 std::vector<MPI_Request> recv_requests(size, MPI_REQUEST_NULL);
    \n+
    1145 std::vector<MessageBuffer<std::size_t> >
    \n+
    1146 send_buffers(size, MessageBuffer<std::size_t>(maxBufferSize_)),
    \n+
    1147 recv_buffers(size, MessageBuffer<std::size_t>(maxBufferSize_));
    \n+
    1148 SizeDataHandle<DataHandle> size_handle(handle,data_recv_trackers);
    \n+
    1149 setupInterfaceTrackers<FORWARD>(size_handle,send_trackers, recv_trackers);
    \n+
    1150 setupRequests(size_handle, send_trackers, send_buffers, send_requests,
    \n+
    1151 SetupSendRequest<SizeDataHandle<DataHandle> >(), communicator_);
    \n+
    1152 setupRequests(size_handle, recv_trackers, recv_buffers, recv_requests,
    \n+
    1153 SetupRecvRequest<SizeDataHandle<DataHandle> >(), communicator_);
    \n+
    1154
    \n+
    1155 // Count valid requests that we have to wait for.
    \n+
    1156 auto valid_req_func =
    \n+
    1157 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL; };
    \n+
    1158
    \n+
    1159 auto size_to_send = std::count_if(send_requests.begin(), send_requests.end(),
    \n+
    1160 valid_req_func);
    \n+
    1161 auto size_to_recv = std::count_if(recv_requests.begin(), recv_requests.end(),
    \n+
    1162 valid_req_func);
    \n+
    1163
    \n+
    1164 while(size_to_send+size_to_recv)
    \n+
    1165 {
    \n+
    1166 if(size_to_send)
    \n+
    1167 size_to_send -=
    \n+
    1168 checkSendAndContinueSending(size_handle, send_trackers, send_requests,
    \n+
    1169 send_buffers, communicator_);
    \n+
    1170 if(size_to_recv)
    \n+
    1171 // Could have done this using checkSendAndContinueSending
    \n+
    1172 // But the call below is more efficient as UnpackSizeEntries
    \n+
    1173 // uses std::copy.
    \n+
    1174 size_to_recv -=
    \n+
    1175 checkAndContinue(size_handle, recv_trackers, recv_requests, recv_requests,
    \n+
    1176 recv_buffers, communicator_, UnpackSizeEntries<DataHandle>(),
    \n+
    1177 SetupRecvRequest<SizeDataHandle<DataHandle> >());
    \n+
    1178 }
    \n+
    1179}
    \n+
    1180
    \n+
    1181template<class Allocator>
    \n+
    1182template<bool FORWARD, class DataHandle>
    \n+
    1183void VariableSizeCommunicator<Allocator>::communicateVariableSize(DataHandle& handle)
    \n+
    1184{
    \n+
    1185
    \n+
    1186 std::vector<InterfaceTracker> send_trackers;
    \n+
    1187 std::vector<InterfaceTracker> recv_trackers;
    \n+
    1188 setupInterfaceTrackers<FORWARD>(handle, send_trackers, recv_trackers);
    \n+
    1189
    \n+
    1190 std::vector<MPI_Request> send_requests(interface_->size(), MPI_REQUEST_NULL);
    \n+
    1191 std::vector<MPI_Request> recv_requests(interface_->size(), MPI_REQUEST_NULL);
    \n+
    1192 typedef typename DataHandle::DataType DataType;
    \n+
    1193 std::vector<MessageBuffer<DataType> >
    \n+
    1194 send_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_)),
    \n+
    1195 recv_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_));
    \n+
    1196
    \n+
    1197 communicateSizes<FORWARD>(handle, recv_trackers);
    \n+
    1198 // Setup requests for sending and receiving.
    \n+
    1199 setupRequests(handle, send_trackers, send_buffers, send_requests,
    \n+
    1200 SetupSendRequest<DataHandle>(), communicator_);
    \n+
    1201 setupRequests(handle, recv_trackers, recv_buffers, recv_requests,
    \n+
    1202 SetupRecvRequest<DataHandle>(), communicator_);
    \n+
    1203
    \n+
    1204 // Determine number of valid requests.
    \n+
    1205 auto valid_req_func =
    \n+
    1206 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL;};
    \n+
    1207
    \n+
    1208 auto no_to_send = std::count_if(send_requests.begin(), send_requests.end(),
    \n+
    1209 valid_req_func);
    \n+
    1210 auto no_to_recv = std::count_if(recv_requests.begin(), recv_requests.end(),
    \n+
    1211 valid_req_func);
    \n+
    1212 while(no_to_send+no_to_recv)
    \n+
    1213 {
    \n+
    1214 // Check send completion and initiate other necessary sends
    \n+
    1215 if(no_to_send)
    \n+
    1216 no_to_send -= checkSendAndContinueSending(handle, send_trackers, send_requests,
    \n+
    1217 send_buffers, communicator_);
    \n+
    1218 if(no_to_recv)
    \n+
    1219 // Receive data and setup new unblocking receives if necessary
    \n+
    1220 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, recv_requests,
    \n+
    1221 recv_buffers, communicator_);
    \n+
    1222 }
    \n+
    1223}
    \n+
    1224
    \n+
    1225template<class Allocator>
    \n+
    1226template<bool FORWARD, class DataHandle>
    \n+
    1227void VariableSizeCommunicator<Allocator>::communicate(DataHandle& handle)
    \n+
    1228{
    \n+
    1229 if( interface_->size() == 0)
    \n+
    1230 // Simply return as otherwise we will index an empty container
    \n+
    1231 // either for MPI_Wait_all or MPI_Test_some.
    \n+
    1232 return;
    \n+
    1233
    \n+
    1234 if(Impl::callFixedSize(handle))
    \n+
    1235 communicateFixedSize<FORWARD>(handle);
    \n+
    1236 else
    \n+
    1237 communicateVariableSize<FORWARD>(handle);
    \n+
    1238}
    \n+
    1239} // end namespace Dune
    \n+
    1240
    \n+
    1241#endif // HAVE_MPI
    \n+
    1242
    \n+
    1243#endif
    \n+
    Infrastructure for concepts.
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    std::size_t fixedSize
    The number of data items per index if it is fixed, 0 otherwise.
    Definition variablesizecommunicator.hh:265
    \n+
    MPI_Comm communicator() const
    Get the MPI Communicator.
    Definition parallel/interface.hh:417
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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:108
    \n+
    Communication interface between remote and local indices.
    Definition parallel/interface.hh:209
    \n+
    Definition variablesizecommunicator.hh:43
    \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:332
    \n+
    VariableSizeCommunicator(const Interface &inf, std::size_t max_buffer_size)
    Creates a communicator with a specific maximum buffer size.
    Definition variablesizecommunicator.hh:404
    \n+
    void backward(DataHandle &handle)
    Communicate backwards.
    Definition variablesizecommunicator.hh:486
    \n+
    ~VariableSizeCommunicator()
    Definition variablesizecommunicator.hh:410
    \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:393
    \n+
    VariableSizeCommunicator(const VariableSizeCommunicator &other)
    Copy-constructs a communicator.
    Definition variablesizecommunicator.hh:419
    \n+
    void forward(DataHandle &handle)
    Communicate forward.
    Definition variablesizecommunicator.hh:461
    \n+
    VariableSizeCommunicator & operator=(const VariableSizeCommunicator &other)
    Copy-assignes a communicator.
    Definition variablesizecommunicator.hh:429
    \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:340
    \n+
    VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf)
    Creates a communicator with the default maximum buffer size.
    Definition variablesizecommunicator.hh:349
    \n+
    VariableSizeCommunicator(const Interface &inf)
    Creates a communicator with the default maximum buffer size.
    Definition variablesizecommunicator.hh:358
    \n+
    Provides classes for building the communication interface between remote indices.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,42 +1,993 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-variant.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+variablesizecommunicator.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 (C) 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_VARIANT_HH\n-6#define DUNE_COMMON_STD_VARIANT_HH\n+5#ifndef DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH // Still fits the\n+line!\n+6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH\n 7\n-8#warning dune/common/std/variant.hh is deprecated and will be removed after\n-Dune 2.8.\\\n-9 Include instead\n-10\n-11#include \n-12\n-13namespace _\bD_\bu_\bn_\be {\n-14namespace Std {\n-15 using std::variant;\n-16 using std::visit;\n-17 using std::variant_size;\n-18 using std::variant_size_v;\n-19 using std::get;\n-20 using std::get_if;\n-21 using std::holds_alternative;\n-22 using std::monostate;\n-23}\n-24}\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+21\n+22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bc_\bo_\bn_\bc_\be_\bp_\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/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n+24#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 25\n-26#endif\n+38namespace _\bD_\bu_\bn_\be\n+39{\n+40\n+41namespace Concept {\n+42\n+_\b4_\b3struct _\bH_\ba_\bs_\bF_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be {\n+_\b4_\b4 template auto _\br_\be_\bq_\bu_\bi_\br_\be(H &&h) -> decltype(h.fixedSize());\n+45};\n+46\n+47} // namespace Concept\n+48\n+49namespace Impl {\n+50\n+51template (), int> = 0>\n+53constexpr bool callFixedSize(H &&handle) {\n+54 return handle.fixedSize();\n+55}\n+56\n+57} // namespace Impl\n+58\n+59namespace\n+60{\n+65template >\n+66class MessageBuffer\n+67{\n+68public:\n+73 explicit MessageBuffer(int size)\n+74 : buffer_(new T[size]), size_(size), position_(0)\n+75 {}\n+80 explicit MessageBuffer(const MessageBuffer& o)\n+81 : buffer_(new T[o.size_]), size_(o.size_), position_(o.position_)\n+82 {\n+83 }\n+85 ~MessageBuffer()\n+86 {\n+87 delete[] buffer_;\n+88 }\n+93 void write(const T& data)\n+94 {\n+95 buffer_[position_++]=data;\n+96 }\n+97\n+102 void read(T& data)\n+103 {\n+104 data=buffer_[position_++];\n+105 }\n+106\n+112 void reset()\n+113 {\n+114 position_=0;\n+115 }\n+116\n+121 bool finished()\n+122 {\n+123 return position_==size_;\n+124 }\n+125\n+131 bool hasSpaceForItems(int noItems)\n+132 {\n+133 return position_+noItems<=size_;\n+134 }\n+139 std::size_t size() const\n+140 {\n+141 return size_;\n+142 }\n+147 operator T*()\n+148 {\n+149 return buffer_;\n+150 }\n+151\n+152private:\n+156 T* buffer_;\n+160 std::size_t size_;\n+164 std::size_t position_;\n+165};\n+166\n+170class InterfaceTracker\n+171{\n+172public:\n+178 InterfaceTracker(int rank, InterfaceInformation info, std::size_t\n+fixedsize=0,\n+179 bool allocateSizes=false)\n+180 : _\bf_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be(fixedsize),rank_(rank), index_(), interface_(info), sizes_()\n+181 {\n+182 if(allocateSizes)\n+183 {\n+184 sizes_.resize(info.size());\n+185 }\n+186 }\n+187\n+191 void moveToNextIndex()\n+192 {\n+193 index_++;\n+194 assert(index_<=interface_.size());\n+195 skipZeroIndices();\n+196 }\n+201 void increment(std::size_t i)\n+202 {\n+203 index_+=i;\n+204 assert(index_<=interface_.size());\n+205 }\n+210 bool finished() const\n+211 {\n+212 return index_==interface_.size();\n+213 }\n+214\n+215 void skipZeroIndices()\n+216 {\n+217 // skip indices with size zero!\n+218 while(sizes_.size() && index_!=interface_.size() &&!size())\n+219 ++index_;\n+220 }\n+221\n+226 std::size_t index() const\n+227 {\n+228 return interface_[index_];\n+229 }\n+233 std::size_t size() const\n+234 {\n+235 assert(sizes_.size());\n+236 return sizes_[index_];\n+237 }\n+241 std::size_t* getSizesPointer()\n+242 {\n+243 return &sizes_[0];\n+244 }\n+249 bool empty() const\n+250 {\n+251 return !interface_.size();\n+252 }\n+253\n+258 std::size_t indicesLeft() const\n+259 {\n+260 return interface_.size()-index_;\n+261 }\n+_\b2_\b6_\b5 std::size_t _\bf_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be;\n+269 int rank() const\n+270 {\n+271 return rank_;\n+272 }\n+276 std::size_t offset() const\n+277 {\n+278 return index_;\n+279 }\n+280private:\n+282 int rank_;\n+284 std::size_t index_;\n+286 InterfaceInformation interface_;\n+287 std::vector sizes_;\n+288};\n+289\n+290\n+291} // end unnamed namespace\n+292\n+330template > >\n+_\b3_\b3_\b1class _\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+332{\n+333public:\n+338 typedef std::map,\n+339 std::less,\n+_\b3_\b4_\b0 typename std::allocator_traits::template rebind_alloc< std::\n+pair > > >\n+_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp;\n+341\n+342#ifndef DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE\n+_\b3_\b4_\b9 _\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+350 : maxBufferSize_(32768), interface_(&inf)\n+351 {\n+352 MPI_Comm_dup(comm, &communicator_);\n+353 }\n+_\b3_\b5_\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 _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be& inf)\n+359 : maxBufferSize_(32768), interface_(&inf.interfaces())\n+360 {\n+361 MPI_Comm_dup(inf._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &communicator_);\n+362 }\n+363#else\n+370 _\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+371 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),\n+372 interface_(&inf)\n+373 {\n+374 MPI_Comm_dup(comm, &communicator_);\n+375 }\n+380 VariableSizeCommunicator(const Interface& inf)\n+381 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),\n+382 interface_(&inf.interfaces())\n+383 {\n+384 MPI_Comm_dup(inf.communicator(), &communicator_);\n+385 }\n+386#endif\n+_\b3_\b9_\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(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+394 : maxBufferSize_(max_buffer_size), interface_(&inf)\n+395 {\n+396 MPI_Comm_dup(comm, &communicator_);\n+397 }\n+398\n+_\b4_\b0_\b4 _\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+405 : maxBufferSize_(max_buffer_size), interface_(&inf.interfaces())\n+406 {\n+407 MPI_Comm_dup(inf._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br(), &communicator_);\n+408 }\n+409\n+_\b4_\b1_\b0 _\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+411 {\n+412 MPI_Comm_free(&communicator_);\n+413 }\n+414\n+_\b4_\b1_\b9 _\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+420 maxBufferSize_ = other.maxBufferSize_;\n+421 interface_ = other.interface_;\n+422 MPI_Comm_dup(other.communicator_, &communicator_);\n+423 }\n+424\n+_\b4_\b2_\b9 _\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+430 if(this == &other) // don't do anything if objects are the same\n+431 return *this;\n+432\n+433 maxBufferSize_ = other.maxBufferSize_;\n+434 interface_ = other.interface_;\n+435 MPI_Comm_free(&communicator_);\n+436 MPI_Comm_dup(other.communicator_, &communicator_);\n+437\n+438 return *this;\n+439 }\n+440\n+460 template\n+_\b4_\b6_\b1 void _\bf_\bo_\br_\bw_\ba_\br_\bd(DataHandle& handle)\n+462 {\n+463 communicate(handle);\n+464 }\n+465\n+485 template\n+_\b4_\b8_\b6 void _\bb_\ba_\bc_\bk_\bw_\ba_\br_\bd(DataHandle& handle)\n+487 {\n+488 communicate(handle);\n+489 }\n+490\n+491private:\n+492 template\n+493 void communicateSizes(DataHandle& handle,\n+494 std::vector& recv_trackers);\n+495\n+502 template\n+503 void communicate(DataHandle& handle);\n+513 template\n+514 void setupInterfaceTrackers(DataHandle& handle,\n+515 std::vector& send_trackers,\n+516 std::vector& recv_trackers);\n+524 template\n+525 void communicateFixedSize(DataHandle& handle);\n+533 template\n+534 void communicateVariableSize(DataHandle& handle);\n+541 std::size_t maxBufferSize_;\n+549 const _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bM_\ba_\bp* interface_;\n+555 MPI_Comm communicator_;\n+556};\n+557\n+559namespace\n+560{\n+564template\n+565class SizeDataHandle\n+566{\n+567public:\n+568 typedef std::size_t DataType;\n+569\n+570 SizeDataHandle(DataHandle& data,\n+571 std::vector& trackers)\n+572 : data_(data), trackers_(trackers), index_()\n+573 {}\n+574 bool _\bf_\bi_\bx_\be_\bd_\bS_\bi_\bz_\be()\n+575 {\n+576 return true;\n+577 }\n+578 std::size_t size([[maybe_unused]] std::size_t i)\n+579 {\n+580 return 1;\n+581 }\n+582 template\n+583 void gather(B& buf, int i)\n+584 {\n+585 buf.write(data_.size(i));\n+586 }\n+587 void setReceivingIndex(std::size_t i)\n+588 {\n+589 index_=i;\n+590 }\n+591 std::size_t* getSizesPointer()\n+592 {\n+593 return trackers_[index_].getSizesPointer();\n+594 }\n+595\n+596private:\n+597 DataHandle& data_;\n+598 std::vector& trackers_;\n+599 int index_;\n+600};\n+601\n+602template\n+603void setReceivingIndex(T&, int)\n+604{}\n+605\n+606template\n+607void setReceivingIndex(SizeDataHandle& t, int i)\n+608{\n+609 t.setReceivingIndex(i);\n+610}\n+611\n+612\n+618template\n+619struct InterfaceInformationChooser\n+620{\n+624 static const InterfaceInformation&\n+625 getSend(const std::pair& info)\n+626 {\n+627 return info.first;\n+628 }\n+629\n+633 static const InterfaceInformation&\n+634 getReceive(const std::pair&\n+info)\n+635 {\n+636 return info.second;\n+637 }\n+638};\n+639\n+640template<>\n+641struct InterfaceInformationChooser\n+642{\n+643 static const InterfaceInformation&\n+644 getSend(const std::pair& info)\n+645 {\n+646 return info.second;\n+647 }\n+648\n+649 static const InterfaceInformation&\n+650 getReceive(const std::pair&\n+info)\n+651 {\n+652 return info.first;\n+653 }\n+654};\n+655\n+661template\n+662struct PackEntries\n+663{\n+664\n+665 int operator()(DataHandle& handle, InterfaceTracker& tracker,\n+666 MessageBuffer& buffer,\n+667 [[maybe_unused]] int i) const\n+668 {\n+669 return operator()(handle,tracker,buffer);\n+670 }\n+671\n+679 int operator()(DataHandle& handle, InterfaceTracker& tracker,\n+680 MessageBuffer& buffer) const\n+681 {\n+682 if(tracker.fixedSize) // fixed size if variable is >0!\n+683 {\n+684\n+685 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize,\n+tracker.indicesLeft());\n+686 for(std::size_t i=0; i< noIndices; ++i)\n+687 {\n+688 handle.gather(buffer, tracker.index());\n+689 tracker.moveToNextIndex();\n+690 }\n+691 return noIndices*tracker.fixedSize;\n+692 }\n+693 else\n+694 {\n+695 int packed=0;\n+696 tracker.skipZeroIndices();\n+697 while(!tracker.finished())\n+698 if(buffer.hasSpaceForItems(handle.size(tracker.index())))\n+699 {\n+700 handle.gather(buffer, tracker.index());\n+701 packed+=handle.size(tracker.index());\n+702 tracker.moveToNextIndex();\n+703 }\n+704 else\n+705 break;\n+706 return packed;\n+707 }\n+708 }\n+709};\n+710\n+716template\n+717struct UnpackEntries{\n+718\n+726 bool operator()(DataHandle& handle, InterfaceTracker& tracker,\n+727 MessageBuffer& buffer,\n+728 int count=0)\n+729 {\n+730 if(tracker.fixedSize) // fixed size if variable is >0!\n+731 {\n+732 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize,\n+tracker.indicesLeft());\n+733\n+734 for(std::size_t i=0; i< noIndices; ++i)\n+735 {\n+736 handle.scatter(buffer, tracker.index(), tracker.fixedSize);\n+737 tracker.moveToNextIndex();\n+738 }\n+739 return tracker.finished();\n+740 }\n+741 else\n+742 {\n+743 assert(count);\n+744 for(int unpacked=0;unpacked\n+762struct UnpackSizeEntries{\n+763\n+771 bool operator()(SizeDataHandle& handle, InterfaceTracker&\n+tracker,\n+772 MessageBuffer::DataType>& buffer) const\n+773 {\n+774 std::size_t noIndices=std::min(buffer.size(), tracker.indicesLeft());\n+775 std::copy(static_cast(buffer), static_cast\n+(buffer)+noIndices,\n+776 handle.getSizesPointer()+tracker.offset());\n+777 tracker.increment(noIndices);\n+778 return noIndices;\n+779 }\n+780 bool operator()(SizeDataHandle& handle, InterfaceTracker&\n+tracker,\n+781 MessageBuffer::DataType>& buffer, int)\n+const\n+782 {\n+783 return operator()(handle,tracker,buffer);\n+784 }\n+785};\n+786\n+794void sendFixedSize(std::vector& send_trackers,\n+795 std::vector& send_requests,\n+796 std::vector& recv_trackers,\n+797 std::vector& recv_requests,\n+798 MPI_Comm communicator)\n+799{\n+800 typedef std::vector::iterator TIter;\n+801 std::vector::iterator mIter=recv_requests.begin();\n+802\n+803 for(TIter iter=recv_trackers.begin(), end=recv_trackers.end(); iter!=end;\n+804 ++iter, ++mIter)\n+805 {\n+806 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+807 iter->rank(), 933881, communicator, &(*mIter));\n+808 }\n+809\n+810 // Send our size to all neighbours using non-blocking synchronous\n+communication.\n+811 std::vector::iterator mIter1=send_requests.begin();\n+812 for(TIter iter=send_trackers.begin(), end=send_trackers.end();\n+813 iter!=end;\n+814 ++iter, ++mIter1)\n+815 {\n+816 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+817 iter->rank(), 933881, communicator, &(*mIter1));\n+818 }\n+819}\n+820\n+821\n+826template\n+827struct SetupSendRequest{\n+828 void operator()(DataHandle& handle,\n+829 InterfaceTracker& tracker,\n+830 MessageBuffer& buffer,\n+831 MPI_Request& request,\n+832 MPI_Comm comm) const\n+833 {\n+834 buffer.reset();\n+835 int size=PackEntries()(handle, tracker, buffer);\n+836 // Skip indices of zero size.\n+837 while(!tracker.finished() && !handle.size(tracker.index()))\n+838 tracker.moveToNextIndex();\n+839 if(size)\n+840 MPI_Issend(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:_\bg_\be_\bt_\bT_\by_\bp_\be\n+(),\n+841 tracker.rank(), 933399, comm, &request);\n+842 }\n+843};\n+844\n+845\n+850template\n+851struct SetupRecvRequest{\n+852 void operator()(DataHandle& /*handle*/,\n+853 InterfaceTracker& tracker,\n+854 MessageBuffer& buffer,\n+855 MPI_Request& request,\n+856 MPI_Comm comm) const\n+857 {\n+858 buffer.reset();\n+859 if(tracker.indicesLeft())\n+860 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+861 tracker.rank(), 933399, comm, &request);\n+862 }\n+863};\n+864\n+868template\n+869struct NullPackUnpackFunctor\n+870{\n+871 int operator()(DataHandle&, InterfaceTracker&,\n+872 MessageBuffer&, int)\n+873 {\n+874 return 0;\n+875 }\n+876 int operator()(DataHandle&, InterfaceTracker&,\n+877 MessageBuffer&)\n+878 {\n+879 return 0;\n+880 }\n+881};\n+882\n+897template\n+898std::size_t checkAndContinue(DataHandle& handle,\n+899 std::vector& trackers,\n+900 std::vector& requests,\n+901 std::vector& requests2,\n+902 std::vector >& buffers,\n+903 MPI_Comm comm,\n+904 BufferFunctor buffer_func,\n+905 CommunicationFunctor comm_func,\n+906 bool valid=true,\n+907 bool getCount=false)\n+908{\n+909 std::size_t size=requests.size();\n+910 std::vector statuses(size);\n+911 int no_completed;\n+912 std::vector indices(size, -1); // the indices for which the\n+communication finished.\n+913\n+914 MPI_Testsome(size, &(requests[0]), &no_completed, &(indices[0]), &(statuses\n+[0]));\n+915 indices.resize(no_completed);\n+916 for(std::vector::iterator index=indices.begin(), end=indices.end();\n+917 index!=end; ++index)\n+918 {\n+919 InterfaceTracker& tracker=trackers[*index];\n+920 setReceivingIndex(handle, *index);\n+921 if(getCount)\n+922 {\n+923 // Get the number of entries received\n+924 int count;\n+925 MPI_Get_count(&(statuses[index-indices.begin()]),\n+926 _\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+927 &count);\n+928 // Communication completed, we can reuse the buffers, e.g. unpack or repack\n+929 buffer_func(handle, tracker, buffers[*index], count);\n+930 }else\n+931 buffer_func(handle, tracker, buffers[*index]);\n+932 tracker.skipZeroIndices();\n+933 if(!tracker.finished()){\n+934 // Maybe start another communication.\n+935 comm_func(handle, tracker, buffers[*index], requests2[*index], comm);\n+936 tracker.skipZeroIndices();\n+937 if(valid)\n+938 --no_completed; // communication not finished, decrement counter for\n+finished ones.\n+939 }\n+940 }\n+941 return no_completed;\n+942\n+943}\n+944\n+954template\n+955std::size_t receiveSizeAndSetupReceive(DataHandle& handle,\n+956 std::vector& trackers,\n+957 std::vector& size_requests,\n+958 std::vector& data_requests,\n+959 std::vector >& buffers,\n+960 MPI_Comm comm)\n+961{\n+962 return checkAndContinue(handle, trackers, size_requests, data_requests,\n+buffers, comm,\n+963 NullPackUnpackFunctor(), SetupRecvRequest(),\n+false);\n+964}\n+965\n+974template\n+975std::size_t checkSendAndContinueSending(DataHandle& handle,\n+976 std::vector& trackers,\n+977 std::vector& requests,\n+978 std::vector >& buffers,\n+979 MPI_Comm comm)\n+980{\n+981 return checkAndContinue(handle, trackers, requests, requests, buffers,\n+comm,\n+982 NullPackUnpackFunctor(), SetupSendRequest());\n+983}\n+984\n+993template\n+994std::size_t checkReceiveAndContinueReceiving(DataHandle& handle,\n+995 std::vector& trackers,\n+996 std::vector& requests,\n+997 std::vector >& buffers,\n+998 MPI_Comm comm)\n+999{\n+1000 return checkAndContinue(handle, trackers, requests, requests, buffers,\n+comm,\n+1001 UnpackEntries(), SetupRecvRequest(),\n+1002 true, !Impl::callFixedSize(handle));\n+1003}\n+1004\n+1005\n+1006bool validRecvRequests(const std::vector reqs)\n+1007{\n+1008 for(std::vector::const_iterator i=reqs.begin(), end=reqs.end\n+();\n+1009 i!=end; ++i)\n+1010 if(*i!=MPI_REQUEST_NULL)\n+1011 return true;\n+1012 return false;\n+1013}\n+1014\n+1025template\n+1026std::size_t setupRequests(DataHandle& handle,\n+1027 std::vector& trackers,\n+1028 std::vector >& buffers,\n+1029 std::vector& requests,\n+1030 const Functor& setupFunctor,\n+1031 MPI_Comm communicator)\n+1032{\n+1033 typedef typename std::vector::iterator TIter;\n+1034 typename std::vector >::\n+iterator\n+1035 biter=buffers.begin();\n+1036 typename std::vector::iterator riter=requests.begin();\n+1037 std::size_t complete=0;\n+1038 for(TIter titer=trackers.begin(), end=trackers.end(); titer!=end; ++titer,\n+++biter, ++riter)\n+1039 {\n+1040 setupFunctor(handle, *titer, *biter, *riter, communicator);\n+1041 complete+=titer->finished();\n+1042 }\n+1043 return complete;\n+1044}\n+1045} // end unnamed namespace\n+1046\n+1047template\n+1048template\n+1049void VariableSizeCommunicator::setupInterfaceTrackers\n+(DataHandle& handle,\n+1050 std::vector& send_trackers,\n+1051 std::vector& recv_trackers)\n+1052{\n+1053 if(interface_->_\bs_\bi_\bz_\be()==0)\n+1054 return;\n+1055 send_trackers.reserve(interface_->_\bs_\bi_\bz_\be());\n+1056 recv_trackers.reserve(interface_->_\bs_\bi_\bz_\be());\n+1057\n+1058 int fixedsize=0;\n+1059 if(Impl::callFixedSize(handle))\n+1060 ++fixedsize;\n+1061\n+1062\n+1063 typedef typename InterfaceMap::const_iterator IIter;\n+1064 for(IIter inf=interface_->begin(), end=interface_->end(); inf!=end; ++inf)\n+1065 {\n+1066\n+1067 if(Impl::callFixedSize(handle) && InterfaceInformationChooser::\n+getSend(inf->second).size())\n+1068 fixedsize=handle.size(InterfaceInformationChooser::getSend(inf-\n+>second)[0]);\n+1069 assert(!Impl::callFixedSize(handle)||fixedsize>0);\n+1070 send_trackers.push_back(InterfaceTracker(inf->first,\n+1071 InterfaceInformationChooser::getSend(inf->second), fixedsize));\n+1072 recv_trackers.push_back(InterfaceTracker(inf->first,\n+1073 InterfaceInformationChooser::getReceive(inf->second), fixedsize,\n+fixedsize==0));\n+1074 }\n+1075}\n+1076\n+1077template\n+1078template\n+1079void VariableSizeCommunicator::communicateFixedSize(DataHandle&\n+handle)\n+1080{\n+1081 std::vector size_send_req(interface_->_\bs_\bi_\bz_\be());\n+1082 std::vector size_recv_req(interface_->_\bs_\bi_\bz_\be());\n+1083\n+1084 std::vector send_trackers;\n+1085 std::vector recv_trackers;\n+1086 setupInterfaceTrackers(handle,send_trackers, recv_trackers);\n+1087 sendFixedSize(send_trackers, size_send_req, recv_trackers, size_recv_req,\n+communicator_);\n+1088\n+1089 std::vector data_send_req(interface_->_\bs_\bi_\bz_\be(),\n+MPI_REQUEST_NULL);\n+1090 std::vector data_recv_req(interface_->_\bs_\bi_\bz_\be(),\n+MPI_REQUEST_NULL);\n+1091 typedef typename DataHandle::DataType DataType;\n+1092 std::vector > send_buffers(interface_->_\bs_\bi_\bz_\be(),\n+MessageBuffer(maxBufferSize_)),\n+1093 recv_buffers(interface_->_\bs_\bi_\bz_\be(), MessageBuffer(maxBufferSize_));\n+1094\n+1095\n+1096 setupRequests(handle, send_trackers, send_buffers, data_send_req,\n+1097 SetupSendRequest(), communicator_);\n+1098\n+1099 std::size_t no_size_to_recv, no_to_send, no_to_recv, old_size;\n+1100 no_size_to_recv = no_to_send = no_to_recv = old_size = interface_->_\bs_\bi_\bz_\be();\n+1101\n+1102 // Skip empty interfaces.\n+1103 typedef typename std::vector::const_iterator Iter;\n+1104 for(Iter i=recv_trackers.begin(), end=recv_trackers.end(); i!=end; ++i)\n+1105 if(i->empty())\n+1106 --no_to_recv;\n+1107 for(Iter i=send_trackers.begin(), end=send_trackers.end(); i!=end; ++i)\n+1108 if(i->empty())\n+1109 --no_to_send;\n+1110\n+1111 while(no_size_to_recv+no_to_send+no_to_recv)\n+1112 {\n+1113 // Receive the fixedsize and setup receives accordingly\n+1114 if(no_size_to_recv)\n+1115 no_size_to_recv -= receiveSizeAndSetupReceive(handle,recv_trackers,\n+size_recv_req,\n+1116 data_recv_req, recv_buffers,\n+1117 communicator_);\n+1118\n+1119 // Check send completion and initiate other necessary sends\n+1120 if(no_to_send)\n+1121 no_to_send -= checkSendAndContinueSending(handle, send_trackers,\n+data_send_req,\n+1122 send_buffers, communicator_);\n+1123 if(validRecvRequests(data_recv_req))\n+1124 // Receive data and setup new unblocking receives if necessary\n+1125 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers,\n+data_recv_req,\n+1126 recv_buffers, communicator_);\n+1127 }\n+1128\n+1129 // Wait for completion of sending the size.\n+1130 //std::vector statuses(interface_->size(),\n+MPI_STATUSES_IGNORE);\n+1131 MPI_Waitall(size_send_req.size(), &(size_send_req[0]),\n+MPI_STATUSES_IGNORE);\n+1132\n+1133}\n+1134\n+1135template\n+1136template\n+1137void VariableSizeCommunicator::communicateSizes(DataHandle&\n+handle,\n+1138 std::vector& data_recv_trackers)\n+1139{\n+1140 std::vector send_trackers;\n+1141 std::vector recv_trackers;\n+1142 std::size_t size = interface_->_\bs_\bi_\bz_\be();\n+1143 std::vector send_requests(size, MPI_REQUEST_NULL);\n+1144 std::vector recv_requests(size, MPI_REQUEST_NULL);\n+1145 std::vector >\n+1146 send_buffers(size, MessageBuffer(maxBufferSize_)),\n+1147 recv_buffers(size, MessageBuffer(maxBufferSize_));\n+1148 SizeDataHandle size_handle(handle,data_recv_trackers);\n+1149 setupInterfaceTrackers(size_handle,send_trackers, recv_trackers);\n+1150 setupRequests(size_handle, send_trackers, send_buffers, send_requests,\n+1151 SetupSendRequest >(), communicator_);\n+1152 setupRequests(size_handle, recv_trackers, recv_buffers, recv_requests,\n+1153 SetupRecvRequest >(), communicator_);\n+1154\n+1155 // Count valid requests that we have to wait for.\n+1156 auto valid_req_func =\n+1157 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL; };\n+1158\n+1159 auto size_to_send = std::count_if(send_requests.begin(), send_requests.end\n+(),\n+1160 valid_req_func);\n+1161 auto size_to_recv = std::count_if(recv_requests.begin(), recv_requests.end\n+(),\n+1162 valid_req_func);\n+1163\n+1164 while(size_to_send+size_to_recv)\n+1165 {\n+1166 if(size_to_send)\n+1167 size_to_send -=\n+1168 checkSendAndContinueSending(size_handle, send_trackers, send_requests,\n+1169 send_buffers, communicator_);\n+1170 if(size_to_recv)\n+1171 // Could have done this using checkSendAndContinueSending\n+1172 // But the call below is more efficient as UnpackSizeEntries\n+1173 // uses std::copy.\n+1174 size_to_recv -=\n+1175 checkAndContinue(size_handle, recv_trackers, recv_requests, recv_requests,\n+1176 recv_buffers, communicator_, UnpackSizeEntries(),\n+1177 SetupRecvRequest >());\n+1178 }\n+1179}\n+1180\n+1181template\n+1182template\n+1183void VariableSizeCommunicator::communicateVariableSize\n+(DataHandle& handle)\n+1184{\n+1185\n+1186 std::vector send_trackers;\n+1187 std::vector recv_trackers;\n+1188 setupInterfaceTrackers(handle, send_trackers, recv_trackers);\n+1189\n+1190 std::vector send_requests(interface_->_\bs_\bi_\bz_\be(),\n+MPI_REQUEST_NULL);\n+1191 std::vector recv_requests(interface_->_\bs_\bi_\bz_\be(),\n+MPI_REQUEST_NULL);\n+1192 typedef typename DataHandle::DataType DataType;\n+1193 std::vector >\n+1194 send_buffers(interface_->_\bs_\bi_\bz_\be(), MessageBuffer(maxBufferSize_)),\n+1195 recv_buffers(interface_->_\bs_\bi_\bz_\be(), MessageBuffer(maxBufferSize_));\n+1196\n+1197 communicateSizes(handle, recv_trackers);\n+1198 // Setup requests for sending and receiving.\n+1199 setupRequests(handle, send_trackers, send_buffers, send_requests,\n+1200 SetupSendRequest(), communicator_);\n+1201 setupRequests(handle, recv_trackers, recv_buffers, recv_requests,\n+1202 SetupRecvRequest(), communicator_);\n+1203\n+1204 // Determine number of valid requests.\n+1205 auto valid_req_func =\n+1206 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL;};\n+1207\n+1208 auto no_to_send = std::count_if(send_requests.begin(), send_requests.end\n+(),\n+1209 valid_req_func);\n+1210 auto no_to_recv = std::count_if(recv_requests.begin(), recv_requests.end\n+(),\n+1211 valid_req_func);\n+1212 while(no_to_send+no_to_recv)\n+1213 {\n+1214 // Check send completion and initiate other necessary sends\n+1215 if(no_to_send)\n+1216 no_to_send -= checkSendAndContinueSending(handle, send_trackers,\n+send_requests,\n+1217 send_buffers, communicator_);\n+1218 if(no_to_recv)\n+1219 // Receive data and setup new unblocking receives if necessary\n+1220 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers,\n+recv_requests,\n+1221 recv_buffers, communicator_);\n+1222 }\n+1223}\n+1224\n+1225template\n+1226template\n+1227void VariableSizeCommunicator::communicate(DataHandle& handle)\n+1228{\n+1229 if( interface_->_\bs_\bi_\bz_\be() == 0)\n+1230 // Simply return as otherwise we will index an empty container\n+1231 // either for MPI_Wait_all or MPI_Test_some.\n+1232 return;\n+1233\n+1234 if(Impl::callFixedSize(handle))\n+1235 communicateFixedSize(handle);\n+1236 else\n+1237 communicateVariableSize(handle);\n+1238}\n+1239} // end namespace Dune\n+1240\n+1241#endif // HAVE_MPI\n+1242\n+1243#endif\n+_\bc_\bo_\bn_\bc_\be_\bp_\bt_\b._\bh_\bh\n+Infrastructure for concepts.\n+_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits classes for mapping types onto MPI_Datatype.\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:265\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:417\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_\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:108\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:209\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:43\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:332\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:404\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:486\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:410\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:393\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:419\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:461\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:429\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:340\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:349\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:358\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 ===============================================================================\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/a00221.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00221.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: utility.hh File Reference\n+dune-common: communication.hh File Reference\n \n \n \n \n \n \n \n@@ -65,36 +65,71 @@\n \n \n \n \n \n \n \n
    \n \n-
    utility.hh File Reference
    \n+Classes |\n+Namespaces |\n+Typedefs |\n+Functions
    \n+
    communication.hh File Reference
    \n \n
    \n-
    #include <utility>
    \n+\n+

    Implements an utility class that provides collective communication methods for sequential programs. \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
    \n

    Go to the source code of this file.

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

    \n+Classes

    struct  Dune::No_Comm
     
    class  Dune::Communication< Communicator >
     Collective communication interface and sequential default implementation. 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+Typedefs

    template<class T >
    using Dune::CollectiveCommunication = Communication< T >
     
    \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.
     
    \n-
    \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+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,20 +1,49 @@\n dune-common\u00a02.9.0\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\n-utility.hh File Reference\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 | _\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+#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/_\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+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 _\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-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:_\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+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+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 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/a00221_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: utility.hh Source File\n+dune-common: communication.hh Source File\n \n \n \n \n \n \n \n@@ -70,49 +70,417 @@\n \n \n \n \n \n \n \n
    \n-
    utility.hh
    \n+
    communication.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_UTILITY_HH
    \n-
    4#define DUNE_COMMON_STD_UTILITY_HH
    \n-
    5
    \n-
    6#include <utility>
    \n-
    7
    \n-
    8#warning dune/common/std/utility.hh is deprecated and will be removed after Dune 2.8.\\
    \n-
    9 Include <utility> instead
    \n-
    10
    \n-
    11namespace Dune
    \n-
    12{
    \n-
    13
    \n-
    14 namespace Std
    \n-
    15 {
    \n-
    16
    \n-
    17 using std::integer_sequence;
    \n-
    18 using std::index_sequence;
    \n-
    19 using std::make_integer_sequence;
    \n-
    20 using std::make_index_sequence;
    \n-
    21 using std::index_sequence_for;
    \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 (C) 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-
    23 } // namespace Std
    \n-
    24
    \n-
    25} // namespace Dune
    \n-
    26
    \n-
    27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH
    \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+
    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+
    \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+
    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+
    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
    \n+
    helper classes to provide unique types for standard functions
    \n+\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:237
    \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:259
    \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:122
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,43 +1,480 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-utility.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_STD_UTILITY_HH\n-4#define DUNE_COMMON_STD_UTILITY_HH\n-5\n-6#include \n-7\n-8#warning dune/common/std/utility.hh is deprecated and will be removed after\n-Dune 2.8.\\\n-9 Include instead\n-10\n-11namespace _\bD_\bu_\bn_\be\n-12{\n-13\n-14 namespace Std\n-15 {\n-16\n-17 using std::integer_sequence;\n-18 using std::index_sequence;\n-19 using std::make_integer_sequence;\n-20 using std::make_index_sequence;\n-21 using std::index_sequence_for;\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-23 } // namespace Std\n-24\n-25} // namespace Dune\n-26\n-27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH\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 _\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+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+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+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+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\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+_\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__\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:237\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:259\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:122\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/a00224.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00224.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: plocalindex.hh File Reference\n \n \n \n \n \n \n \n@@ -65,102 +65,67 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    type_traits.hh File Reference
    \n+Functions
    \n+ \n \n
    \n-
    #include <type_traits>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/typeutilities.hh>
    \n+\n+

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

    \n+
    #include "localindex.hh"
    \n+#include "indexset.hh"
    \n+#include "mpitraits.hh"
    \n+#include <iostream>
    \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 Classes

    struct  Dune::Std::nonesuch
     Type representing a lookup failure by std::detected_or and friends. More...
     
    struct  Dune::Std::conjunction< B >
     forms the logical conjunction of the type traits B... More...
    class  Dune::ParallelLocalIndex< T >
     An index present on the local process with an additional attribute flag. More...
     
    struct  Dune::Std::disjunction< B >
     forms the logical disjunction of the type traits B... More...
    struct  Dune::LocalIndexComparator< ParallelLocalIndex< T > >
     
    struct  Dune::Std::negation< B >
     forms the logical negation of the type traits B... More...
    class  Dune::MPITraits< ParallelLocalIndex< T > >
     
    \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-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-\n-\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

    template<template< typename... > class Op, typename... Args>
    constexpr bool Dune::Std::is_detected_v = is_detected<Op,Args...>::value
     Detects whether Op<Args...> is valid and makes the result available as a value.
     
    template<typename Expected , template< typename... > class Op, typename... Args>
    constexpr bool Dune::Std::is_detected_exact_v = is_detected_exact<Expected,Op,Args...>::value
     Convenient access to the result value of is_detected_exact.
     
    template<typename Target , template< typename... > class Op, typename... Args>
    constexpr bool Dune::Std::is_detected_convertible_v = is_detected_convertible<Target,Op,Args...>::value
     Convenient access to the result value of is_detected_convertible.
     

    \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,97 +1,51 @@\n dune-common\u00a02.9.0\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 | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n-type_traits.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 <_\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 | _\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 \"_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\"\n+#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n+#include \"_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\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-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+ 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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bB_\b _\b>\n-\u00a0 forms the logical conjunction of the type traits B... _\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bd_\bi_\bs_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bB_\b _\b>\n-\u00a0 forms the logical disjunction of the type traits B... _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bn_\be_\bg_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bB_\b _\b>\n-\u00a0 forms the logical negation of the type traits B... _\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 _\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-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-\u00a0\n-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n-template class Op, typename... Args>\n-constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bv = _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd::value\n-\u00a0 Detects whether Op is valid and makes the result\n- available as a value.\n-\u00a0\n-template class Op, typename...\n-Args>\n-constexpr bool\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_\b__\bv =\n- _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt::value\n-\u00a0 Convenient access to the result value of is_detected_exact.\n-\u00a0\n-template class Op, typename... Args>\n-constexpr bool\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_\b__\bv =\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-\u00a0 Convenient access to the result value of\n- is_detected_convertible.\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/a00224_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00224_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: plocalindex.hh Source File\n \n \n \n \n \n \n \n@@ -70,223 +70,306 @@\n \n \n \n \n \n \n \n
    \n-
    type_traits.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 (C) 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-\n-\n-
    11
    \n-
    12#if __has_include(<experimental/type_traits>)
    \n-
    13#include <experimental/type_traits>
    \n-
    14#endif
    \n-
    15
    \n-
    16namespace Dune
    \n-
    17{
    \n+
    5
    \n+
    6#ifndef DUNE_PLOCALINDEX_HH
    \n+
    7#define DUNE_PLOCALINDEX_HH
    \n+
    8
    \n+
    9#include "localindex.hh"
    \n+
    10#include "indexset.hh"
    \n+
    11#include "mpitraits.hh"
    \n+
    12
    \n+
    13#include <iostream>
    \n+
    14
    \n+
    15namespace Dune
    \n+
    16{
    \n+
    17
    \n
    18
    \n-
    20
    \n-
    29namespace Std
    \n-
    30{
    \n-
    31
    \n-
    34 using std::bool_constant;
    \n-
    35
    \n-
    36#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-
    37
    \n-
    38 using std::experimental::nonesuch;
    \n-
    39 using std::experimental::detected_or;
    \n-
    40 using std::experimental::is_detected;
    \n-
    41 using std::experimental::detected_t;
    \n-
    42 using std::experimental::is_detected_v;
    \n-
    43 using std::experimental::detected_or_t;
    \n-
    44 using std::experimental::is_detected_exact;
    \n-
    45 using std::experimental::is_detected_exact_v;
    \n-
    46 using std::experimental::is_detected_convertible;
    \n-
    47 using std::experimental::is_detected_convertible_v;
    \n-
    48
    \n-
    49#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-
    50
    \n-
    51 // fallback version of std::experimental::is_detected et al., heavily scribbled
    \n-
    52 // from cppreference.com (but there is actually not much implementation to the thing)
    \n-
    53
    \n-
    54#ifndef DOXYGEN
    \n+
    29 template<class T> class ParallelLocalIndex;
    \n+
    30
    \n+
    36 template<class T>
    \n+
    \n+
    37 std::ostream& operator<<(std::ostream& os, const ParallelLocalIndex<T>& index)
    \n+
    38 {
    \n+
    39 os<<"{local="<<index.localIndex_<<", attr="<<T(index.attribute_)<<", public="
    \n+
    40 <<(index.public_ ? true : false)<<"}";
    \n+
    41 return os;
    \n+
    42 }
    \n+
    \n+
    43
    \n+
    47 template<typename T>
    \n+
    \n+\n+
    49 {
    \n+
    50#if HAVE_MPI
    \n+
    51 // friend declaration needed for MPITraits
    \n+
    52 friend struct MPITraits<ParallelLocalIndex<T> >;
    \n+
    53#endif
    \n+
    54 friend std::ostream& operator<<<>(std::ostream& os, const ParallelLocalIndex<T>& index);
    \n
    55
    \n-
    56 namespace Impl {
    \n-
    57
    \n-
    58 // default version of detector, this gets matched on failure
    \n-
    59 template<typename Default, typename Void, template<typename...> class Op, typename... Args>
    \n-
    60 struct detector
    \n-
    61 {
    \n-
    62 using value_t = std::false_type;
    \n-
    63 using type = Default;
    \n-
    64 };
    \n-
    65
    \n-
    66 // specialization of detector that matches if Op<Args...> can be instantiated
    \n-
    67 template<typename Default, template<typename...> class Op, typename... Args>
    \n-
    68 struct detector<Default, std::void_t<Op<Args...>>, Op, Args...>
    \n-
    69 {
    \n-
    70 using value_t = std::true_type;
    \n-
    71 using type = Op<Args...>;
    \n-
    72 };
    \n-
    73
    \n-
    74 }
    \n-
    75
    \n-
    76#endif // DOXYGEN
    \n-
    77
    \n-
    79
    \n-
    \n-
    87 struct nonesuch
    \n-
    88 {
    \n-
    89 nonesuch() = delete;
    \n-
    90 ~nonesuch() = delete;
    \n-
    91 nonesuch(const nonesuch&) = delete;
    \n-
    92 void operator=(const nonesuch&) = delete;
    \n-
    93 };
    \n-
    \n-
    94
    \n-
    96
    \n-
    127 template<typename Default, template<typename...> class Op, typename... Args>
    \n-
    128 using detected_or = Impl::detector<Default,void,Op,Args...>;
    \n-
    129
    \n-
    131
    \n-
    140 template<template<typename...> class Op, typename... Args>
    \n-
    141 using is_detected = typename detected_or<nonesuch,Op,Args...>::value_t;
    \n-
    142
    \n-
    143#ifdef __cpp_variable_templates
    \n+
    56 public:
    \n+
    64 typedef T Attribute;
    \n+\n+
    74
    \n+
    83 ParallelLocalIndex(size_t localIndex, const Attribute& attribute, bool isPublic=true);
    \n+\n+
    90
    \n+
    91#if 0
    \n+\n+
    102#endif
    \n+
    103
    \n+
    108 inline const Attribute attribute() const;
    \n+
    109
    \n+
    114 inline void setAttribute(const Attribute& attribute);
    \n+
    115
    \n+
    120 inline size_t local() const;
    \n+
    121
    \n+
    125 inline operator size_t() const;
    \n+
    126
    \n+
    132 inline ParallelLocalIndex<Attribute>& operator=(size_t index);
    \n+
    133
    \n+
    138 inline bool isPublic() const;
    \n+
    139
    \n+
    144 inline LocalIndexState state() const;
    \n
    145
    \n-
    154 template<template<typename...> class Op, typename... Args>
    \n-
    155 constexpr bool is_detected_v = is_detected<Op,Args...>::value;
    \n-
    156#endif // __cpp_variable_templates
    \n-
    157
    \n-
    159
    \n-
    169 template<template<typename...> class Op, typename... Args>
    \n-
    170 using detected_t = typename detected_or<nonesuch,Op,Args...>::type;
    \n+
    150 inline void setState(const LocalIndexState& state);
    \n+
    151
    \n+
    152 private:
    \n+
    154 size_t localIndex_;
    \n+
    155
    \n+
    157 char attribute_;
    \n+
    158
    \n+
    160 char public_;
    \n+
    161
    \n+
    168 char state_;
    \n+
    169
    \n+
    170 };
    \n+
    \n
    171
    \n-
    172
    \n-
    174
    \n-
    184 template<typename Default, template<typename...> class Op, typename... Args>
    \n-
    185 using detected_or_t = typename detected_or<Default,Op,Args...>::type;
    \n-
    186
    \n-
    188
    \n-
    194 template<typename Expected, template<typename...> class Op, typename... Args>
    \n-
    195 using is_detected_exact = std::is_same<Expected,detected_t<Op,Args...>>;
    \n-
    196
    \n-
    197#ifdef __cpp_variable_templates
    \n-
    199
    \n-
    205 template<typename Expected, template<typename...> class Op, typename... Args>
    \n-
    206 constexpr bool is_detected_exact_v = is_detected_exact<Expected,Op,Args...>::value;
    \n-
    207#endif // __cpp_variable_templates
    \n-
    208
    \n-
    210
    \n-
    216 template<typename Target, template<typename...> class Op, typename... Args>
    \n-
    217 using is_detected_convertible = std::is_convertible<Target,detected_t<Op,Args...>>;
    \n-
    218
    \n-
    219#ifdef __cpp_variable_templates
    \n-
    221
    \n-
    227 template<typename Target, template<typename...> class Op, typename... Args>
    \n-
    228 constexpr bool is_detected_convertible_v = is_detected_convertible<Target,Op,Args...>::value;
    \n-
    229#endif // __cpp_variable_templates
    \n-
    230
    \n-
    231#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
    \n-
    232
    \n-
    233
    \n-
    234
    \n-
    235 // conjunction
    \n-
    236 // -----------
    \n-
    237
    \n-
    245 template< class... B >
    \n-
    \n-
    246 struct [[deprecated("Will be removed after release 2.8. Use std::conjunction instead.")]] conjunction
    \n-
    247 : std::conjunction<B...>
    \n-
    248 {};
    \n-
    \n-
    249
    \n-
    250
    \n-
    251 // disjunction
    \n-
    252 // -----------
    \n-
    253
    \n-
    261 template< class... B >
    \n-
    \n-
    262 struct [[deprecated("Will be removed after release 2.8. Use std::disjunction instead.")]] disjunction
    \n-
    263 : std::disjunction<B...>
    \n-
    264 {};
    \n-
    \n-
    265
    \n-
    266
    \n-
    267 // negation
    \n-
    268 // --------
    \n-
    269
    \n-
    277 template<class B>
    \n-
    \n-
    278 struct [[deprecated("Will be removed after release 2.8. Use std::negation instead.")]] negation
    \n-
    279 : std::negation<B>
    \n-
    280 {};
    \n-
    \n-
    281
    \n-
    282} // namespace Std
    \n-
    283
    \n-
    284
    \n-
    285namespace detail
    \n-
    286{
    \n-
    287 template <class Type>
    \n-
    288 [[deprecated("Type extraction of `TargetType` has failed. Inspect the code calling `detected_or_fallback_t` for getting the source of this warning!")]]
    \n-
    289 Type warningIfNotDefined(const Std::nonesuch*);
    \n-
    290
    \n-
    291 template <class Type, class T>
    \n-
    292 Type warningIfNotDefined(const T*);
    \n-
    293}
    \n-
    294
    \n-
    296template <template<typename...> class Fallback,
    \n-
    297 template<typename...> class TargetType, typename... Args>
    \n-\n-
    299 detail::warningIfNotDefined<Std::detected_t<Fallback, Args...> >(std::declval<const Std::detected_t<TargetType, Args...>*>())),
    \n-
    300 TargetType, Args...>;
    \n+
    172 template<typename T>
    \n+
    \n+\n+
    174 const ParallelLocalIndex<T>& p2)
    \n+
    175 {
    \n+
    176 if(p1.local()!=p2.local())
    \n+
    177 return false;
    \n+
    178 if(p1.attribute()!=p2.attribute())
    \n+
    179 return false;
    \n+
    180 if(p1.isPublic()!=p2.isPublic())
    \n+
    181 return false;
    \n+
    182 return true;
    \n+
    183 }
    \n+
    \n+
    184 template<typename T>
    \n+
    \n+\n+
    186 const ParallelLocalIndex<T>& p2)
    \n+
    187 {
    \n+
    188 return !(p1==p2);
    \n+
    189 }
    \n+
    \n+
    190
    \n+
    191
    \n+
    192 template<typename T>
    \n+
    \n+\n+
    194 {
    \n+
    \n+
    195 static bool compare(const ParallelLocalIndex<T>& t1,
    \n+
    196 const ParallelLocalIndex<T>& t2){
    \n+
    197 return t1.attribute()<t2.attribute();
    \n+
    198 }
    \n+
    \n+
    199 };
    \n+
    \n+
    200
    \n+
    201
    \n+
    202#if HAVE_MPI
    \n+
    203
    \n+
    205 template<typename T>
    \n+
    \n+\n+
    207 {
    \n+
    208 public:
    \n+
    209 static MPI_Datatype getType();
    \n+
    210 private:
    \n+
    211 static MPI_Datatype type;
    \n+
    212
    \n+
    213 };
    \n+
    \n+
    214
    \n+
    215#endif
    \n+
    216
    \n+
    217 template<class T>
    \n+
    \n+
    218 ParallelLocalIndex<T>::ParallelLocalIndex(const T& attribute, bool isPublic)
    \n+
    219 : localIndex_(0), attribute_(static_cast<char>(attribute)),
    \n+
    220 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
    \n+
    221 {}
    \n+
    \n+
    222
    \n+
    223
    \n+
    224 template<class T>
    \n+
    \n+
    225 ParallelLocalIndex<T>::ParallelLocalIndex(size_t local, const T& attribute, bool isPublic)
    \n+
    226 : localIndex_(local), attribute_(static_cast<char>(attribute)),
    \n+
    227 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
    \n+
    228 {}
    \n+
    \n+
    229
    \n+
    230 template<class T>
    \n+
    \n+\n+
    232 : localIndex_(0), attribute_(), public_(static_cast<char>(false)),
    \n+
    233 state_(static_cast<char>(VALID))
    \n+
    234 {}
    \n+
    \n+
    235
    \n+
    236 template<class T>
    \n+
    \n+
    237 inline const T ParallelLocalIndex<T>::attribute() const
    \n+
    238 {
    \n+
    239 return T(attribute_);
    \n+
    240 }
    \n+
    \n+
    241
    \n+
    242 template<class T>
    \n+
    243 inline void
    \n+
    \n+\n+
    245 {
    \n+
    246 attribute_ = attribute;
    \n+
    247 }
    \n+
    \n+
    248
    \n+
    249 template<class T>
    \n+
    \n+
    250 inline size_t ParallelLocalIndex<T>::local() const
    \n+
    251 {
    \n+
    252 return localIndex_;
    \n+
    253 }
    \n+
    \n+
    254
    \n+
    255 template<class T>
    \n+
    \n+\n+
    257 {
    \n+
    258 return localIndex_;
    \n+
    259 }
    \n+
    \n+
    260
    \n+
    261 template<class T>
    \n+\n+
    \n+\n+
    264 {
    \n+
    265 localIndex_=index;
    \n+
    266 return *this;
    \n+
    267 }
    \n+
    \n+
    268
    \n+
    269 template<class T>
    \n+
    \n+\n+
    271 {
    \n+
    272 return static_cast<bool>(public_);
    \n+
    273 }
    \n+
    \n+
    274
    \n+
    275 template<class T>
    \n+
    \n+\n+
    277 {
    \n+
    278 return LocalIndexState(state_);
    \n+
    279 }
    \n+
    \n+
    280
    \n+
    281 template<class T>
    \n+
    \n+\n+
    283 {
    \n+
    284 state_=static_cast<char>(state);
    \n+
    285 }
    \n+
    \n+
    286
    \n+
    287#if HAVE_MPI
    \n+
    288
    \n+
    289 template<typename T>
    \n+
    \n+
    290 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::getType()
    \n+
    291 {
    \n+
    292
    \n+
    293 if(type==MPI_DATATYPE_NULL) {
    \n+
    294 int length = 1;
    \n+
    295 MPI_Aint base, disp;
    \n+
    296 MPI_Datatype types[1] = {MPITraits<char>::getType()};
    \n+\n+
    298 MPI_Get_address(&rep, &base);
    \n+
    299 MPI_Get_address(&(rep.attribute_), &disp);
    \n+
    300 disp -= base;
    \n
    301
    \n-
    302
    \n-
    303} // namespace Dune
    \n+
    302 MPI_Datatype tmp;
    \n+
    303 MPI_Type_create_struct(1, &length, &disp, types, &tmp);
    \n
    304
    \n-
    305#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
    \n-
    Utilities for type computations, constraining overloads, ...
    \n-
    Traits for type conversions and type information.
    \n-
    constexpr bool is_detected_exact_v
    Convenient access to the result value of is_detected_exact.
    Definition type_traits.hh:206
    \n-
    constexpr bool is_detected_convertible_v
    Convenient access to the result value of is_detected_convertible.
    Definition type_traits.hh:228
    \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:185
    \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:195
    \n-
    typename detected_or< nonesuch, Op, Args... >::type detected_t
    Returns Op<Args...> if that is valid; otherwise returns nonesuch.
    Definition type_traits.hh:170
    \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-
    constexpr bool is_detected_v
    Detects whether Op<Args...> is valid and makes the result available as a value.
    Definition type_traits.hh:155
    \n-
    typename detected_or< nonesuch, Op, Args... >::value_t is_detected
    Detects whether Op<Args...> is valid.
    Definition type_traits.hh:141
    \n-
    Impl::detector< Default, void, Op, Args... > detected_or
    Detects whether Op<Args...> is valid and makes the result available.
    Definition type_traits.hh:128
    \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:217
    \n-
    STL namespace.
    \n+
    305 MPI_Type_create_resized(tmp, 0, sizeof(ParallelLocalIndex<T>), &type);
    \n+
    306 MPI_Type_commit(&type);
    \n+
    307
    \n+
    308 MPI_Type_free(&tmp);
    \n+
    309 }
    \n+
    310 return type;
    \n+
    311 }
    \n+
    \n+
    312
    \n+
    313 template<typename T>
    \n+
    314 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::type = MPI_DATATYPE_NULL;
    \n+
    315
    \n+
    316#endif
    \n+
    317
    \n+
    318
    \n+
    320} // namespace Dune
    \n+
    321
    \n+
    322#endif
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    Provides a map between global and local indices.
    \n+
    Provides classes for use as the local index in ParallelIndexSet.
    \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:237
    \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:259
    \n+
    bool isPublic() const
    Check whether the index might also be known other processes.
    Definition plocalindex.hh:270
    \n+
    void setAttribute(const Attribute &attribute)
    Set the attribute of the index.
    Definition plocalindex.hh:244
    \n+
    size_t local() const
    get the local index.
    Definition plocalindex.hh:250
    \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:282
    \n+
    ParallelLocalIndex< Attribute > & operator=(size_t index)
    Assign a new local index.
    Definition plocalindex.hh:263
    \n+
    LocalIndexState state() const
    Get the state.
    Definition plocalindex.hh:276
    \n+
    ParallelLocalIndex()
    Parameterless constructor.
    Definition plocalindex.hh:231
    \n+
    const Attribute attribute() const
    Get the attribute of the index.
    Definition plocalindex.hh:237
    \n+
    @ VALID
    Definition localindex.hh:28
    \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:300
    \n-
    Type representing a lookup failure by std::detected_or and friends.
    Definition type_traits.hh:88
    \n-\n-
    nonesuch(const nonesuch &)=delete
    \n-
    void operator=(const nonesuch &)=delete
    \n-\n-
    forms the logical conjunction of the type traits B...
    Definition type_traits.hh:248
    \n-
    forms the logical disjunction of the type traits B...
    Definition type_traits.hh:264
    \n-
    forms the logical negation of the type traits B...
    Definition type_traits.hh:280
    \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:49
    \n+
    T Attribute
    The type of the attributes. Normally this will be an enumeration like.
    Definition plocalindex.hh:64
    \n+
    static bool compare(const ParallelLocalIndex< T > &t1, const ParallelLocalIndex< T > &t2)
    Definition plocalindex.hh:195
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,279 +1,325 @@\n dune-common\u00a02.9.0\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+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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 (C) 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 <_\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-10#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-11\n-12#if __has_include()\n-13#include \n-14#endif\n-15\n-16namespace _\bD_\bu_\bn_\be\n-17{\n+5\n+6#ifndef DUNE_PLOCALINDEX_HH\n+7#define DUNE_PLOCALINDEX_HH\n+8\n+9#include \"_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\"\n+10#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n+11#include \"_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n+12\n+13#include \n+14\n+15namespace _\bD_\bu_\bn_\be\n+16{\n+17\n 18\n-20\n-29namespace Std\n-30{\n-31\n-34 using std::bool_constant;\n-35\n-36#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-37\n-38 using std::experimental::nonesuch;\n-39 using std::experimental::detected_or;\n-40 using std::experimental::is_detected;\n-41 using std::experimental::detected_t;\n-42 using std::experimental::is_detected_v;\n-43 using std::experimental::detected_or_t;\n-44 using std::experimental::is_detected_exact;\n-45 using std::experimental::is_detected_exact_v;\n-46 using std::experimental::is_detected_convertible;\n-47 using std::experimental::is_detected_convertible_v;\n-48\n-49#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-50\n-51 // fallback version of std::experimental::is_detected et al., heavily\n-scribbled\n-52 // from cppreference.com (but there is actually not much implementation to\n-the thing)\n-53\n-54#ifndef DOXYGEN\n+29 template class ParallelLocalIndex;\n+30\n+36 template\n+_\b3_\b7 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+38 {\n+39 os<<\"{local=\"<\n+_\b4_\b8 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+49 {\n+50#if HAVE_MPI\n+51 // friend declaration needed for MPITraits\n+52 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+53#endif\n+54 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 55\n-56 namespace Impl {\n-57\n-58 // default version of detector, this gets matched on failure\n-59 template class Op,\n-typename... Args>\n-60 struct detector\n-61 {\n-62 using value_t = std::false_type;\n-63 using type = Default;\n-64 };\n-65\n-66 // specialization of detector that matches if Op can be\n-instantiated\n-67 template class Op, typename... Args>\n-68 struct detector>, Op, Args...>\n-69 {\n-70 using value_t = std::true_type;\n-71 using type = Op;\n-72 };\n-73\n-74 }\n-75\n-76#endif // DOXYGEN\n-77\n-79\n-_\b8_\b7 struct _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh\n-88 {\n-_\b8_\b9 _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh() = delete;\n-_\b9_\b0 _\b~_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh() = delete;\n-_\b9_\b1 _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh(const _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh&) = delete;\n-_\b9_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh&) = delete;\n-93 };\n-94\n-96\n-127 template class Op, typename...\n-Args>\n-_\b1_\b2_\b8 using _\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br = Impl::detector;\n-129\n-131\n-140 template class Op, typename... Args>\n-_\b1_\b4_\b1 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-142\n-143#ifdef __cpp_variable_templates\n+56 public:\n+_\b6_\b4 typedef T _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+73 _\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+74\n+83 _\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+89 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx();\n+90\n+91#if 0\n+101 _\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+102#endif\n+103\n+108 inline const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n+109\n+114 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+115\n+120 inline size_t _\bl_\bo_\bc_\ba_\bl() const;\n+121\n+125 inline operator size_t() const;\n+126\n+132 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+133\n+138 inline bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc() const;\n+139\n+144 inline _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be _\bs_\bt_\ba_\bt_\be() const;\n 145\n-154 template class Op, typename... Args>\n-_\b1_\b5_\b5 constexpr bool _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bv = _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd::value;\n-156#endif // __cpp_variable_templates\n-157\n-159\n-169 template class Op, typename... Args>\n-_\b1_\b7_\b0 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+150 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+151\n+152 private:\n+154 size_t localIndex_;\n+155\n+157 char attribute_;\n+158\n+160 char public_;\n+161\n+168 char state_;\n+169\n+170 };\n 171\n-172\n-174\n-184 template class Op, typename...\n-Args>\n-_\b1_\b8_\b5 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-186\n-188\n-194 template class Op, typename...\n-Args>\n-_\b1_\b9_\b5 using _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt = std::is_same>;\n-196\n-197#ifdef __cpp_variable_templates\n-199\n-205 template class Op, typename...\n-Args>\n-_\b2_\b0_\b6 constexpr bool _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt_\b__\bv =\n-_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt::value;\n-207#endif // __cpp_variable_templates\n-208\n-210\n-216 template class Op, typename... Args>\n-_\b2_\b1_\b7 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-218\n-219#ifdef __cpp_variable_templates\n-221\n-227 template class Op, typename... Args>\n-_\b2_\b2_\b8 constexpr bool _\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bc_\bo_\bn_\bv_\be_\br_\bt_\bi_\bb_\bl_\be_\b__\bv =\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-229#endif // __cpp_variable_templates\n-230\n-231#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED\n-232\n-233\n-234\n-235 // conjunction\n-236 // -----------\n-237\n-245 template< class... B >\n-_\b2_\b4_\b6 struct [[deprecated(\"Will be removed after release 2.8. Use std::\n-conjunction instead.\")]] _\bc_\bo_\bn_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-247 : std::conjunction\n-248 {};\n-249\n-250\n-251 // disjunction\n-252 // -----------\n-253\n-261 template< class... B >\n-_\b2_\b6_\b2 struct [[deprecated(\"Will be removed after release 2.8. Use std::\n-disjunction instead.\")]] _\bd_\bi_\bs_\bj_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n-263 : std::disjunction\n-264 {};\n-265\n-266\n-267 // negation\n-268 // --------\n-269\n-277 template\n-_\b2_\b7_\b8 struct [[deprecated(\"Will be removed after release 2.8. Use std::negation\n-instead.\")]] _\bn_\be_\bg_\ba_\bt_\bi_\bo_\bn\n-279 : std::negation\n-280 {};\n-281\n-282} // namespace Std\n-283\n-284\n-285namespace detail\n-286{\n-287 template \n-288 [[deprecated(\"Type extraction of `TargetType` has failed. Inspect the code\n-calling `detected_or_fallback_t` for getting the source of this warning!\")]]\n-289 Type warningIfNotDefined(const _\bS_\bt_\bd_\b:_\b:_\bn_\bo_\bn_\be_\bs_\bu_\bc_\bh*);\n-290\n-291 template \n-292 Type warningIfNotDefined(const T*);\n-293}\n-294\n-296template class Fallback,\n-297 template class TargetType, typename... Args>\n-_\b2_\b9_\b8using _\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-300 TargetType, Args...>;\n+172 template\n+_\b1_\b7_\b3 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+174 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n+175 {\n+176 if(p1._\bl_\bo_\bc_\ba_\bl()!=p2._\bl_\bo_\bc_\ba_\bl())\n+177 return false;\n+178 if(p1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()!=p2._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be())\n+179 return false;\n+180 if(p1._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc()!=p2._\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc())\n+181 return false;\n+182 return true;\n+183 }\n+184 template\n+_\b1_\b8_\b5 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+186 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& p2)\n+187 {\n+188 return !(p1==p2);\n+189 }\n+190\n+191\n+192 template\n+_\b1_\b9_\b3 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+194 {\n+_\b1_\b9_\b5 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+196 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b>& t2){\n+197 return t1._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()\n+_\b2_\b0_\b6 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+207 {\n+208 public:\n+209 static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n+210 private:\n+211 static MPI_Datatype type;\n+212\n+213 };\n+214\n+215#endif\n+216\n+217 template\n+_\b2_\b1_\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(const T& attribute, bool\n+isPublic)\n+219 : localIndex_(0), attribute_(static_cast(attribute)),\n+220 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n+221 {}\n+222\n+223\n+224 template\n+_\b2_\b2_\b5 _\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+226 : localIndex_(local), attribute_(static_cast(attribute)),\n+227 public_(static_cast(isPublic)), state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n+228 {}\n+229\n+230 template\n+_\b2_\b3_\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()\n+232 : localIndex_(0), attribute_(), public_(static_cast(false)),\n+233 state_(static_cast(_\bV_\bA_\bL_\bI_\bD))\n+234 {}\n+235\n+236 template\n+_\b2_\b3_\b7 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+238 {\n+239 return T(attribute_);\n+240 }\n+241\n+242 template\n+243 inline void\n+_\b2_\b4_\b4 _\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+245 {\n+246 attribute_ = attribute;\n+247 }\n+248\n+249 template\n+_\b2_\b5_\b0 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+251 {\n+252 return localIndex_;\n+253 }\n+254\n+255 template\n+_\b2_\b5_\b6 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+257 {\n+258 return localIndex_;\n+259 }\n+260\n+261 template\n+262 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_\b3 _\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+264 {\n+265 localIndex_=index;\n+266 return *this;\n+267 }\n+268\n+269 template\n+_\b2_\b7_\b0 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+271 {\n+272 return static_cast(public_);\n+273 }\n+274\n+275 template\n+_\b2_\b7_\b6 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+277 {\n+278 return _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bS_\bt_\ba_\bt_\be(state_);\n+279 }\n+280\n+281 template\n+_\b2_\b8_\b2 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+283 {\n+284 state_=static_cast(state);\n+285 }\n+286\n+287#if HAVE_MPI\n+288\n+289 template\n+_\b2_\b9_\b0 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+291 {\n+292\n+293 if(type==MPI_DATATYPE_NULL) {\n+294 int length = 1;\n+295 MPI_Aint base, disp;\n+296 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+297 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\b<_\bT_\b> rep;\n+298 MPI_Get_address(&rep, &base);\n+299 MPI_Get_address(&(rep.attribute_), &disp);\n+300 disp -= base;\n 301\n-302\n-303} // namespace Dune\n+302 MPI_Datatype tmp;\n+303 MPI_Type_create_struct(1, &length, &disp, types, &tmp);\n 304\n-305#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_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-_\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:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\be_\bx_\ba_\bc_\bt_\b__\bv\n-constexpr bool is_detected_exact_v\n-Convenient access to the result value of is_detected_exact.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:206\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_\b__\bv\n-constexpr bool is_detected_convertible_v\n-Convenient access to the result value of is_detected_convertible.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:228\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:185\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:195\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:170\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_\b__\bv\n-constexpr bool is_detected_v\n-Detects whether Op is valid and makes the result available as a value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn type_traits.hh:155\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:141\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:128\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), &type);\n+306 MPI_Type_commit(&type);\n+307\n+308 MPI_Type_free(&tmp);\n+309 }\n+310 return type;\n+311 }\n+312\n+313 template\n+_\b3_\b1_\b4 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+315\n+316#endif\n+317\n+318\n+320} // namespace Dune\n+321\n+322#endif\n+_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits classes for mapping types onto MPI_Datatype.\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+_\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:237\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:259\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:270\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:244\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:250\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:282\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:263\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:276\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:231\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:237\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:_\bd_\be_\bt_\be_\bc_\bt_\be_\bd_\b__\bo_\br_\b__\bf_\ba_\bl_\bl_\bb_\ba_\bc_\bk_\b__\bt\n-Std::detected_or_t< decltype(detail::warningIfNotDefined< Std::detected_t<\n-Fallback, Args... > >(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_\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:195\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/a00227.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00227.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: functional.hh File Reference\n+dune-common: mpipack.hh File Reference\n \n \n \n \n \n \n \n@@ -65,43 +65,51 @@\n \n \n \n \n \n \n \n
    \n \n-
    functional.hh File Reference
    \n+
    mpipack.hh File Reference
    \n
    \n
    \n-
    #include <functional>
    \n+\n+

    See MPI_Pack. \n+More...

    \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+\n \n

    \n Classes

    struct  Dune::Std::identity
     A function object type whose operator() returns its argument unchanged. More...
    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 Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Std
     Namespace for features backported from new C++ standards.
     
    \n-
    \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 \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,25 +1,35 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\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-functional.hh File Reference\n-#include \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+#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-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+ 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-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+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/a00227_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00227_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: mpipack.hh Source File\n \n \n \n \n \n \n \n@@ -70,54 +70,283 @@\n \n \n \n \n \n \n \n
    \n-
    functional.hh
    \n+
    mpipack.hh
    \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 (C) 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-
    10namespace Dune
    \n-
    11{
    \n-
    12
    \n-
    13 namespace Std
    \n-
    14 {
    \n-
    15
    \n-
    22#if DUNE_HAVE_CXX_STD_IDENTITY
    \n-
    23 using std::identity;
    \n-
    24#else //DUNE_HAVE_CXX_STD_IDENTITY
    \n-
    \n-
    25 struct identity {
    \n-
    26 template<class T>
    \n-
    27 constexpr T&& operator()(T&& t ) const noexcept {return std::forward<T>(t);}
    \n-
    28 };
    \n-
    \n-
    29#endif
    \n-
    30 } // namespace Std
    \n+
    20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH
    \n+
    21#define DUNE_COMMON_PARALLEL_MPIPACK_HH
    \n+
    22
    \n+
    23#include <vector>
    \n+
    24#if HAVE_MPI
    \n+
    25#include <mpi.h>
    \n+\n+\n+
    28
    \n+
    29
    \n+
    30namespace Dune {
    \n
    31
    \n-
    32} // namespace Dune
    \n-
    33
    \n-
    34#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_HH
    \n+
    \n+
    32 class MPIPack {
    \n+
    33 std::vector<char> _buffer;
    \n+
    34 int _position;
    \n+
    35 MPI_Comm _comm;
    \n+
    36
    \n+
    37 friend struct MPIData<MPIPack>;
    \n+
    38 friend struct MPIData<const MPIPack>;
    \n+
    39 public:
    \n+
    \n+
    40 MPIPack(Communication<MPI_Comm> comm, std::size_t size = 0)
    \n+
    41 : _buffer(size)
    \n+
    42 , _position(0)
    \n+
    43 , _comm(comm)
    \n+
    44 {}
    \n+
    \n+
    45
    \n+
    46 // Its not valid to copy a MPIPack but you can move it
    \n+
    47 MPIPack(const MPIPack&) = delete;
    \n+
    48 MPIPack& operator = (const MPIPack& other) = delete;
    \n+
    49 MPIPack(MPIPack&&) = default;
    \n+
    50 MPIPack& operator = (MPIPack&& other) = default;
    \n+
    51
    \n+
    57 template<class T>
    \n+
    \n+
    58 void pack(const T& data){
    \n+
    59 auto mpidata = getMPIData(data);
    \n+
    60 int size = getPackSize(mpidata.size(), _comm, mpidata.type());
    \n+
    61 constexpr bool has_static_size = decltype(getMPIData(std::declval<T&>()))::static_size;
    \n+
    62 if(!has_static_size)
    \n+
    63 size += getPackSize(1, _comm, MPI_INT);
    \n+
    64 if (_position + size > 0 && size_t(_position + size) > _buffer.size()) // resize buffer if necessary
    \n+
    65 _buffer.resize(_position + size);
    \n+
    66 if(!has_static_size){
    \n+
    67 int size = mpidata.size();
    \n+
    68 MPI_Pack(&size, 1, MPI_INT, _buffer.data(), _buffer.size(),
    \n+
    69 &_position, _comm);
    \n+
    70 }
    \n+
    71 MPI_Pack(mpidata.ptr(), mpidata.size(),
    \n+
    72 mpidata.type(), _buffer.data(), _buffer.size(),
    \n+
    73 &_position, _comm);
    \n+
    74 }
    \n+
    \n+
    75
    \n+
    80 template<class T>
    \n+
    \n+
    81 auto /*void*/ unpack(T& data)
    \n+
    82 -> std::enable_if_t<decltype(getMPIData(data))::static_size, void>
    \n+
    83 {
    \n+
    84 auto mpidata = getMPIData(data);
    \n+
    85 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n+
    86 mpidata.ptr(), mpidata.size(),
    \n+
    87 mpidata.type(), _comm);
    \n+
    88 }
    \n+
    \n+
    89
    \n+
    94 template<class T>
    \n+
    \n+
    95 auto /*void*/ unpack(T& data)
    \n+
    96 -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void>
    \n+
    97 {
    \n+
    98 auto mpidata = getMPIData(data);
    \n+
    99 int size = 0;
    \n+
    100 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n+
    101 &size, 1,
    \n+
    102 MPI_INT, _comm);
    \n+
    103 mpidata.resize(size);
    \n+
    104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
    \n+
    105 mpidata.ptr(), mpidata.size(),
    \n+
    106 mpidata.type(), _comm);
    \n+
    107 }
    \n+
    \n+
    108
    \n+
    109
    \n+
    111 template<typename T>
    \n+
    \n+
    112 friend MPIPack& operator << (MPIPack& p, const T& t){
    \n+
    113 p.pack(t);
    \n+
    114 return p;
    \n+
    115 }
    \n+
    \n+
    116
    \n+
    118 template<typename T>
    \n+
    \n+
    119 friend MPIPack& operator >> (MPIPack& p, T& t){
    \n+
    120 p.unpack(t);
    \n+
    121 return p;
    \n+
    122 }
    \n+
    \n+
    123
    \n+
    125 template<typename T>
    \n+
    \n+
    126 MPIPack& read(T& t){
    \n+
    127 unpack(t);
    \n+
    128 return *this;
    \n+
    129 }
    \n+
    \n+
    130
    \n+
    132 template<typename T>
    \n+
    \n+
    133 MPIPack& write(const T& t){
    \n+
    134 pack(t);
    \n+
    135 return *this;
    \n+
    136 }
    \n+
    \n+
    137
    \n+
    \n+
    141 void resize(size_t size){
    \n+
    142 _buffer.resize(size);
    \n+
    143 }
    \n+
    \n+
    144
    \n+
    \n+
    147 void enlarge(int s) {
    \n+
    148 _buffer.resize(_buffer.size() + s);
    \n+
    149 }
    \n+
    \n+
    150
    \n+
    \n+
    153 size_t size() const {
    \n+
    154 return _buffer.size();
    \n+
    155 }
    \n+
    \n+
    156
    \n+
    \n+
    160 void seek(int p){
    \n+
    161 _position = p;
    \n+
    162 }
    \n+
    \n+
    163
    \n+
    \n+
    167 int tell() const{
    \n+
    168 return _position;
    \n+
    169 }
    \n+
    \n+
    170
    \n+
    \n+
    173 bool eof() const{
    \n+
    174 return std::size_t(_position)==_buffer.size();
    \n+
    175 }
    \n+
    \n+
    176
    \n+
    \n+
    180 static int getPackSize(int len, const MPI_Comm& comm, const MPI_Datatype& dt){
    \n+
    181 int size;
    \n+
    182 MPI_Pack_size(len, dt, comm, &size);
    \n+
    183 return size;
    \n+
    184 }
    \n+
    \n+
    185
    \n+
    \n+
    186 friend bool operator==(const MPIPack& a, const MPIPack& b) {
    \n+
    187 return a._buffer == b._buffer && a._comm == b._comm;
    \n+
    188 }
    \n+
    \n+
    \n+
    189 friend bool operator!=(const MPIPack& a, const MPIPack& b) {
    \n+
    190 return !(a==b);
    \n+
    191 }
    \n+
    \n+
    192
    \n+
    193 };
    \n+
    \n+
    194
    \n+
    195 template<class P>
    \n+
    \n+
    196 struct MPIData<P, std::enable_if_t<std::is_same<std::remove_const_t<P>, MPIPack>::value>> {
    \n+
    197 protected:
    \n+
    198 friend auto getMPIData<P>(P& t);
    \n+
    \n+
    199 MPIData(P& t) :
    \n+
    200 data_(t)
    \n+
    201 {}
    \n+
    \n+
    202 public:
    \n+
    203 static constexpr bool static_size = std::is_const<P>::value;
    \n+
    204
    \n+
    \n+
    205 void* ptr() {
    \n+
    206 return (void*) data_._buffer.data();
    \n+
    207 }
    \n+
    \n+
    208
    \n+
    \n+
    209 int size() {
    \n+
    210 return data_.size();
    \n+
    211 }
    \n+
    \n+
    212
    \n+
    \n+
    213 MPI_Datatype type() const{
    \n+
    214 return MPI_PACKED;
    \n+
    215 }
    \n+
    \n+
    216
    \n+
    \n+
    217 void resize(int size){
    \n+
    218 data_.resize(size);
    \n+
    219 }
    \n+
    \n+
    220 protected:
    \n+\n+
    222 };
    \n+
    \n+
    223
    \n+
    224} // end namespace Dune
    \n+
    225
    \n+
    226#endif
    \n+
    227#endif
    \n+
    Implements an utility class that provides MPI's collective communication methods.
    \n+
    Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    A function object type whose operator() returns its argument unchanged.
    Definition functional.hh:25
    \n-
    constexpr T && operator()(T &&t) const noexcept
    Definition functional.hh:27
    \n+
    auto getMPIData(T &t)
    Definition mpidata.hh:43
    \n+
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n+
    Definition mpidata.hh:50
    \n+
    T & data_
    Definition mpidata.hh:53
    \n+
    int size() const
    Definition mpidata.hh:67
    \n+
    static constexpr bool static_size
    Definition mpidata.hh:65
    \n+
    Definition mpipack.hh:32
    \n+
    void enlarge(int s)
    Enlarges the internal buffer.
    Definition mpipack.hh:147
    \n+
    friend MPIPack & operator>>(MPIPack &p, T &t)
    Unpacks data from the object.
    Definition mpipack.hh:119
    \n+
    friend MPIPack & operator<<(MPIPack &p, const T &t)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:112
    \n+
    friend bool operator!=(const MPIPack &a, const MPIPack &b)
    Definition mpipack.hh:189
    \n+
    size_t size() const
    Returns the size of the internal buffer.
    Definition mpipack.hh:153
    \n+
    MPIPack & operator=(const MPIPack &other)=delete
    \n+
    MPIPack(Communication< MPI_Comm > comm, std::size_t size=0)
    Definition mpipack.hh:40
    \n+
    void pack(const T &data)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:58
    \n+
    auto unpack(T &data) -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void >
    Unpacks data from the object.
    Definition mpipack.hh:95
    \n+
    auto unpack(T &data) -> std::enable_if_t< decltype(getMPIData(data))::static_size, void >
    Unpacks data from the object.
    Definition mpipack.hh:81
    \n+
    friend bool operator==(const MPIPack &a, const MPIPack &b)
    Definition mpipack.hh:186
    \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:160
    \n+
    bool eof() const
    Checks whether the end of the buffer is reached.
    Definition mpipack.hh:173
    \n+
    void resize(size_t size)
    Resizes the internal buffer.
    Definition mpipack.hh:141
    \n+
    int tell() const
    Gets the position in the buffer where the next pack/unpack operation should take place.
    Definition mpipack.hh:167
    \n+
    MPIPack(MPIPack &&)=default
    \n+
    MPIPack & read(T &t)
    Unpacks data from the object.
    Definition mpipack.hh:126
    \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:180
    \n+
    MPIPack & write(const T &t)
    Packs the data into the object. Enlarges the internal buffer if necessary.
    Definition mpipack.hh:133
    \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,49 +1,323 @@\n dune-common\u00a02.9.0\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+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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: 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 (C) 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-10namespace _\bD_\bu_\bn_\be\n-11{\n-12\n-13 namespace Std\n-14 {\n-15\n-22#if DUNE_HAVE_CXX_STD_IDENTITY\n-23 using std::identity;\n-24#else //DUNE_HAVE_CXX_STD_IDENTITY\n-_\b2_\b5 struct _\bi_\bd_\be_\bn_\bt_\bi_\bt_\by {\n-26 template\n-_\b2_\b7 constexpr T&& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(T&& t ) const noexcept {return std::forward(t);}\n-28 };\n-29#endif\n-30 } // namespace Std\n+20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH\n+21#define DUNE_COMMON_PARALLEL_MPIPACK_HH\n+22\n+23#include \n+24#if HAVE_MPI\n+25#include \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_\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_\bd_\ba_\bt_\ba_\b._\bh_\bh>\n+28\n+29\n+30namespace _\bD_\bu_\bn_\be {\n 31\n-32} // namespace Dune\n-33\n-34#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_HH\n+_\b3_\b2 class _\bM_\bP_\bI_\bP_\ba_\bc_\bk {\n+33 std::vector _buffer;\n+34 int _position;\n+_\b3_\b5 MPI_Comm _comm;\n+36\n+37 friend struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba<_\bM_\bP_\bI_\bP_\ba_\bc_\bk>;\n+38 friend struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba;\n+39 public:\n+_\b4_\b0 _\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+41 : _buffer(_\bs_\bi_\bz_\be)\n+42 , _position(0)\n+43 , _comm(comm)\n+44 {}\n+45\n+46 // Its not valid to copy a MPIPack but you can move it\n+_\b4_\b7 _\bM_\bP_\bI_\bP_\ba_\bc_\bk(const _\bM_\bP_\bI_\bP_\ba_\bc_\bk&) = delete;\n+_\b4_\b8 _\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+_\b4_\b9 _\bM_\bP_\bI_\bP_\ba_\bc_\bk(_\bM_\bP_\bI_\bP_\ba_\bc_\bk&&) = default;\n+_\b5_\b0 _\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+51\n+57 template\n+_\b5_\b8 void _\bp_\ba_\bc_\bk(const T& data){\n+59 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+60 int _\bs_\bi_\bz_\be = _\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be(mpidata.size(), _comm, mpidata.type());\n+61 constexpr bool has_static_size = decltype(_\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(std::declval()))::\n+static_size;\n+62 if(!has_static_size)\n+63 _\bs_\bi_\bz_\be += _\bg_\be_\bt_\bP_\ba_\bc_\bk_\bS_\bi_\bz_\be(1, _comm, MPI_INT);\n+64 if (_position + _\bs_\bi_\bz_\be > 0 && size_t(_position + _\bs_\bi_\bz_\be) > _buffer.size()) /\n+/ resize buffer if necessary\n+65 _buffer.resize(_position + _\bs_\bi_\bz_\be);\n+66 if(!has_static_size){\n+67 int _\bs_\bi_\bz_\be = mpidata.size();\n+68 MPI_Pack(&_\bs_\bi_\bz_\be, 1, MPI_INT, _buffer.data(), _buffer.size(),\n+69 &_position, _comm);\n+70 }\n+71 MPI_Pack(mpidata.ptr(), mpidata.size(),\n+72 mpidata.type(), _buffer.data(), _buffer.size(),\n+73 &_position, _comm);\n+74 }\n+75\n+80 template\n+_\b8_\b1 auto /*void*/ _\bu_\bn_\bp_\ba_\bc_\bk(T& data)\n+82 -> std::enable_if_t\n+83 {\n+84 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+85 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n+86 mpidata.ptr(), mpidata.size(),\n+87 mpidata.type(), _comm);\n+88 }\n+89\n+94 template\n+_\b9_\b5 auto /*void*/ _\bu_\bn_\bp_\ba_\bc_\bk(T& data)\n+96 -> std::enable_if_t\n+97 {\n+98 auto mpidata = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+99 int _\bs_\bi_\bz_\be = 0;\n+100 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n+101 &_\bs_\bi_\bz_\be, 1,\n+102 MPI_INT, _comm);\n+103 mpidata.resize(_\bs_\bi_\bz_\be);\n+104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,\n+105 mpidata.ptr(), mpidata.size(),\n+106 mpidata.type(), _comm);\n+107 }\n+108\n+109\n+111 template\n+_\b1_\b1_\b2 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+113 p._\bp_\ba_\bc_\bk(t);\n+114 return p;\n+115 }\n+116\n+118 template\n+_\b1_\b1_\b9 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+120 p._\bu_\bn_\bp_\ba_\bc_\bk(t);\n+121 return p;\n+122 }\n+123\n+125 template\n+_\b1_\b2_\b6 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\br_\be_\ba_\bd(T& t){\n+127 _\bu_\bn_\bp_\ba_\bc_\bk(t);\n+128 return *this;\n+129 }\n+130\n+132 template\n+_\b1_\b3_\b3 _\bM_\bP_\bI_\bP_\ba_\bc_\bk& _\bw_\br_\bi_\bt_\be(const T& t){\n+134 _\bp_\ba_\bc_\bk(t);\n+135 return *this;\n+136 }\n+137\n+_\b1_\b4_\b1 void _\br_\be_\bs_\bi_\bz_\be(size_t _\bs_\bi_\bz_\be){\n+142 _buffer.resize(_\bs_\bi_\bz_\be);\n+143 }\n+144\n+_\b1_\b4_\b7 void _\be_\bn_\bl_\ba_\br_\bg_\be(int s) {\n+148 _buffer.resize(_buffer.size() + s);\n+149 }\n+150\n+_\b1_\b5_\b3 size_t _\bs_\bi_\bz_\be() const {\n+154 return _buffer.size();\n+155 }\n+156\n+_\b1_\b6_\b0 void _\bs_\be_\be_\bk(int p){\n+161 _position = p;\n+162 }\n+163\n+_\b1_\b6_\b7 int _\bt_\be_\bl_\bl() const{\n+168 return _position;\n+169 }\n+170\n+_\b1_\b7_\b3 bool _\be_\bo_\bf() const{\n+174 return std::size_t(_position)==_buffer.size();\n+175 }\n+176\n+_\b1_\b8_\b0 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+181 int _\bs_\bi_\bz_\be;\n+182 MPI_Pack_size(len, dt, comm, &_\bs_\bi_\bz_\be);\n+183 return _\bs_\bi_\bz_\be;\n+184 }\n+185\n+_\b1_\b8_\b6 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+187 return a._buffer == b._buffer && a._comm == b._comm;\n+188 }\n+_\b1_\b8_\b9 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+190 return !(a==b);\n+191 }\n+192\n+193 };\n+194\n+195 template\n+_\b1_\b9_\b6 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba,\n+MPIPack>::value>> {\n+197 protected:\n+_\b1_\b9_\b8 friend auto getMPIData

    (P& t);\n+_\b1_\b9_\b9 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(P& t) :\n+200 _\bd_\ba_\bt_\ba_\b_(t)\n+201 {}\n+202 public:\n+_\b2_\b0_\b3 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = std::is_const

    ::value;\n+204\n+_\b2_\b0_\b5 void* _\bp_\bt_\br() {\n+206 return (void*) _\bd_\ba_\bt_\ba_\b_._buffer.data();\n+207 }\n+208\n+_\b2_\b0_\b9 int _\bs_\bi_\bz_\be() {\n+210 return _\bd_\ba_\bt_\ba_\b_.size();\n+211 }\n+212\n+_\b2_\b1_\b3 MPI_Datatype _\bt_\by_\bp_\be() const{\n+214 return MPI_PACKED;\n+215 }\n+216\n+_\b2_\b1_\b7 void _\br_\be_\bs_\bi_\bz_\be(int _\bs_\bi_\bz_\be){\n+218 _\bd_\ba_\bt_\ba_\b_.resize(_\bs_\bi_\bz_\be);\n+219 }\n+220 protected:\n+_\b2_\b2_\b1 P& _\bd_\ba_\bt_\ba_\b_;\n+222 };\n+223\n+224} // end namespace Dune\n+225\n+226#endif\n+227#endif\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+_\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+_\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:25\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:27\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:43\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:_\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpidata.hh:50\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:53\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:67\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:65\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:32\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:147\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:119\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:112\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:189\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:153\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:40\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:58\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:95\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:81\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:186\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:160\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:173\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:141\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:167\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:126\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:180\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:133\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: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:_\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:199\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: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:_\bp_\bt_\br\n+void * ptr()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpipack.hh:205\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:221\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:217\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/a00230.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00230.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: apply.hh File Reference\n+dune-common: mpidata.hh File Reference\n \n \n \n \n \n \n \n@@ -65,36 +65,61 @@\n

    \n \n \n \n \n \n \n
    \n \n-
    apply.hh File Reference
    \n+Classes |\n+Namespaces |\n+Functions
    \n+
    mpidata.hh File Reference
    \n \n
    \n-
    #include <tuple>
    \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 <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+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-\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+Functions

    template<class T >
    auto Dune::getMPIData (T &t)
     
    \n-
    \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,20 +1,44 @@\n dune-common\u00a02.9.0\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\n-apply.hh File Reference\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 | _\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 <_\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-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+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/a00230_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: apply.hh Source File\n+dune-common: mpidata.hh Source File\n \n \n \n \n \n \n \n@@ -70,44 +70,196 @@\n \n \n \n \n \n \n \n
    \n-
    apply.hh
    \n+
    mpidata.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 (C) 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_APPLY_HH
    \n-
    6#define DUNE_COMMON_STD_APPLY_HH
    \n-
    7
    \n-
    8#include <tuple>
    \n-
    9
    \n-
    10namespace Dune
    \n-
    11{
    \n-
    \n-
    12 namespace Std
    \n-
    13 {
    \n-
    14
    \n-
    17 using std::apply;
    \n-
    18
    \n-
    19 } // namespace Std
    \n-
    \n-
    20} // namespace Dune
    \n-
    21
    \n-
    22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH
    \n+
    5
    \n+
    6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH
    \n+
    7#define DUNE_COMMON_PARALLEL_MPIDATA_HH
    \n+
    8
    \n+
    9#include <vector>
    \n+
    10#include <string>
    \n+
    11
    \n+
    12#if HAVE_MPI
    \n+
    13
    \n+\n+\n+\n+
    17
    \n+
    37namespace Dune{
    \n+
    38
    \n+
    39 template<class, class = void>
    \n+
    40 struct MPIData;
    \n+
    41
    \n+
    42 template<class T>
    \n+
    \n+
    43 auto getMPIData(T& t){
    \n+
    44 return MPIData<T>(t);
    \n+
    45 }
    \n+
    \n+
    46
    \n+
    47 // Default implementation for static datatypes
    \n+
    48 template<class T, class Enable>
    \n+
    \n+
    49 struct MPIData
    \n+
    50 {
    \n+
    51 friend auto getMPIData<T>(T&);
    \n+
    52 protected:
    \n+\n+
    54
    \n+
    \n+
    55 MPIData(T& t)
    \n+
    56 : data_(t)
    \n+
    57 {}
    \n+
    \n+
    58
    \n+
    59 public:
    \n+
    \n+
    60 void* ptr() const {
    \n+
    61 return (void*)&data_;
    \n+
    62 }
    \n+
    \n+
    63
    \n+
    64 // indicates whether the datatype can be resized
    \n+
    65 static constexpr bool static_size = true;
    \n+
    66
    \n+
    \n+
    67 int size() const{
    \n+
    68 return 1;
    \n+
    69 }
    \n+
    \n+
    70
    \n+
    \n+
    71 MPI_Datatype type() const {
    \n+
    72 return MPITraits<std::decay_t<T>>::getType();
    \n+
    73 }
    \n+
    \n+
    74 };
    \n+
    \n+
    75
    \n+
    76 // dummy implementation for void
    \n+
    77 template<>
    \n+
    \n+
    78 struct MPIData<void>{
    \n+
    79 protected:
    \n+\n+
    81
    \n+
    82 public:
    \n+
    \n+
    83 void* ptr(){
    \n+
    84 return nullptr;
    \n+
    85 }
    \n+
    \n+
    \n+
    86 int size(){
    \n+
    87 return 0;
    \n+
    88 }
    \n+
    \n+
    89 void get(){}
    \n+
    \n+
    90 MPI_Datatype type() const{
    \n+
    91 return MPI_INT;
    \n+
    92 }
    \n+
    \n+
    93 };
    \n+
    \n+
    94
    \n+
    95 // specializations:
    \n+
    96 // std::vector of static sized elements or std::string
    \n+
    97 template<class T>
    \n+
    \n+
    98 struct MPIData<T, std::void_t<std::tuple<decltype(std::declval<T>().data()),
    \n+
    99 decltype(std::declval<T>().size()),
    \n+
    100 typename std::decay_t<T>::value_type>>>{
    \n+
    101 private:
    \n+
    102 template<class U>
    \n+
    103 using hasResizeOp = decltype(std::declval<U>().resize(0));
    \n+
    104
    \n+
    105 protected:
    \n+
    106 friend auto getMPIData<T>(T&);
    \n+
    \n+\n+
    108 : data_(t)
    \n+
    109 {}
    \n+
    \n+
    110 public:
    \n+
    111 static constexpr bool static_size = std::is_const<T>::value || !Std::is_detected_v<hasResizeOp, T>;
    \n+
    \n+
    112 void* ptr() {
    \n+
    113 return (void*) data_.data();
    \n+
    114 }
    \n+
    \n+
    \n+
    115 int size() {
    \n+
    116 return data_.size();
    \n+
    117 }
    \n+
    \n+
    \n+
    118 MPI_Datatype type() const{
    \n+\n+
    120 }
    \n+
    \n+
    121
    \n+
    122 template<class S = T>
    \n+
    \n+
    123 auto /*void*/ resize(int size)
    \n+
    124 -> std::enable_if_t<!std::is_const<S>::value || !Std::is_detected_v<hasResizeOp, S>>
    \n+
    125 {
    \n+
    126 data_.resize(size);
    \n+
    127 }
    \n+
    \n+
    128
    \n+
    129 protected:
    \n+\n+
    131 };
    \n+
    \n+
    132
    \n+
    133}
    \n+
    134
    \n+
    139#endif
    \n+
    140#endif
    \n+\n+
    Traits for type conversions and type information.
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \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:43
    \n+
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n+
    Definition mpidata.hh:50
    \n+
    T & data_
    Definition mpidata.hh:53
    \n+
    MPI_Datatype type() const
    Definition mpidata.hh:71
    \n+
    void * ptr() const
    Definition mpidata.hh:60
    \n+
    int size() const
    Definition mpidata.hh:67
    \n+
    static constexpr bool static_size
    Definition mpidata.hh:65
    \n+
    MPIData(T &t)
    Definition mpidata.hh:55
    \n+
    void get()
    Definition mpidata.hh:89
    \n+
    MPIData()
    Definition mpidata.hh:80
    \n+
    int size()
    Definition mpidata.hh:86
    \n+
    void * ptr()
    Definition mpidata.hh:83
    \n+
    MPI_Datatype type() const
    Definition mpidata.hh:90
    \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:123
    \n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,217 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bt_\bd\n-apply.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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// -*- 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 (C) 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_APPLY_HH\n-6#define DUNE_COMMON_STD_APPLY_HH\n-7\n-8#include \n-9\n-10namespace _\bD_\bu_\bn_\be\n-11{\n-_\b1_\b2 namespace Std\n-13 {\n-14\n-17 using std::apply;\n-18\n-19 } // namespace Std\n-20} // namespace Dune\n-21\n-22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH\n+5\n+6#ifndef DUNE_COMMON_PARALLEL_MPIDATA_HH\n+7#define DUNE_COMMON_PARALLEL_MPIDATA_HH\n+8\n+9#include \n+10#include \n+11\n+12#if HAVE_MPI\n+13\n+14#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+15#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+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+37namespace _\bD_\bu_\bn_\be{\n+38\n+39 template\n+40 struct MPIData;\n+41\n+42 template\n+_\b4_\b3 auto _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t){\n+44 return _\bM_\bP_\bI_\bD_\ba_\bt_\ba_\b<_\bT_\b>(t);\n+45 }\n+46\n+47 // Default implementation for static datatypes\n+48 template\n+_\b4_\b9 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba\n+50 {\n+51 friend auto getMPIData(T&);\n+52 protected:\n+_\b5_\b3 T& _\bd_\ba_\bt_\ba_\b_;\n+54\n+_\b5_\b5 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n+56 : _\bd_\ba_\bt_\ba_\b_(t)\n+57 {}\n+58\n+59 public:\n+_\b6_\b0 void* _\bp_\bt_\br() const {\n+61 return (void*)&_\bd_\ba_\bt_\ba_\b_;\n+62 }\n+63\n+64 // indicates whether the datatype can be resized\n+_\b6_\b5 static constexpr bool _\bs_\bt_\ba_\bt_\bi_\bc_\b__\bs_\bi_\bz_\be = true;\n+66\n+_\b6_\b7 int _\bs_\bi_\bz_\be() const{\n+68 return 1;\n+69 }\n+70\n+_\b7_\b1 MPI_Datatype _\bt_\by_\bp_\be() const {\n+72 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+73 }\n+74 };\n+75\n+76 // dummy implementation for void\n+77 template<>\n+_\b7_\b8 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba{\n+79 protected:\n+_\b8_\b0 _\bM_\bP_\bI_\bD_\ba_\bt_\ba() {}\n+81\n+82 public:\n+_\b8_\b3 void* _\bp_\bt_\br(){\n+84 return nullptr;\n+85 }\n+_\b8_\b6 int _\bs_\bi_\bz_\be(){\n+87 return 0;\n+88 }\n+_\b8_\b9 void _\bg_\be_\bt(){}\n+_\b9_\b0 MPI_Datatype _\bt_\by_\bp_\be() const{\n+91 return MPI_INT;\n+92 }\n+93 };\n+94\n+95 // specializations:\n+96 // std::vector of static sized elements or std::string\n+97 template\n+_\b9_\b8 struct _\bM_\bP_\bI_\bD_\ba_\bt_\ba().data()),\n+99 decltype(std::declval().size()),\n+100 typename std::decay_t::value_type>>>{\n+101 private:\n+102 template\n+103 using hasResizeOp = decltype(std::declval().resize(0));\n+104\n+105 protected:\n+106 friend auto getMPIData(T&);\n+_\b1_\b0_\b7 _\bM_\bP_\bI_\bD_\ba_\bt_\ba(T& t)\n+108 : _\bd_\ba_\bt_\ba_\b_(t)\n+109 {}\n+110 public:\n+_\b1_\b1_\b1 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_\b2 void* _\bp_\bt_\br() {\n+113 return (void*) _\bd_\ba_\bt_\ba_\b_.data();\n+114 }\n+_\b1_\b1_\b5 int _\bs_\bi_\bz_\be() {\n+116 return _\bd_\ba_\bt_\ba_\b_.size();\n+117 }\n+_\b1_\b1_\b8 MPI_Datatype _\bt_\by_\bp_\be() const{\n+119 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+120 }\n+121\n+122 template\n+_\b1_\b2_\b3 auto /*void*/ _\br_\be_\bs_\bi_\bz_\be(int _\bs_\bi_\bz_\be)\n+124 -> std::enable_if_t::value || !Std::\n+is_detected_v>\n+125 {\n+126 _\bd_\ba_\bt_\ba_\b_.resize(_\bs_\bi_\bz_\be);\n+127 }\n+128\n+129 protected:\n+_\b1_\b3_\b0 T& _\bd_\ba_\bt_\ba_\b_;\n+131 };\n+132\n+133}\n+134\n+139#endif\n+140#endif\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+_\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:_\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:43\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:50\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:53\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:71\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:60\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:67\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:65\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:55\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:89\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:80\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:86\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:83\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:90\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:107\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:112\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:115\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:130\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:123\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:118\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/a00233.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00233.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: conditional.hh File Reference\n+dune-common: future.hh File Reference\n \n \n \n \n \n \n \n@@ -65,39 +65,48 @@\n \n \n \n \n \n \n \n
    \n \n-
    conditional.hh File Reference
    \n+Classes |\n+Namespaces
    \n+
    future.hh File Reference
    \n \n
    \n-\n+
    #include <memory>
    \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+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::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-Functions

    template<typename T1 , typename T2 >
    const T1 Dune::cond (bool b, const T1 &v1, const T2 &v2)
     conditional evaluate
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,20 +1,33 @@\n dune-common\u00a02.9.0\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-conditional.hh File Reference\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/_\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:_\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\n+\u00a0 invalid future. A future is valid until get() 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+\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+\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+\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-const T1\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bd (bool b, const T1 &v1, const T2 &v2)\n-\u00a0 conditional evaluate\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/a00233_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: conditional.hh Source File\n+dune-common: future.hh Source File\n \n \n \n \n \n \n \n@@ -70,42 +70,254 @@\n \n \n \n \n \n \n \n
    \n-
    conditional.hh
    \n+
    future.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_CONDITIONAL_HH
    \n-
    4#define DUNE_COMMON_CONDITIONAL_HH
    \n-
    5
    \n-
    6namespace Dune
    \n-
    7{
    \n-
    8
    \n-
    27 template<typename T1, typename T2>
    \n-
    \n-
    28 const T1 cond(bool b, const T1 & v1, const T2 & v2)
    \n-
    29 {
    \n-
    30 return (b ? v1 : v2);
    \n-
    31 }
    \n-
    \n-
    32
    \n-
    33} // end namespace Dune
    \n-
    34
    \n-
    35#endif // DUNE_COMMON_CONDITIONAL_HH
    \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 (C) 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+
    7
    \n+
    8#include <memory>
    \n+\n+
    10
    \n+
    11namespace Dune{
    \n+
    12
    \n+
    \n+\n+
    18 {};
    \n+
    \n+
    19
    \n+
    20 // forward declaration
    \n+
    21 template<class T>
    \n+
    22 class PseudoFuture;
    \n+
    23
    \n+
    27 template<class T>
    \n+
    \n+
    28 class Future{
    \n+
    29 // Future interface:
    \n+
    30 class FutureBase{
    \n+
    31 public:
    \n+
    32 virtual ~FutureBase() = default;
    \n+
    33 virtual void wait() = 0;
    \n+
    34 virtual bool ready() const = 0;
    \n+
    35 virtual bool valid() const = 0;
    \n+
    36 virtual T get() = 0;
    \n+
    37 };
    \n+
    38
    \n+
    39 // model class
    \n+
    40 template<class F>
    \n+
    41 class FutureModel
    \n+
    42 : public FutureBase
    \n+
    43 {
    \n+
    44 F _future;
    \n+
    45 public:
    \n+
    46 FutureModel(F&& f)
    \n+
    47 : _future(std::forward<F>(f))
    \n+
    48 {}
    \n+
    49
    \n+
    50 virtual void wait() override
    \n+
    51 {
    \n+
    52 _future.wait();
    \n+
    53 }
    \n+
    54
    \n+
    55 virtual bool ready() const override
    \n+
    56 {
    \n+
    57 return _future.ready();
    \n+
    58 }
    \n+
    59
    \n+
    60 virtual bool valid() const override
    \n+
    61 {
    \n+
    62 return _future.valid();
    \n+
    63 }
    \n+
    64
    \n+
    65 virtual T get() override{
    \n+
    66 return (T)_future.get();
    \n+
    67 }
    \n+
    68 };
    \n+
    69
    \n+
    70 std::unique_ptr<FutureBase> _future;
    \n+
    71 public:
    \n+
    72 template<class F>
    \n+
    \n+
    73 Future(F&& f)
    \n+
    74 : _future(std::make_unique<FutureModel<F>>(std::forward<F>(f)))
    \n+
    75 {}
    \n+
    \n+
    76
    \n+
    77 template<class U, std::enable_if_t<std::is_same<U,T>::value && !std::is_same<T,void>::value>>
    \n+
    \n+
    78 Future(U&& data)
    \n+
    79 : _future(std::make_unique<FutureModel<PseudoFuture<T>>>(PseudoFuture<T>(std::forward<U>(data))))
    \n+
    80 {}
    \n+
    \n+
    81
    \n+
    82 Future() = default;
    \n+
    83
    \n+
    \n+
    87 void wait(){
    \n+
    88 _future->wait();
    \n+
    89 }
    \n+
    \n+
    90
    \n+
    \n+
    95 T get() {
    \n+
    96 return _future->get();
    \n+
    97 }
    \n+
    \n+
    98
    \n+
    \n+
    103 bool ready() const {
    \n+
    104 return _future->ready();
    \n+
    105 }
    \n+
    \n+
    106
    \n+
    \n+
    112 bool valid() const {
    \n+
    113 if(_future)
    \n+
    114 return _future->valid();
    \n+
    115 return false;
    \n+
    116 }
    \n+
    \n+
    117 };
    \n+
    \n+
    118
    \n+
    121 template<class T>
    \n+
    \n+\n+
    123 bool valid_;
    \n+
    124 T data_;
    \n+
    125 public:
    \n+
    \n+\n+
    127 valid_(false)
    \n+
    128 {}
    \n+
    \n+
    129
    \n+
    130 template<class U>
    \n+
    \n+\n+
    132 valid_(true),
    \n+
    133 data_(std::forward<U>(u))
    \n+
    134 {}
    \n+
    \n+
    135
    \n+
    \n+
    136 void wait() {
    \n+
    137 if(!valid_)
    \n+
    138 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    139 }
    \n+
    \n+
    140
    \n+
    \n+
    141 bool ready() const {
    \n+
    142 if(!valid_)
    \n+
    143 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    144 return true;
    \n+
    145 }
    \n+
    \n+
    146
    \n+
    \n+
    147 T get() {
    \n+
    148 if(!valid_)
    \n+
    149 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    150 valid_ = false;
    \n+
    151 return std::forward<T>(data_);
    \n+
    152 }
    \n+
    \n+
    153
    \n+
    \n+
    154 bool valid() const {
    \n+
    155 return valid_;
    \n+
    156 }
    \n+
    \n+
    157 };
    \n+
    \n+
    158
    \n+
    159 template<>
    \n+
    \n+
    160 class PseudoFuture<void>{
    \n+
    161 bool valid_;
    \n+
    162 public:
    \n+
    \n+
    163 PseudoFuture(bool valid = false) :
    \n+
    164 valid_(valid)
    \n+
    165 {}
    \n+
    \n+
    166
    \n+
    \n+
    167 void wait(){
    \n+
    168 if(!valid_)
    \n+
    169 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    170 }
    \n+
    \n+
    \n+
    171 bool ready() const{
    \n+
    172 if(!valid_)
    \n+
    173 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    174 return true;
    \n+
    175 }
    \n+
    \n+
    176
    \n+
    \n+
    177 void get(){
    \n+
    178 if(!valid_)
    \n+
    179 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
    \n+
    180 valid_ = false;
    \n+
    181 }
    \n+
    \n+
    182
    \n+
    \n+
    183 bool valid() const{
    \n+
    184 return valid_;
    \n+
    185 }
    \n+
    \n+
    186 };
    \n+
    \n+
    187}
    \n+
    188
    \n+
    189#endif
    \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-
    const T1 cond(bool b, const T1 &v1, const T2 &v2)
    conditional evaluate
    Definition conditional.hh:28
    \n+
    Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
    Definition propertymap.hh:84
    \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:18
    \n+
    A wrapper-class for a object which is ready immediately.
    Definition future.hh:122
    \n+
    bool ready() const
    Definition future.hh:141
    \n+
    T get()
    Definition future.hh:147
    \n+
    PseudoFuture(U &&u)
    Definition future.hh:131
    \n+
    PseudoFuture()
    Definition future.hh:126
    \n+
    void wait()
    Definition future.hh:136
    \n+
    bool valid() const
    Definition future.hh:154
    \n+
    Type-erasure for future-like objects. A future-like object is a object satisfying the interface of Fu...
    Definition future.hh:28
    \n+
    bool ready() const
    Definition future.hh:103
    \n+
    void wait()
    wait until the future is ready
    Definition future.hh:87
    \n+
    Future(U &&data)
    Definition future.hh:78
    \n+
    T get()
    Waits until the future is ready and returns the resulting value.
    Definition future.hh:95
    \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:112
    \n+
    Future(F &&f)
    Definition future.hh:73
    \n+
    bool ready() const
    Definition future.hh:171
    \n+
    bool valid() const
    Definition future.hh:183
    \n+
    void get()
    Definition future.hh:177
    \n+
    PseudoFuture(bool valid=false)
    Definition future.hh:163
    \n+
    void wait()
    Definition future.hh:167
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-us-ascii\n+utf-8\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,264 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-conditional.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// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_CONDITIONAL_HH\n-4#define DUNE_COMMON_CONDITIONAL_HH\n-5\n-6namespace _\bD_\bu_\bn_\be\n-7{\n-8\n-27 template\n-_\b2_\b8 const T1 _\bc_\bo_\bn_\bd(bool b, const T1 & v1, const T2 & v2)\n-29 {\n-30 return (b ? v1 : v2);\n-31 }\n-32\n-33} // end namespace Dune\n-34\n-35#endif // DUNE_COMMON_CONDITIONAL_HH\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+7\n+8#include \n+9#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+10\n+11namespace _\bD_\bu_\bn_\be{\n+12\n+_\b1_\b7 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+18 {};\n+19\n+20 // forward declaration\n+21 template\n+22 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be;\n+23\n+27 template\n+_\b2_\b8 class _\bF_\bu_\bt_\bu_\br_\be{\n+29 // Future interface:\n+30 class FutureBase{\n+31 public:\n+32 virtual ~FutureBase() = default;\n+33 virtual void wait() = 0;\n+34 virtual bool ready() const = 0;\n+35 virtual bool valid() const = 0;\n+36 virtual T _\bg_\be_\bt() = 0;\n+37 };\n+38\n+39 // model class\n+40 template\n+41 class FutureModel\n+42 : public FutureBase\n+43 {\n+44 F _future;\n+45 public:\n+46 FutureModel(F&& f)\n+47 : _future(std::forward(f))\n+48 {}\n+49\n+50 virtual void wait() override\n+51 {\n+52 _future.wait();\n+53 }\n+54\n+55 virtual bool ready() const override\n+56 {\n+57 return _future.ready();\n+58 }\n+59\n+60 virtual bool valid() const override\n+61 {\n+62 return _future.valid();\n+63 }\n+64\n+65 virtual T _\bg_\be_\bt() override{\n+66 return (T)_future.get();\n+67 }\n+68 };\n+69\n+70 std::unique_ptr _future;\n+71 public:\n+72 template\n+_\b7_\b3 _\bF_\bu_\bt_\bu_\br_\be(F&& f)\n+74 : _future(_\bs_\bt_\bd::make_unique>(_\bs_\bt_\bd::forward(f)))\n+75 {}\n+76\n+77 template::value && !std::\n+is_same::value>>\n+_\b7_\b8 _\bF_\bu_\bt_\bu_\br_\be(U&& data)\n+79 : _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+80 {}\n+81\n+_\b8_\b2 _\bF_\bu_\bt_\bu_\br_\be() = default;\n+83\n+_\b8_\b7 void _\bw_\ba_\bi_\bt(){\n+88 _future->wait();\n+89 }\n+90\n+_\b9_\b5 T _\bg_\be_\bt() {\n+96 return _future->get();\n+97 }\n+98\n+_\b1_\b0_\b3 bool _\br_\be_\ba_\bd_\by() const {\n+104 return _future->ready();\n+105 }\n+106\n+_\b1_\b1_\b2 bool _\bv_\ba_\bl_\bi_\bd() const {\n+113 if(_future)\n+114 return _future->valid();\n+115 return false;\n+116 }\n+117 };\n+118\n+121 template\n+_\b1_\b2_\b2 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n+123 bool valid_;\n+124 T data_;\n+125 public:\n+_\b1_\b2_\b6 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be() :\n+127 valid_(false)\n+128 {}\n+129\n+130 template\n+_\b1_\b3_\b1 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(U&& u) :\n+132 valid_(true),\n+133 data_(_\bs_\bt_\bd::forward(u))\n+134 {}\n+135\n+_\b1_\b3_\b6 void _\bw_\ba_\bi_\bt() {\n+137 if(!valid_)\n+138 _\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+139 }\n+140\n+_\b1_\b4_\b1 bool _\br_\be_\ba_\bd_\by() const {\n+142 if(!valid_)\n+143 _\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+144 return true;\n+145 }\n+146\n+_\b1_\b4_\b7 T _\bg_\be_\bt() {\n+148 if(!valid_)\n+149 _\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+150 valid_ = false;\n+151 return std::forward(data_);\n+152 }\n+153\n+_\b1_\b5_\b4 bool _\bv_\ba_\bl_\bi_\bd() const {\n+155 return valid_;\n+156 }\n+157 };\n+158\n+159 template<>\n+_\b1_\b6_\b0 class _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be{\n+161 bool valid_;\n+162 public:\n+_\b1_\b6_\b3 _\bP_\bs_\be_\bu_\bd_\bo_\bF_\bu_\bt_\bu_\br_\be(bool _\bv_\ba_\bl_\bi_\bd = false) :\n+164 valid_(_\bv_\ba_\bl_\bi_\bd)\n+165 {}\n+166\n+_\b1_\b6_\b7 void _\bw_\ba_\bi_\bt(){\n+168 if(!valid_)\n+169 _\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+170 }\n+_\b1_\b7_\b1 bool _\br_\be_\ba_\bd_\by() const{\n+172 if(!valid_)\n+173 _\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+174 return true;\n+175 }\n+176\n+_\b1_\b7_\b7 void _\bg_\be_\bt(){\n+178 if(!valid_)\n+179 _\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+180 valid_ = false;\n+181 }\n+182\n+_\b1_\b8_\b3 bool _\bv_\ba_\bl_\bi_\bd() const{\n+184 return valid_;\n+185 }\n+186 };\n+187}\n+188\n+189#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__\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:_\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:_\bg_\be_\bt\n+Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const\n+Key &key)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:84\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:18\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:122\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:141\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:147\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:131\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:126\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:136\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:154\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:28\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:103\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:87\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:78\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:95\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:112\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:73\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:171\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:183\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:177\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:163\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:167\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/a00236.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00236.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: tuplevector.hh File Reference\n+dune-common: communicator.hh File Reference\n \n \n \n \n \n \n \n@@ -65,57 +65,73 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    tuplevector.hh File Reference
    \n+Namespaces
    \n+ \n \n
    \n \n-

    Provides the TupleVector class that augments std::tuple by operator[]. \n+

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

    \n-
    #include <tuple>
    \n+
    #include <cassert>
    \n+#include <cstddef>
    \n+#include <iostream>
    \n+#include <map>
    \n+#include <type_traits>
    \n #include <utility>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/std/type_traits.hh>
    \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 \n

    \n Classes

    class  Dune::TupleVector< T >
     A class augmenting std::tuple by element access via operator[]. More...
    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-Functions

    template<class... T>
    constexpr auto Dune::makeTupleVector (T &&... t)
     
    \n

    Detailed Description

    \n-

    Provides the TupleVector class that augments std::tuple by operator[].

    \n-
    Author
    Carsten Gr\u00e4ser
    \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,33 +1,59 @@\n dune-common\u00a02.9.0\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-tuplevector.hh File Reference\n-Provides the TupleVector class that augments std::tuple by operator[]. _\bM_\bo_\br_\be_\b._\b._\b.\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 <_\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/_\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 \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 _\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:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 A class augmenting std::tuple by element access via operator[]. _\bM_\bo_\br_\be_\b._\b._\b.\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-template\n-constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br (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-Provides the TupleVector class that augments std::tuple by operator[].\n+Provides utility classes for syncing distributed data via MPI communication.\n Author\n- Carsten Gr\u00c3\u00a4ser\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/a00236_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: tuplevector.hh Source File\n+dune-common: communicator.hh Source File\n \n \n \n \n \n \n \n@@ -70,124 +70,1040 @@\n
    \n
    \n \n \n \n \n \n
    \n-
    tuplevector.hh
    \n+
    communicator.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 (C) 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_TUPLEVECTOR_HH
    \n-
    6#define DUNE_COMMON_TUPLEVECTOR_HH
    \n+
    5#ifndef DUNE_COMMUNICATOR
    \n+
    6#define DUNE_COMMUNICATOR
    \n
    7
    \n-
    8#include <tuple>
    \n-
    9#include <utility>
    \n-
    10
    \n-\n-\n-\n-
    14
    \n-
    15
    \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-
    23namespace Dune
    \n-
    24{
    \n-
    25
    \n-
    26
    \n-
    27
    \n-
    33template<class... T>
    \n-
    \n-
    34class TupleVector : public std::tuple<T...>
    \n-
    35{
    \n-
    36 using Base = std::tuple<T...>;
    \n-
    37
    \n-
    38 template<class... TT>
    \n-
    39 using TupleConstructorDetector = decltype(Base(std::declval<TT&&>()...));
    \n-
    40
    \n-
    41 template<class... TT>
    \n-
    42 using hasTupleConstructor = Dune::Std::is_detected<TupleConstructorDetector, TT...>;
    \n-
    43
    \n-
    44
    \n-
    45public:
    \n-
    46
    \n-
    53 template<class... TT,
    \n-
    54 std::enable_if_t<hasTupleConstructor<TT...>::value, int> = 0>
    \n-
    \n-
    55 constexpr TupleVector(TT&&... tt) :
    \n-
    56 Base(std::forward<TT>(tt)...)
    \n-
    57 {}
    \n-
    \n-
    58
    \n-
    \n-
    61 constexpr TupleVector()
    \n-
    62 {}
    \n-
    \n-
    63
    \n-
    66 template<std::size_t i>
    \n-
    \n-
    67 constexpr decltype(auto) operator[](const Dune::index_constant<i>&) const
    \n-
    68 {
    \n-
    69 return std::get<i>(*this);
    \n-
    70 }
    \n-
    \n-
    71
    \n-
    74 template<std::size_t i>
    \n-
    \n-
    75 decltype(auto) operator[](const Dune::index_constant<i>&)
    \n-
    76 {
    \n-
    77 return std::get<i>(*this);
    \n-
    78 }
    \n-
    \n-
    79
    \n-
    \n-
    81 static constexpr std::size_t size()
    \n-
    82 {
    \n-
    83 return std::tuple_size<Base>::value;
    \n-
    84 }
    \n-
    \n-
    85};
    \n-
    \n-
    86
    \n-
    87
    \n-
    88
    \n-
    89template<class... T>
    \n-
    \n-
    90constexpr auto makeTupleVector(T&&... t)
    \n-
    91{
    \n-
    92 // The std::decay_t<T> is is a slight simplification,
    \n-
    93 // because std::reference_wrapper needs special care.
    \n-
    94 return TupleVector<std::decay_t<T>...>(std::forward<T>(t)...);
    \n-
    95}
    \n-
    \n-
    96
    \n-
    97
    \n-
    98
    \n-
    99} // namespace Dune
    \n-
    100
    \n-
    101#endif // DUNE_COMMON_TUPLEVECTOR_HH
    \n-\n-\n-
    Traits for type conversions and type information.
    \n-
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:30
    \n-
    typename detected_or< nonesuch, Op, Args... >::value_t is_detected
    Detects whether Op<Args...> is valid.
    Definition type_traits.hh:141
    \n-
    STL namespace.
    \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+
    \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+
    172
    \n+
    173 template<class K, int n> class FieldVector;
    \n+
    174
    \n+
    175 template<class B, class A> class VariableBlockVector;
    \n+
    176
    \n+
    177 template<class K, class A, int n>
    \n+
    \n+\n+
    179 {
    \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
    \n+
    1534#endif
    \n+
    Classes describing a distributed indexset.
    \n+
    Standard Dune debug streams.
    \n+
    A few common exception classes.
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    DVVerbType dvverb(std::cout)
    stream for very verbose output.
    Definition stdstreams.hh:95
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    constexpr auto makeTupleVector(T &&... t)
    Definition tuplevector.hh:90
    \n-
    A class augmenting std::tuple by element access via operator[].
    Definition tuplevector.hh:35
    \n-
    static constexpr std::size_t size()
    Number of elements of the tuple.
    Definition tuplevector.hh:81
    \n-
    constexpr TupleVector(TT &&... tt)
    Construct from a set of arguments.
    Definition tuplevector.hh:55
    \n-
    constexpr TupleVector()
    Default constructor.
    Definition tuplevector.hh:61
    \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:35
    \n+
    Information describing an interface.
    Definition parallel/interface.hh:101
    \n+
    Communication interface between remote and local indices.
    Definition parallel/interface.hh:209
    \n+
    An index present on the local process.
    Definition localindex.hh:35
    \n+
    The indices present on remote processes.
    Definition remoteindices.hh:189
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:215
    \n+
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:226
    \n+
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:221
    \n+
    Provides classes for building the communication interface between remote indices.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,124 +1,1202 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-tuplevector.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+communicator.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 (C) 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_TUPLEVECTOR_HH\n-6#define DUNE_COMMON_TUPLEVECTOR_HH\n+5#ifndef DUNE_COMMUNICATOR\n+6#define DUNE_COMMUNICATOR\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/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n-13#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-14\n-15\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-23namespace _\bD_\bu_\bn_\be\n-24{\n-25\n-26\n-27\n-33template\n-_\b3_\b4class _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br : public std::tuple\n-35{\n-36 using Base = std::tuple;\n-37\n-38 template\n-39 using TupleConstructorDetector = decltype(Base(std::declval()...));\n-40\n-41 template\n-42 using hasTupleConstructor = _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd;\n-43\n-44\n-45public:\n-46\n-53 template::value, int> = 0>\n-_\b5_\b5 constexpr _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br(TT&&... tt) :\n-56 Base(_\bs_\bt_\bd::forward(tt)...)\n-57 {}\n-58\n-_\b6_\b1 constexpr _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br()\n-62 {}\n-63\n-66 template\n-_\b6_\b7 constexpr decltype(auto) operator[](const _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>&) const\n-68 {\n-69 return std::get(*this);\n-70 }\n-71\n-74 template\n-_\b7_\b5 decltype(auto) operator[](const _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>&)\n-76 {\n-77 return std::get(*this);\n-78 }\n-79\n-_\b8_\b1 static constexpr std::size_t _\bs_\bi_\bz_\be()\n-82 {\n-83 return std::tuple_size::value;\n-84 }\n-85};\n-86\n-87\n-88\n-89template\n-_\b9_\b0constexpr auto _\bm_\ba_\bk_\be_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br(T&&... t)\n-91{\n-92 // The std::decay_t is is a slight simplification,\n-93 // because std::reference_wrapper needs special care.\n-94 return _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>...>(std::forward(t)...);\n-95}\n-96\n-97\n-98\n-99} // namespace Dune\n-100\n-101#endif // DUNE_COMMON_TUPLEVECTOR_HH\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\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:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n-std::integral_constant< std::size_t, i > index_constant\n-An index constant with value i.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:30\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:141\n-_\bs_\bt_\bd\n-STL namespace.\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+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+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+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+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 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 >\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 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::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 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 _\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\n+1534#endif\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+_\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:_\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:95\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_\ba_\bk_\be_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n-constexpr auto makeTupleVector(T &&... t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n-A class augmenting std::tuple by element access via operator[].\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n-static constexpr std::size_t size()\n-Number of elements of the tuple.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n-constexpr TupleVector(TT &&... tt)\n-Construct from a set of arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n-constexpr TupleVector()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:61\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:35\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:101\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:209\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:189\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:215\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:226\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:221\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 ===============================================================================\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/a00239.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00239.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: arraylist.hh File Reference\n+dune-common: mpihelper.hh File Reference\n \n \n \n \n \n \n \n@@ -65,56 +65,72 @@\n \n \n \n \n \n \n \n
    \n \n-
    arraylist.hh File Reference
    \n+
    mpihelper.hh File Reference
    \n
    \n
    \n \n-

    Implements a random-access container that can efficiently change size (similar to std::deque) \n+

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

    \n-
    #include <array>
    \n-#include <cassert>
    \n-#include <memory>
    \n-#include <vector>
    \n-#include "iteratorfacades.hh"
    \n+
    #include <cassert>
    \n+#include <mpi.h>
    \n+#include <mutex>
    \n+#include <dune/common/parallel/communication.hh>
    \n+#include <dune/common/parallel/mpicommunication.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/visibility.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

    class  Dune::ArrayList< T, N, A >
     A dynamically growing random access list. More...
    class  Dune::FakeMPIHelper
     A fake mpi helper. More...
     
    class  Dune::ArrayListIterator< T, N, A >
     A random access iterator for the Dune::ArrayList class. More...
     
    class  Dune::ConstArrayListIterator< T, N, A >
     A constant random access iterator for the Dune::ArrayList class. More...
    class  Dune::MPIHelper
     A real mpi helper. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    Implements a random-access container that can efficiently change size (similar to std::deque)

    \n-

    This file implements the class ArrayList which behaves like dynamically growing array together with the class ArrayListIterator which is random access iterator as needed by the stl for sorting and other algorithms.

    Author
    Markus Blatt
    \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:293
    \n+
    A real mpi helper.
    Definition mpihelper.hh:179
    \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,41 +1,62 @@\n dune-common\u00a02.9.0\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-arraylist.hh File Reference\n-Implements a random-access container that can efficiently change size (similar\n-to std::deque) _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \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 \"_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh\"\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/_\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/_\bv_\bi_\bs_\bi_\bb_\bi_\bl_\bi_\bt_\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:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b,_\b _\bN_\b,_\b _\bA_\b _\b>\n-\u00a0 A dynamically growing random access list. _\bM_\bo_\br_\be_\b._\b._\b.\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:_\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>\n-\u00a0 A random access iterator for the _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt class. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\bN_\b,_\b _\bA_\b _\b>\n-\u00a0 A constant random access iterator for the _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt class.\n- _\bM_\bo_\br_\be_\b._\b._\b.\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-Implements a random-access container that can efficiently change size (similar\n-to std::deque)\n-This file implements the class ArrayList which behaves like dynamically growing\n-array together with the class ArrayListIterator which is random access iterator\n-as needed by the stl for sorting and other algorithms.\n- Author\n- Markus Blatt\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:293\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:179\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/a00239_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: arraylist.hh Source File\n+dune-common: mpihelper.hh Source File\n \n \n \n \n \n \n \n@@ -70,627 +70,267 @@\n
    \n
    \n \n \n \n \n \n
    \n-
    arraylist.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 (C) 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_ARRAYLIST_HH
    \n-
    7#define DUNE_COMMON_ARRAYLIST_HH
    \n-
    8
    \n-
    9#include <array>
    \n-
    10#include <cassert>
    \n-
    11#include <memory>
    \n-
    12#include <vector>
    \n-
    13#include "iteratorfacades.hh"
    \n+
    5#ifndef DUNE_MPIHELPER
    \n+
    6#define DUNE_MPIHELPER
    \n+
    7
    \n+
    8#if HAVE_MPI
    \n+
    9#include <cassert>
    \n+
    10#include <mpi.h>
    \n+
    11#endif
    \n+
    12
    \n+
    13#include <mutex>
    \n
    14
    \n-
    15namespace Dune
    \n-
    16{
    \n-
    17 // forward declaration
    \n-
    18 template<class T, int N, class A>
    \n-
    19 class ArrayListIterator;
    \n-
    20
    \n-
    21 template<class T, int N, class A>
    \n-
    22 class ConstArrayListIterator;
    \n-
    23
    \n-
    60 template<class T, int N=100, class A=std::allocator<T> >
    \n-
    \n-\n-
    62 {
    \n-
    63 public:
    \n-
    69 typedef T MemberType;
    \n-
    70
    \n-
    74 typedef T value_type;
    \n-
    75
    \n-
    79 typedef T& reference;
    \n-
    80
    \n-
    84 typedef const T& const_reference;
    \n-
    85
    \n-
    89 typedef T* pointer;
    \n-
    90
    \n-
    94 typedef const T* const_pointer;
    \n-
    95
    \n-
    100 constexpr static int chunkSize_ = (N > 0) ? N : 1;
    \n-
    101
    \n-\n-
    106
    \n-\n+\n+
    16#if HAVE_MPI
    \n+\n+\n+
    19#endif
    \n+\n+
    21
    \n+
    22namespace Dune
    \n+
    23{
    \n+
    \n+\n+
    74 {
    \n+
    75 public:
    \n+
    80 constexpr static bool isFake = true;
    \n+
    81
    \n+\n+
    86
    \n+
    \n+\n+
    94 {
    \n+
    95 static MPICommunicator comm;
    \n+
    96 return comm;
    \n+
    97 }
    \n+
    \n+
    98
    \n+
    \n+\n+
    106 {
    \n+
    107 return getCommunicator();
    \n+
    108 }
    \n+
    \n+
    109
    \n+
    110
    \n
    111
    \n-
    115 typedef std::size_t size_type;
    \n-
    116
    \n-
    120 typedef std::ptrdiff_t difference_type;
    \n-
    121
    \n-
    \n-\n-
    127
    \n-
    \n-\n-
    134
    \n-
    \n-\n-
    140
    \n-
    \n-\n-
    146
    \n-
    \n-
    151 inline void push_back(const_reference entry);
    \n-
    152
    \n-
    \n-\n-
    159
    \n-
    \n-\n-
    166
    \n-
    \n-
    171 inline size_type size() const;
    \n-
    172
    \n-
    \n-
    180 inline void purge();
    \n-
    181
    \n-
    \n-
    185 inline void clear();
    \n-
    \n-\n-
    190
    \n-
    191 private:
    \n-
    192
    \n-
    196 using SmartPointerAllocator = typename std::allocator_traits<A>::template rebind_alloc< std::shared_ptr< std::array<MemberType,chunkSize_> > >;
    \n-
    197
    \n-
    201 using ArrayAllocator = typename std::allocator_traits<A>::template rebind_alloc< std::array<MemberType,chunkSize_> >;
    \n+
    117 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n+\n+
    122
    \n+\n+
    \n+\n+
    125 {
    \n+\n+
    127 }
    \n+
    \n+
    128
    \n+
    \n+
    144 DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc,
    \n+
    145 [[maybe_unused]] char** argv)
    \n+
    146 {
    \n+
    147 return instance();
    \n+
    148 }
    \n+
    \n+
    149
    \n+
    \n+\n+
    151 {
    \n+
    152 static FakeMPIHelper singleton;
    \n+
    153 return singleton;
    \n+
    154 }
    \n+
    \n+
    155
    \n+
    159 int rank () const { return 0; }
    \n+
    163 int size () const { return 1; }
    \n+
    164
    \n+
    165 private:
    \n+
    166 FakeMPIHelper() {}
    \n+
    167 FakeMPIHelper(const FakeMPIHelper&);
    \n+
    168 FakeMPIHelper& operator=(const FakeMPIHelper);
    \n+
    169 };
    \n+
    \n+
    170
    \n+
    171#if HAVE_MPI
    \n+
    \n+\n+
    179 {
    \n+
    180 public:
    \n+
    185 constexpr static bool isFake = false;
    \n+
    186
    \n+
    190 typedef MPI_Comm MPICommunicator;
    \n+
    191
    \n+
    \n+\n+
    199 {
    \n+
    200 return MPI_COMM_WORLD;
    \n+
    201 }
    \n+
    \n
    202
    \n-
    206 friend class ArrayListIterator<T,N,A>;
    \n-
    207 friend class ConstArrayListIterator<T,N,A>;
    \n-
    208
    \n-
    210 std::vector<std::shared_ptr<std::array<MemberType,chunkSize_> >,
    \n-
    211 SmartPointerAllocator> chunks_;
    \n-
    220 size_type capacity_;
    \n-
    222 size_type size_;
    \n-
    224 size_type start_;
    \n-
    233 inline reference elementAt(size_type i);
    \n-
    234
    \n-
    243 inline const_reference elementAt(size_type i) const;
    \n-
    244 };
    \n-
    245
    \n-
    246
    \n-
    250 template<class T, int N, class A>
    \n-
    \n-
    251 class ArrayListIterator : public RandomAccessIteratorFacade<ArrayListIterator<T,N,A>,
    \n-
    252 typename A::value_type,
    \n-
    253 typename A::value_type &,
    \n-
    254 typename A::difference_type>
    \n-
    255 {
    \n-
    256
    \n-
    257 friend class ArrayList<T,N,A>;
    \n-
    258 friend class ConstArrayListIterator<T,N,A>;
    \n-
    259 public:
    \n-
    263 typedef typename A::value_type MemberType;
    \n+
    \n+\n+
    210 {
    \n+
    211 return MPI_COMM_SELF;
    \n+
    212 }
    \n+
    \n+
    213
    \n+
    219 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
    \n+\n+\n+
    225
    \n+\n+
    \n+\n+
    228 {
    \n+\n+
    230 }
    \n+
    \n+
    \n+
    246 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
    \n+
    247 {
    \n+
    248 // create singleton instance
    \n+
    249 if (!instance_){
    \n+
    250 static std::mutex mutex;
    \n+
    251 std::lock_guard<std::mutex> guard(mutex);
    \n+
    252 if(!instance_)
    \n+
    253 instance_.reset(new MPIHelper(argc,argv));
    \n+
    254 }
    \n+
    255 return *instance_;
    \n+
    256 }
    \n+
    \n+
    257
    \n+
    \n+\n+
    259 {
    \n+
    260 if(!instance_)
    \n+
    261 DUNE_THROW(InvalidStateException, "MPIHelper not initialized! Call MPIHelper::instance(argc, argv) with arguments first.");
    \n+
    262 return *instance_;
    \n+
    263 }
    \n+
    \n
    264
    \n-
    265 typedef typename A::difference_type difference_type;
    \n-
    266
    \n-
    267 typedef typename A::size_type size_type;
    \n-
    268
    \n-
    269 using reference = typename A::value_type &;
    \n-
    270
    \n-
    271 using const_reference = typename A::value_type const&;
    \n-
    272
    \n-
    278 constexpr static int chunkSize_ = (N > 0) ? N : 1;
    \n-
    279
    \n-
    280
    \n-
    286 inline bool equals(const ArrayListIterator<MemberType,N,A>& other) const;
    \n-
    287
    \n-
    293 inline bool equals(const ConstArrayListIterator<MemberType,N,A>& other) const;
    \n-
    294
    \n-
    298 inline void increment();
    \n-
    299
    \n-
    303 inline void decrement();
    \n-
    304
    \n-
    309 inline reference elementAt(size_type i) const;
    \n-
    310
    \n-
    315 inline reference dereference() const;
    \n-
    316
    \n-
    328 inline void eraseToHere();
    \n+
    268 int rank () const { return rank_; }
    \n+
    272 int size () const { return size_; }
    \n+
    273
    \n+
    \n+\n+
    276 {
    \n+
    277 int wasFinalized = -1;
    \n+
    278 MPI_Finalized( &wasFinalized );
    \n+
    279 if(!wasFinalized && initializedHere_)
    \n+
    280 {
    \n+
    281 MPI_Finalize();
    \n+
    282 dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
    \n+
    283 }
    \n+
    284
    \n+
    285 }
    \n+
    \n+
    286
    \n+
    287 private:
    \n+
    288 int rank_;
    \n+
    289 int size_;
    \n+
    290 bool initializedHere_;
    \n+
    291 void prevent_warning(int){}
    \n+
    292 static inline std::unique_ptr<MPIHelper> instance_ = {};
    \n+
    293
    \n+
    295 MPIHelper(int& argc, char**& argv)
    \n+
    296 : initializedHere_(false)
    \n+
    297 {
    \n+
    298 int wasInitialized = -1;
    \n+
    299 MPI_Initialized( &wasInitialized );
    \n+
    300 if(!wasInitialized)
    \n+
    301 {
    \n+
    302 rank_ = -1;
    \n+
    303 size_ = -1;
    \n+
    304 static int is_initialized = MPI_Init(&argc, &argv);
    \n+
    305 prevent_warning(is_initialized);
    \n+
    306 initializedHere_ = true;
    \n+
    307 }
    \n+
    308
    \n+
    309 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
    \n+
    310 MPI_Comm_size(MPI_COMM_WORLD,&size_);
    \n+
    311
    \n+
    312 assert( rank_ >= 0 );
    \n+
    313 assert( size_ >= 1 );
    \n+
    314
    \n+
    315 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
    \n+
    316 }
    \n+
    317
    \n+
    318 MPIHelper(const MPIHelper&);
    \n+
    319 MPIHelper& operator=(const MPIHelper);
    \n+
    320 };
    \n+
    \n+
    321#else // !HAVE_MPI
    \n+
    322 // We do not have MPI therefore FakeMPIHelper
    \n+
    323 // is the MPIHelper
    \n+
    328 typedef FakeMPIHelper MPIHelper;
    \n
    329
    \n-
    331 inline size_type position(){return position_;}
    \n-
    332
    \n-
    334 inline void advance(difference_type n);
    \n-
    335
    \n-
    337 inline difference_type distanceTo(const ArrayListIterator<T,N,A>& other) const;
    \n-
    338
    \n-
    \n-
    340 inline ArrayListIterator() : position_(0), list_(nullptr)
    \n-
    341 {}
    \n-
    \n-
    342
    \n-
    343 private:
    \n-\n-
    350
    \n-
    354 size_type position_;
    \n-\n-
    359 };
    \n-
    \n-
    360
    \n-
    364 template<class T, int N, class A>
    \n-
    \n-\n-
    366 : public RandomAccessIteratorFacade<ConstArrayListIterator<T,N,A>,
    \n-
    367 const typename A::value_type,
    \n-
    368 typename A::value_type const&,
    \n-
    369 typename A::difference_type>
    \n-
    370 {
    \n-
    371
    \n-
    372 friend class ArrayList<T,N,A>;
    \n-
    373 friend class ArrayListIterator<T,N,A>;
    \n-
    374
    \n-
    375 public:
    \n-
    379 typedef typename A::value_type MemberType;
    \n-
    380
    \n-
    381 typedef typename A::difference_type difference_type;
    \n-
    382
    \n-
    383 typedef typename A::size_type size_type;
    \n-
    384
    \n-
    385 using reference = typename A::value_type &;
    \n-
    386
    \n-
    387 using const_reference = typename A::value_type const&;
    \n-
    388
    \n-
    394 constexpr static int chunkSize_ = (N > 0) ? N : 1;
    \n-
    395
    \n-
    \n-
    401 inline bool equals(const ConstArrayListIterator<MemberType,N,A>& other) const;
    \n-
    402
    \n-
    \n-
    406 inline void increment();
    \n-
    407
    \n-
    \n-
    411 inline void decrement();
    \n-
    412
    \n-
    \n-
    414 inline void advance(difference_type n);
    \n-
    415
    \n-
    \n-\n-
    418
    \n-
    \n-\n-
    424
    \n-
    \n-\n-
    430
    \n-
    \n-
    431 inline ConstArrayListIterator() : position_(0), list_(nullptr)
    \n-
    432 {}
    \n-
    \n-
    433
    \n-
    \n-\n-
    435
    \n-
    436 private:
    \n-
    437
    \n-
    443 inline ConstArrayListIterator(const ArrayList<T,N,A>& arrayList, size_type position);
    \n-
    444
    \n-
    448 size_type position_;
    \n-
    452 const ArrayList<T,N,A>* list_;
    \n-
    453 };
    \n-
    454
    \n-
    455
    \n-
    456 template<class T, int N, class A>
    \n-
    \n-\n-
    458 : capacity_(0), size_(0), start_(0)
    \n-
    459 {
    \n-
    460 chunks_.reserve(100);
    \n-
    461 }
    \n-
    \n-
    462
    \n-
    463 template<class T, int N, class A>
    \n-
    \n-\n-
    465 capacity_=0;
    \n-
    466 size_=0;
    \n-
    467 start_=0;
    \n-
    468 chunks_.clear();
    \n-
    469 }
    \n-
    \n-
    470
    \n-
    471 template<class T, int N, class A>
    \n-
    \n-\n-
    473 {
    \n-
    474 return size_;
    \n-
    475 }
    \n-
    \n-
    476
    \n-
    477 template<class T, int N, class A>
    \n-
    \n-\n-
    479 {
    \n-
    480 size_t index=start_+size_;
    \n-
    481 if(index==capacity_)
    \n-
    482 {
    \n-
    483 chunks_.push_back(std::make_shared<std::array<MemberType,chunkSize_> >());
    \n-
    484 capacity_ += chunkSize_;
    \n-
    485 }
    \n-
    486 elementAt(index)=entry;
    \n-
    487 ++size_;
    \n-
    488 }
    \n-
    \n-
    489
    \n-
    490 template<class T, int N, class A>
    \n-
    \n-\n-
    492 {
    \n-
    493 return elementAt(start_+i);
    \n-
    494 }
    \n-
    \n-
    495
    \n-
    496
    \n-
    497 template<class T, int N, class A>
    \n-
    \n-\n-
    499 {
    \n-
    500 return elementAt(start_+i);
    \n-
    501 }
    \n-
    \n-
    502
    \n-
    503 template<class T, int N, class A>
    \n-\n-
    505 {
    \n-
    506 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
    \n-
    507 }
    \n-
    508
    \n-
    509
    \n-
    510 template<class T, int N, class A>
    \n-
    511 typename ArrayList<T,N,A>::const_reference ArrayList<T,N,A>::elementAt(size_type i) const
    \n-
    512 {
    \n-
    513 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
    \n-
    514 }
    \n-
    515
    \n-
    516 template<class T, int N, class A>
    \n-
    \n-\n-
    518 {
    \n-
    519 return ArrayListIterator<T,N,A>(*this, start_);
    \n-
    520 }
    \n-
    \n-
    521
    \n-
    522 template<class T, int N, class A>
    \n-
    \n-\n-
    524 {
    \n-
    525 return ConstArrayListIterator<T,N,A>(*this, start_);
    \n-
    526 }
    \n-
    \n-
    527
    \n-
    528 template<class T, int N, class A>
    \n-
    \n-\n-
    530 {
    \n-
    531 return ArrayListIterator<T,N,A>(*this, start_+size_);
    \n-
    532 }
    \n-
    \n-
    533
    \n-
    534 template<class T, int N, class A>
    \n-
    \n-\n-
    536 {
    \n-
    537 return ConstArrayListIterator<T,N,A>(*this, start_+size_);
    \n-
    538 }
    \n-
    \n-
    539
    \n-
    540 template<class T, int N, class A>
    \n-
    \n-\n-
    542 {
    \n-
    543 // Distance to copy to the left.
    \n-
    544 size_t distance = start_/chunkSize_;
    \n-
    545 if(distance>0) {
    \n-
    546 // Number of chunks with entries in it;
    \n-
    547 size_t chunks = ((start_%chunkSize_ + size_)/chunkSize_ );
    \n-
    548
    \n-
    549 // Copy chunks to the left.
    \n-
    550 std::copy(chunks_.begin()+distance,
    \n-
    551 chunks_.begin()+(distance+chunks), chunks_.begin());
    \n-
    552
    \n-
    553 // Calculate new parameters
    \n-
    554 start_ = start_ % chunkSize_;
    \n-
    555 //capacity += distance * chunkSize_;
    \n-
    556 }
    \n-
    557 }
    \n-
    \n-
    558
    \n-
    559 template<class T, int N, class A>
    \n-
    \n-\n-
    561 {
    \n-
    562 position_+=i;
    \n-
    563 }
    \n-
    \n-
    564
    \n-
    565 template<class T, int N, class A>
    \n-
    \n-\n-
    567 {
    \n-
    568 position_+=i;
    \n-
    569 }
    \n-
    \n-
    570
    \n-
    571
    \n-
    572 template<class T, int N, class A>
    \n-
    \n-\n-
    574 {
    \n-
    575 // Makes only sense if we reference a common list
    \n-
    576 assert(list_==(other.list_));
    \n-
    577 return position_==other.position_ ;
    \n-
    578 }
    \n-
    \n-
    579
    \n-
    580
    \n-
    581 template<class T, int N, class A>
    \n-
    \n-\n-
    583 {
    \n-
    584 // Makes only sense if we reference a common list
    \n-
    585 assert(list_==(other.list_));
    \n-
    586 return position_==other.position_ ;
    \n-
    587 }
    \n-
    \n-
    588
    \n-
    589
    \n-
    590 template<class T, int N, class A>
    \n-
    \n-\n-
    592 {
    \n-
    593 // Makes only sense if we reference a common list
    \n-
    594 assert(list_==(other.list_));
    \n-
    595 return position_==other.position_ ;
    \n-
    596 }
    \n-
    \n-
    597
    \n-
    598 template<class T, int N, class A>
    \n-
    \n-\n-
    600 {
    \n-
    601 ++position_;
    \n-
    602 }
    \n-
    \n-
    603
    \n-
    604 template<class T, int N, class A>
    \n-
    \n-\n-
    606 {
    \n-
    607 ++position_;
    \n-
    608 }
    \n-
    \n-
    609
    \n-
    610 template<class T, int N, class A>
    \n-
    \n-\n-
    612 {
    \n-
    613 --position_;
    \n-
    614 }
    \n-
    \n-
    615
    \n-
    616 template<class T, int N, class A>
    \n-
    \n-\n-
    618 {
    \n-
    619 --position_;
    \n-
    620 }
    \n-
    \n-
    621
    \n-
    622 template<class T, int N, class A>
    \n-
    \n-\n-
    624 {
    \n-
    625 return list_->elementAt(i+position_);
    \n-
    626 }
    \n-
    \n-
    627
    \n-
    628 template<class T, int N, class A>
    \n-
    \n-\n-
    630 {
    \n-
    631 return list_->elementAt(i+position_);
    \n-
    632 }
    \n-
    \n-
    633
    \n-
    634 template<class T, int N, class A>
    \n-
    \n-\n-
    636 {
    \n-
    637 return list_->elementAt(position_);
    \n-
    638 }
    \n-
    \n-
    639
    \n-
    640 template<class T, int N, class A>
    \n-
    \n-\n-
    642 {
    \n-
    643 return list_->elementAt(position_);
    \n-
    644 }
    \n-
    \n-
    645
    \n-
    646 template<class T, int N, class A>
    \n-
    \n-\n-
    648 {
    \n-
    649 // Makes only sense if we reference a common list
    \n-
    650 assert(list_==(other.list_));
    \n-
    651 return other.position_ - position_;
    \n-
    652 }
    \n-
    \n-
    653
    \n-
    654 template<class T, int N, class A>
    \n-
    \n-\n-
    656 {
    \n-
    657 // Makes only sense if we reference a common list
    \n-
    658 assert(list_==(other.list_));
    \n-
    659 return other.position_ - position_;
    \n-
    660 }
    \n-
    \n-
    661
    \n-
    662 template<class T, int N, class A>
    \n-
    \n-\n-
    664 {
    \n-
    665 list_->size_ -= ++position_ - list_->start_;
    \n-
    666 // chunk number of the new position.
    \n-
    667 size_t posChunkStart = position_ / chunkSize_;
    \n-
    668 // number of chunks to deallocate
    \n-
    669 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_)
    \n-
    670 / chunkSize_;
    \n-
    671 list_->start_ = position_;
    \n-
    672
    \n-
    673 // Deallocate memory not needed any more.
    \n-
    674 for(size_t chunk=0; chunk<chunks; chunk++) {
    \n-
    675 --posChunkStart;
    \n-
    676 list_->chunks_[posChunkStart].reset();
    \n-
    677 }
    \n-
    678
    \n-
    679 // Capacity stays the same as the chunks before us
    \n-
    680 // are still there. They null pointers.
    \n-
    681 assert(list_->start_+list_->size_<=list_->capacity_);
    \n-
    682 }
    \n-
    \n-
    683
    \n-
    684 template<class T, int N, class A>
    \n-\n-
    686 : position_(position), list_(&arrayList)
    \n-
    687 {}
    \n-
    688
    \n-
    689
    \n-
    690 template<class T, int N, class A>
    \n-
    691 ConstArrayListIterator<T,N,A>::ConstArrayListIterator(const ArrayList<T,N,A>& arrayList,
    \n-
    692 size_type position)
    \n-
    693 : position_(position), list_(&arrayList)
    \n-
    694 {}
    \n-
    695
    \n-
    696 template<class T, int N, class A>
    \n-
    \n-\n-
    698 : position_(other.position_), list_(other.list_)
    \n-
    699 {}
    \n-
    \n-
    \n-
    700
    \n-
    701
    \n-
    703}
    \n-
    704#endif
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    This file implements iterator facade classes for writing stl conformant iterators.
    \n-
    reference operator[](size_type i)
    Get the element at specific position.
    Definition arraylist.hh:491
    \n-
    iterator begin()
    Get an iterator that is positioned at the first element.
    Definition arraylist.hh:517
    \n-
    bool equals(const ArrayListIterator< MemberType, N, A > &other) const
    Comares two iterators.
    Definition arraylist.hh:573
    \n-
    void increment()
    Increment the iterator.
    Definition arraylist.hh:599
    \n-
    size_type size() const
    Get the number of elements in the list.
    Definition arraylist.hh:472
    \n-
    ConstArrayListIterator(const ArrayListIterator< T, N, A > &other)
    Definition arraylist.hh:697
    \n-
    void purge()
    Purge the list.
    Definition arraylist.hh:541
    \n-
    void decrement()
    decrement the iterator.
    Definition arraylist.hh:611
    \n-
    void eraseToHere()
    Erase all entries before the current position and the one at the current position.
    Definition arraylist.hh:663
    \n-
    ArrayList()
    Constructs an Array list with one chunk.
    Definition arraylist.hh:457
    \n-
    const_iterator begin() const
    Get a random access iterator that is positioned at the first element.
    Definition arraylist.hh:523
    \n-
    void increment()
    Increment the iterator.
    Definition arraylist.hh:605
    \n-
    iterator end()
    Get a random access iterator positioned after the last element.
    Definition arraylist.hh:529
    \n-
    const_reference elementAt(size_type i) const
    Get the value of the list at an arbitrary position.
    Definition arraylist.hh:629
    \n-
    const_reference operator[](size_type i) const
    Get the element at specific position.
    Definition arraylist.hh:498
    \n-
    void decrement()
    decrement the iterator.
    Definition arraylist.hh:617
    \n-
    void advance(difference_type n)
    Definition arraylist.hh:566
    \n-
    const_iterator end() const
    Get a random access iterator positioned after the last element.
    Definition arraylist.hh:535
    \n-
    const_reference dereference() const
    Access the element at the current position.
    Definition arraylist.hh:641
    \n-
    void clear()
    Delete all entries from the list.
    Definition arraylist.hh:464
    \n-
    reference elementAt(size_type i) const
    Get the value of the list at an arbitrary position.
    Definition arraylist.hh:623
    \n-
    bool equals(const ConstArrayListIterator< MemberType, N, A > &other) const
    Comares to iterators.
    Definition arraylist.hh:591
    \n-
    void advance(difference_type n)
    Definition arraylist.hh:560
    \n-
    difference_type distanceTo(const ConstArrayListIterator< T, N, A > &other) const
    Definition arraylist.hh:655
    \n-
    reference dereference() const
    Access the element at the current position.
    Definition arraylist.hh:635
    \n-
    void push_back(const_reference entry)
    Append an entry to the list.
    Definition arraylist.hh:478
    \n-
    difference_type distanceTo(const ArrayListIterator< T, N, A > &other) const
    Definition arraylist.hh:647
    \n+
    330#endif // !HAVE_MPI
    \n+
    331
    \n+
    332} // end namespace Dune
    \n+
    333#endif
    \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 MPI's collective communication methods.
    \n+
    Implements an utility class that provides collective communication methods for sequential programs.
    \n+
    Standard Dune debug streams.
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n+
    DVerbType dverb(std::cout)
    Singleton of verbose debug stream.
    Definition stdstreams.hh:116
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    A random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:255
    \n-
    size_type position()
    Definition arraylist.hh:331
    \n-
    A::value_type MemberType
    The member type.
    Definition arraylist.hh:263
    \n-
    ArrayListIterator()
    Standard constructor.
    Definition arraylist.hh:340
    \n-
    A::difference_type difference_type
    Definition arraylist.hh:265
    \n-
    static constexpr int chunkSize_
    The number of elements in one chunk of the list.
    Definition arraylist.hh:278
    \n-
    A::size_type size_type
    Definition arraylist.hh:267
    \n-
    typename A::value_type const & const_reference
    Definition arraylist.hh:271
    \n-
    typename A::value_type & reference
    Definition arraylist.hh:269
    \n-
    A constant random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:370
    \n-
    static constexpr int chunkSize_
    The number of elements in one chunk of the list.
    Definition arraylist.hh:394
    \n-
    typename A::value_type & reference
    Definition arraylist.hh:385
    \n-
    ConstArrayListIterator()
    Definition arraylist.hh:431
    \n-
    A::value_type MemberType
    The member type.
    Definition arraylist.hh:379
    \n-
    A::difference_type difference_type
    Definition arraylist.hh:381
    \n-
    typename A::value_type const & const_reference
    Definition arraylist.hh:387
    \n-
    A::size_type size_type
    Definition arraylist.hh:383
    \n-
    A dynamically growing random access list.
    Definition arraylist.hh:62
    \n-
    T value_type
    Value type for stl compliance.
    Definition arraylist.hh:74
    \n-
    static constexpr int chunkSize_
    The number of elements in one chunk of the list. This has to be at least one. The default is 100.
    Definition arraylist.hh:100
    \n-
    const T * const_pointer
    The type of a const pointer to the type we store.
    Definition arraylist.hh:94
    \n-
    ArrayListIterator< MemberType, N, A > iterator
    A random access iterator.
    Definition arraylist.hh:105
    \n-
    const T & const_reference
    The type of a const reference to the type we store.
    Definition arraylist.hh:84
    \n-
    T & reference
    The type of a reference to the type we store.
    Definition arraylist.hh:79
    \n-
    std::size_t size_type
    The size type.
    Definition arraylist.hh:115
    \n-
    T MemberType
    The member type that is stored.
    Definition arraylist.hh:69
    \n-
    T * pointer
    The type of a pointer to the type we store.
    Definition arraylist.hh:89
    \n-
    ConstArrayListIterator< MemberType, N, A > const_iterator
    A constant random access iterator.
    Definition arraylist.hh:110
    \n-
    std::ptrdiff_t difference_type
    The difference type.
    Definition arraylist.hh:120
    \n-
    Base class for stl conformant forward iterators.
    Definition iteratorfacades.hh:434
    \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+
    Definition communication.hh:46
    \n+
    Collective communication interface and sequential default implementation.
    Definition communication.hh:100
    \n+
    A fake mpi helper.
    Definition mpihelper.hh:74
    \n+
    static DUNE_EXPORT MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:93
    \n+
    int size() const
    return rank of process, i.e. one
    Definition mpihelper.hh:163
    \n+
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:118
    \n+
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:105
    \n+
    No_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:85
    \n+
    static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:144
    \n+
    static DUNE_EXPORT FakeMPIHelper & instance()
    Definition mpihelper.hh:150
    \n+
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:124
    \n+
    static constexpr bool isFake
    Are we fake (i.e. pretend to have MPI support but are compiled without.)
    Definition mpihelper.hh:80
    \n+
    int rank() const
    return rank of process, i.e. zero
    Definition mpihelper.hh:159
    \n+
    A real mpi helper.
    Definition mpihelper.hh:179
    \n+
    int size() const
    return number of processes
    Definition mpihelper.hh:272
    \n+
    static DUNE_EXPORT MPIHelper & instance()
    Definition mpihelper.hh:258
    \n+
    static constexpr bool isFake
    Are we fake (i. e. pretend to have MPI support but are compiled without.
    Definition mpihelper.hh:185
    \n+
    static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
    Get the singleton instance of the helper.
    Definition mpihelper.hh:246
    \n+
    static Communication< MPICommunicator > getCommunication()
    Definition mpihelper.hh:227
    \n+
    ~MPIHelper()
    calls MPI_Finalize
    Definition mpihelper.hh:275
    \n+
    int rank() const
    return rank of process
    Definition mpihelper.hh:268
    \n+
    MPI_Comm MPICommunicator
    The type of the mpi communicator.
    Definition mpihelper.hh:190
    \n+
    static MPICommunicator getCommunicator()
    get the default communicator
    Definition mpihelper.hh:198
    \n+
    static MPICommunicator getLocalCommunicator()
    get a local communicator
    Definition mpihelper.hh:209
    \n+
    static Communication< MPICommunicator > getCollectiveCommunication()
    Definition mpihelper.hh:221
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,698 +1,314 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-arraylist.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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 (C) 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_ARRAYLIST_HH\n-7#define DUNE_COMMON_ARRAYLIST_HH\n-8\n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \"_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh\"\n+5#ifndef DUNE_MPIHELPER\n+6#define DUNE_MPIHELPER\n+7\n+8#if HAVE_MPI\n+9#include \n+10#include \n+11#endif\n+12\n+13#include \n 14\n-15namespace _\bD_\bu_\bn_\be\n-16{\n-17 // forward declaration\n-18 template\n-19 class ArrayListIterator;\n-20\n-21 template\n-22 class ConstArrayListIterator;\n-23\n-60 template >\n-_\b6_\b1 class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt\n-62 {\n-63 public:\n-_\b6_\b9 typedef T _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n-70\n-_\b7_\b4 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-75\n-_\b7_\b9 typedef T& _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-80\n-_\b8_\b4 typedef const T& _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-85\n-_\b8_\b9 typedef T* _\bp_\bo_\bi_\bn_\bt_\be_\br;\n-90\n-_\b9_\b4 typedef const T* _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n-95\n-_\b1_\b0_\b0 constexpr static int _\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_ = (N > 0) ? N : 1;\n-101\n-_\b1_\b0_\b5 typedef _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-106\n-_\b1_\b1_\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<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b> _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+15#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+16#if HAVE_MPI\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_\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/_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh>\n+19#endif\n+20#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+21\n+22namespace _\bD_\bu_\bn_\be\n+23{\n+_\b7_\b3 class _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+74 {\n+75 public:\n+_\b8_\b0 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = true;\n+81\n+_\b8_\b5 typedef _\bN_\bo_\b__\bC_\bo_\bm_\bm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+86\n+_\b9_\b3 _\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+94 {\n+95 static _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br comm;\n+96 return comm;\n+97 }\n+98\n+_\b1_\b0_\b5 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+106 {\n+107 return _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br();\n+108 }\n+109\n+110\n 111\n-_\b1_\b1_\b5 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-116\n-_\b1_\b2_\b0 typedef std::ptrdiff_t _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n-121\n-_\b1_\b2_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn();\n-127\n-_\b1_\b3_\b3 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-134\n-_\b1_\b3_\b9 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd();\n-140\n-_\b1_\b4_\b5 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-146\n-_\b1_\b5_\b1 inline void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be entry);\n-152\n-_\b1_\b5_\b8 inline _\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);\n-159\n-_\b1_\b6_\b5 inline _\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-166\n-_\b1_\b7_\b1 inline _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const;\n-172\n-_\b1_\b8_\b0 inline void _\bp_\bu_\br_\bg_\be();\n-181\n-_\b1_\b8_\b5 inline void _\bc_\bl_\be_\ba_\br();\n-_\b1_\b8_\b9 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt();\n-190\n-191 private:\n-192\n-196 using SmartPointerAllocator = typename std::allocator_traits::template\n-rebind_alloc< std::shared_ptr< std::array > >;\n-197\n-201 using ArrayAllocator = typename std::allocator_traits::template\n-rebind_alloc< std::array >;\n+117 [[deprecated(\"getCollectionCommunication is deprecated. Use\n+getCommunication instead.\")]]\n+_\b1_\b1_\b8 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+119 {\n+120 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+121 }\n+122\n+123 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_\b4 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n+125 {\n+126 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+127 }\n+128\n+_\b1_\b4_\b4 _\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+145 [[maybe_unused]] char** argv)\n+146 {\n+147 return _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n+148 }\n+149\n+_\b1_\b5_\b0 _\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+151 {\n+152 static _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br singleton;\n+153 return singleton;\n+154 }\n+155\n+_\b1_\b5_\b9 int _\br_\ba_\bn_\bk () const { return 0; }\n+_\b1_\b6_\b3 int _\bs_\bi_\bz_\be () const { return 1; }\n+164\n+165 private:\n+166 _\bF_\ba_\bk_\be_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br() {}\n+167 FakeMPIHelper(const FakeMPIHelper&);\n+168 FakeMPIHelper& operator=(const FakeMPIHelper);\n+169 };\n+170\n+171#if HAVE_MPI\n+_\b1_\b7_\b8 class _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br\n+179 {\n+180 public:\n+_\b1_\b8_\b5 constexpr static bool _\bi_\bs_\bF_\ba_\bk_\be = false;\n+186\n+_\b1_\b9_\b0 typedef MPI_Comm _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+191\n+_\b1_\b9_\b8 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+199 {\n+200 return MPI_COMM_WORLD;\n+201 }\n 202\n-206 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-207 friend class _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-208\n-210 std::vector >,\n-211 SmartPointerAllocator> chunks_;\n-220 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be capacity_;\n-222 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_;\n-224 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be start_;\n-233 inline _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be elementAt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i);\n-234\n-_\b2_\b4_\b3 inline _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be elementAt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const;\n-244 };\n-245\n-246\n-250 template\n-_\b2_\b5_\b1 class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public\n-_\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-252 typename A::value_type,\n-253 typename A::value_type &,\n-254 typename A::difference_type>\n-255 {\n-256\n-257 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt;\n-258 friend class _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-259 public:\n-_\b2_\b6_\b3 typedef typename A::value_type _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n+_\b2_\b0_\b9 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+210 {\n+211 return MPI_COMM_SELF;\n+212 }\n+213\n+219 [[deprecated(\"getCollectionCommunication is deprecated. Use\n+getCommunication instead.\")]]\n+220 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_\b1 _\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+222 {\n+223 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+224 }\n+225\n+226 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_\b7 _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn()\n+228 {\n+229 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+230 }\n+_\b2_\b4_\b6 _\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+247 {\n+248 // create singleton instance\n+249 if (!instance_){\n+250 static std::mutex mutex;\n+251 std::lock_guard guard(mutex);\n+252 if(!instance_)\n+253 instance_.reset(new _\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br(argc,argv));\n+254 }\n+255 return *instance_;\n+256 }\n+257\n+_\b2_\b5_\b8 _\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()\n+259 {\n+260 if(!instance_)\n+261 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn, \"MPIHelper not initialized! Call\n+MPIHelper::instance(argc, argv) with arguments first.\");\n+262 return *instance_;\n+263 }\n 264\n-_\b2_\b6_\b5 typedef typename A::difference_type _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n-266\n-_\b2_\b6_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-268\n-_\b2_\b6_\b9 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type &;\n-270\n-_\b2_\b7_\b1 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type const&;\n-272\n-_\b2_\b7_\b8 constexpr static int _\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_ = (N > 0) ? N : 1;\n-279\n-280\n-286 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const;\n-287\n-293 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other)\n-const;\n-294\n-298 inline void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-299\n-303 inline void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n-304\n-309 inline _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const;\n-310\n-315 inline _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n-316\n-328 inline void _\be_\br_\ba_\bs_\be_\bT_\bo_\bH_\be_\br_\be();\n+_\b2_\b6_\b8 int _\br_\ba_\bn_\bk () const { return rank_; }\n+_\b2_\b7_\b2 int _\bs_\bi_\bz_\be () const { return size_; }\n+273\n+_\b2_\b7_\b5 _\b~_\bM_\bP_\bI_\bH_\be_\bl_\bp_\be_\br()\n+276 {\n+277 int wasFinalized = -1;\n+278 MPI_Finalized( &wasFinalized );\n+279 if(!wasFinalized && initializedHere_)\n+280 {\n+281 MPI_Finalize();\n+282 _\bd_\bv_\be_\br_\bb << \"Called MPI_Finalize on p=\" << rank_ << \"!\" < instance_ = {};\n+293\n+295 MPIHelper(int& argc, char**& argv)\n+296 : initializedHere_(false)\n+297 {\n+298 int wasInitialized = -1;\n+299 MPI_Initialized( &wasInitialized );\n+300 if(!wasInitialized)\n+301 {\n+302 rank_ = -1;\n+303 size_ = -1;\n+304 static int is_initialized = MPI_Init(&argc, &argv);\n+305 prevent_warning(is_initialized);\n+306 initializedHere_ = true;\n+307 }\n+308\n+309 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);\n+310 MPI_Comm_size(MPI_COMM_WORLD,&size_);\n+311\n+312 assert( rank_ >= 0 );\n+313 assert( size_ >= 1 );\n+314\n+315 _\bd_\bv_\be_\br_\bb << \"Called MPI_Init on p=\" << rank_ << \"!\" << std::endl;\n+316 }\n+317\n+318 MPIHelper(const MPIHelper&);\n+319 MPIHelper& operator=(const MPIHelper);\n+320 };\n+321#else // !HAVE_MPI\n+322 // We do not have MPI therefore FakeMPIHelper\n+323 // is the MPIHelper\n+328 typedef FakeMPIHelper MPIHelper;\n 329\n-_\b3_\b3_\b1 inline _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(){return position_;}\n-332\n-334 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be n);\n-335\n-337 inline _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other)\n-const;\n-338\n-_\b3_\b4_\b0 inline _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br() : position_(0), list_(nullptr)\n-341 {}\n-342\n-343 private:\n-349 inline _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>& arrayList, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn);\n-350\n-354 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be position_;\n-_\b3_\b5_\b8 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>* list_;\n-359 };\n-360\n-364 template\n-_\b3_\b6_\b5 class _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-366 : public _\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-367 const typename A::value_type,\n-368 typename A::value_type const&,\n-369 typename A::difference_type>\n-370 {\n-371\n-372 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt;\n-373 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-374\n-375 public:\n-_\b3_\b7_\b9 typedef typename A::value_type _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n-380\n-_\b3_\b8_\b1 typedef typename A::difference_type _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n-382\n-_\b3_\b8_\b3 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-384\n-_\b3_\b8_\b5 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type &;\n-386\n-_\b3_\b8_\b7 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type const&;\n-388\n-_\b3_\b9_\b4 constexpr static int _\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_ = (N > 0) ? N : 1;\n-395\n-_\b4_\b0_\b1 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other)\n-const;\n-402\n-_\b4_\b0_\b6 inline void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-407\n-_\b4_\b1_\b1 inline void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n-412\n-_\b4_\b1_\b4 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be n);\n-415\n-_\b4_\b1_\b7 inline _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>&\n-other) const;\n-418\n-_\b4_\b2_\b3 inline _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const;\n-424\n-_\b4_\b2_\b9 inline _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n-430\n-_\b4_\b3_\b1 inline _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br() : position_(0), list_(nullptr)\n-432 {}\n-433\n-_\b4_\b3_\b4 inline _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other);\n-435\n-436 private:\n-437\n-443 inline _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>& arrayList, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-position);\n-444\n-448 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be position_;\n-452 const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>* list_;\n-453 };\n-454\n-455\n-456 template\n-_\b4_\b5_\b7 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt()\n-458 : capacity_(0), size_(0), start_(0)\n-459 {\n-460 chunks_.reserve(100);\n-461 }\n-462\n-463 template\n-_\b4_\b6_\b4 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bl_\be_\ba_\br(){\n-465 capacity_=0;\n-466 size_=0;\n-467 start_=0;\n-468 chunks_.clear();\n-469 }\n-470\n-471 template\n-_\b4_\b7_\b2 size_t _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bs_\bi_\bz_\be() const\n-473 {\n-474 return size_;\n-475 }\n-476\n-477 template\n-_\b4_\b7_\b8 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be entry)\n-479 {\n-480 size_t index=start_+size_;\n-481 if(index==capacity_)\n-482 {\n-483 chunks_.push_back(std::make_shared >());\n-484 capacity_ += chunkSize_;\n-485 }\n-486 elementAt(index)=entry;\n-487 ++size_;\n-488 }\n-489\n-490 template\n-_\b4_\b9_\b1 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-i)\n-492 {\n-493 return elementAt(start_+i);\n-494 }\n-495\n-496\n-497 template\n-_\b4_\b9_\b8 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-499 {\n-500 return elementAt(start_+i);\n-501 }\n-502\n-503 template\n-504 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(size_type\n-i)\n-505 {\n-506 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);\n-507 }\n-508\n-509\n-510 template\n-511 typename ArrayList::const_reference ArrayList::elementAt\n-(size_type i) const\n-512 {\n-513 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);\n-514 }\n-515\n-516 template\n-_\b5_\b1_\b7 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n-518 {\n-519 return _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_);\n-520 }\n-521\n-522 template\n-_\b5_\b2_\b3 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-524 {\n-525 return _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_);\n-526 }\n-527\n-528 template\n-_\b5_\b2_\b9 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd()\n-530 {\n-531 return _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_+size_);\n-532 }\n-533\n-534 template\n-_\b5_\b3_\b5 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd() const\n-536 {\n-537 return _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_+size_);\n-538 }\n-539\n-540 template\n-_\b5_\b4_\b1 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bp_\bu_\br_\bg_\be()\n-542 {\n-543 // Distance to copy to the left.\n-544 size_t distance = start_/chunkSize_;\n-545 if(distance>0) {\n-546 // Number of chunks with entries in it;\n-547 size_t chunks = ((start_%chunkSize_ + size_)/chunkSize_ );\n-548\n-549 // Copy chunks to the left.\n-550 std::copy(chunks_.begin()+distance,\n-551 chunks_.begin()+(distance+chunks), chunks_.begin());\n-552\n-553 // Calculate new parameters\n-554 start_ = start_ % chunkSize_;\n-555 //capacity += distance * chunkSize_;\n-556 }\n-557 }\n-558\n-559 template\n-_\b5_\b6_\b0 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be i)\n-561 {\n-562 position_+=i;\n-563 }\n-564\n-565 template\n-_\b5_\b6_\b6 void _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be i)\n-567 {\n-568 position_+=i;\n-569 }\n-570\n-571\n-572 template\n-_\b5_\b7_\b3 bool _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(const\n-_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const\n-574 {\n-575 // Makes only sense if we reference a common list\n-576 assert(list_==(other.list_));\n-577 return position_==other.position_ ;\n-578 }\n-579\n-580\n-581 template\n-_\b5_\b8_\b2 bool _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(const\n-_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const\n-583 {\n-584 // Makes only sense if we reference a common list\n-585 assert(list_==(other.list_));\n-586 return position_==other.position_ ;\n-587 }\n-588\n-589\n-590 template\n-_\b5_\b9_\b1 bool _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(const\n-_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const\n-592 {\n-593 // Makes only sense if we reference a common list\n-594 assert(list_==(other.list_));\n-595 return position_==other.position_ ;\n-596 }\n-597\n-598 template\n-_\b5_\b9_\b9 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n-600 {\n-601 ++position_;\n-602 }\n-603\n-604 template\n-_\b6_\b0_\b5 void _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n-606 {\n-607 ++position_;\n-608 }\n-609\n-610 template\n-_\b6_\b1_\b1 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n-612 {\n-613 --position_;\n-614 }\n-615\n-616 template\n-_\b6_\b1_\b7 void _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n-618 {\n-619 --position_;\n-620 }\n-621\n-622 template\n-_\b6_\b2_\b3 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:\n-_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-624 {\n-625 return list_->elementAt(i+position_);\n-626 }\n-627\n-628 template\n-_\b6_\b2_\b9 typename _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-630 {\n-631 return list_->elementAt(i+position_);\n-632 }\n-633\n-634 template\n-_\b6_\b3_\b5 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:\n-_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n-636 {\n-637 return list_->elementAt(position_);\n-638 }\n-639\n-640 template\n-_\b6_\b4_\b1 typename _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n-642 {\n-643 return list_->elementAt(position_);\n-644 }\n-645\n-646 template\n-_\b6_\b4_\b7 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n-_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other)\n-const\n-648 {\n-649 // Makes only sense if we reference a common list\n-650 assert(list_==(other.list_));\n-651 return other.position_ - position_;\n-652 }\n-653\n-654 template\n-_\b6_\b5_\b5 typename _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n-_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>&\n-other) const\n-656 {\n-657 // Makes only sense if we reference a common list\n-658 assert(list_==(other.list_));\n-659 return other.position_ - position_;\n-660 }\n-661\n-662 template\n-_\b6_\b6_\b3 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\br_\ba_\bs_\be_\bT_\bo_\bH_\be_\br_\be()\n-664 {\n-665 list_->size_ -= ++position_ - list_->start_;\n-666 // chunk number of the new position.\n-667 size_t posChunkStart = position_ / chunkSize_;\n-668 // number of chunks to deallocate\n-669 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_)\n-670 / chunkSize_;\n-671 list_->start_ = position_;\n-672\n-673 // Deallocate memory not needed any more.\n-674 for(size_t chunk=0; chunkchunks_[posChunkStart].reset();\n-677 }\n-678\n-679 // Capacity stays the same as the chunks before us\n-680 // are still there. They null pointers.\n-681 assert(list_->start_+list_->size_<=list_->capacity_);\n-682 }\n-683\n-684 template\n-685 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>& arrayList,\n-size_type position)\n-686 : position_(position), list_(&arrayList)\n-687 {}\n-688\n-689\n-690 template\n-691 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const\n-ArrayList& arrayList,\n-692 size_type position)\n-693 : position_(position), list_(&arrayList)\n-694 {}\n-695\n-696 template\n-_\b6_\b9_\b7 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const\n-_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other)\n-698 : position_(other.position_), list_(other.list_)\n-699 {}\n-700\n-701\n-703}\n-704#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-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-reference operator[](size_type i)\n-Get the element at specific position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:491\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-Get an iterator that is positioned at the first element.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:517\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const ArrayListIterator< MemberType, N, A > &other) const\n-Comares two iterators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:573\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-Increment the iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:599\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const\n-Get the number of elements in the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:472\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_\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-ConstArrayListIterator(const ArrayListIterator< T, N, A > &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:697\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bu_\br_\bg_\be\n-void purge()\n-Purge the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:541\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n-void decrement()\n-decrement the iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:611\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\br_\ba_\bs_\be_\bT_\bo_\bH_\be_\br_\be\n-void eraseToHere()\n-Erase all entries before the current position and the one at the current\n-position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:663\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt\n-ArrayList()\n-Constructs an Array list with one chunk.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:457\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-Get a random access iterator that is positioned at the first element.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:523\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_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-Increment the iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:605\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-Get a random access iterator positioned after the last element.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:529\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_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n-const_reference elementAt(size_type i) const\n-Get the value of the list at an arbitrary position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:629\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const_reference operator[](size_type i) const\n-Get the element at specific position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:498\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_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n-void decrement()\n-decrement the iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:617\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_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n-void advance(difference_type n)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:566\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-Get a random access iterator positioned after the last element.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:535\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_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const_reference dereference() const\n-Access the element at the current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:641\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bl_\be_\ba_\br\n-void clear()\n-Delete all entries from the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:464\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n-reference elementAt(size_type i) const\n-Get the value of the list at an arbitrary position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:623\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_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const ConstArrayListIterator< MemberType, N, A > &other) const\n-Comares to iterators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:591\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n-void advance(difference_type n)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:560\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_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-difference_type distanceTo(const ConstArrayListIterator< T, N, A > &other)\n-const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:655\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\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-Access the element at the current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:635\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n-void push_back(const_reference entry)\n-Append an entry to the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:478\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-difference_type distanceTo(const ArrayListIterator< T, N, A > &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:647\n+330#endif // !HAVE_MPI\n+331\n+332} // end namespace Dune\n+333#endif\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+_\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+_\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+_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\n+Standard Dune debug streams.\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_\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:116\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_\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:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-size_type position()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:331\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n-A::value_type MemberType\n-The member type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:263\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ArrayListIterator()\n-Standard constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:340\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n-A::difference_type difference_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_\n-static constexpr int chunkSize_\n-The number of elements in one chunk of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:267\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename A::value_type const & const_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename A::value_type & reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:269\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:370\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_\b:_\b:_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_\n-static constexpr int chunkSize_\n-The number of elements in one chunk of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:394\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_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename A::value_type & reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:385\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_\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-ConstArrayListIterator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:431\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_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n-A::value_type MemberType\n-The member type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:379\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_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n-A::difference_type difference_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:381\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_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-typename A::value_type const & const_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:387\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_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:383\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:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-T value_type\n-Value type for stl compliance.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_\n-static constexpr int chunkSize_\n-The number of elements in one chunk of the list. This has to be at least one.\n-The default is 100.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n-const T * const_pointer\n-The type of a const pointer to the type we store.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-ArrayListIterator< MemberType, N, A > iterator\n-A random access iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const T & const_reference\n-The type of a const reference to the type we store.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-T & reference\n-The type of a reference to the type we store.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\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 arraylist.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n-T MemberType\n-The member type that is stored.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n-T * pointer\n-The type of a pointer to the type we store.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:89\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:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\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 arraylist.hh:120\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:434\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:_\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:74\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:93\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:163\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:118\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:105\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:85\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:144\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:150\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:124\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:80\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:159\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:179\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:272\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()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mpihelper.hh:258\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:185\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:246\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:227\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:275\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:268\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:190\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:198\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:209\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: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/a00242.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00242.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: visibility.hh File Reference\n+dune-common: mpi_collective_benchmark.cc File Reference\n \n \n \n \n \n \n \n@@ -65,72 +65,327 @@\n \n \n \n \n \n \n \n
    \n
    \n-Macros
    \n-
    visibility.hh File Reference
    \n+Functions |\n+Variables
    \n+
    mpi_collective_benchmark.cc File Reference
    \n \n
    \n+
    #include <config.h>
    \n+#include <iostream>
    \n+#include <iomanip>
    \n+#include <thread>
    \n+#include <dune/common/parallel/mpihelper.hh>
    \n+#include <dune/common/timer.hh>
    \n+#include <dune/common/parametertree.hh>
    \n+#include <dune/common/parametertreeparser.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+

    \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+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+

    Function Documentation

    \n+\n+

    ◆ communicate()

    \n \n-

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

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

    Go to the source code of this file.

    \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-

    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+

    ◆ 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 \n
    #define DUNE_EXPORT   implementation_definedDune::Future< void > startCommunication (CC & cc)
    \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+

    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-

    ◆ DUNE_PRIVATE

    \n+\n+

    ◆ options

    \n \n
    \n
    \n \n \n- \n+ \n \n
    #define DUNE_PRIVATE   implementation_definedDune::ParameterTree options
    \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+

    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", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,145 @@\n dune-common\u00a02.9.0\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-_\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-\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+ * _\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+#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_\bh_\be_\bl_\bp_\be_\br_\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+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/a00245.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00245.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: hash.hh File Reference\n+dune-common: indexset.hh File Reference\n \n \n \n \n \n \n \n@@ -65,185 +65,124 @@\n \n \n \n \n \n \n \n
    \n \n-
    hash.hh File Reference
    \n+ \n
    \n
    \n \n-

    Support for calculating hash values of objects. \n+

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

    \n-
    #include <functional>
    \n-#include <dune/common/typetraits.hh>
    \n+
    #include <algorithm>
    \n+#include <dune/common/arraylist.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <iostream>
    \n+#include "localindex.hh"
    \n+#include <stdint.h>
    \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

    struct  Dune::hash< T >
     Functor for hashing objects of type T. More...
    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 >
     
    \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-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+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+\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.
     
    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-

    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+

    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,129 +1,108 @@\n dune-common\u00a02.9.0\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+ * _\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+#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 \n+#include \"_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\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-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+ 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 \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+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-#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+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-#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+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-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+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 \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+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/a00245_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00245_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: indexset.hh Source File\n \n \n \n \n \n \n \n@@ -70,293 +70,961 @@\n \n \n \n \n \n \n \n
    \n-
    hash.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 (C) 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+
    5#ifndef DUNE_INDEXSET_HH
    \n+
    6#define DUNE_INDEXSET_HH
    \n
    7
    \n-
    8#include <functional>
    \n-
    9
    \n-\n-
    11
    \n-
    24// ********************************************************************************
    \n-
    25// Doxygen documentation
    \n-
    26// ********************************************************************************
    \n-
    27
    \n-
    28#ifdef DOXYGEN
    \n+
    8#include <algorithm>
    \n+\n+\n+
    11#include <iostream>
    \n+
    12
    \n+
    13#include "localindex.hh"
    \n+
    14
    \n+
    15#include <stdint.h> // for uint32_t
    \n+
    16
    \n+
    17namespace Dune
    \n+
    18{
    \n+
    28 // forward declarations
    \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+
    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}
    \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+
    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+
    107 typedef TG GlobalIndex;
    \n+
    108
    \n+
    120 typedef TL LocalIndex;
    \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+\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+\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+
    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-
    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+
    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-
    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+
    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 // 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+
    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-
    298#endif // DOXYGEN
    \n-
    299
    \n-
    301
    \n-
    306 template<typename T>
    \n+\n+
    302
    \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+
    308 {
    \n+
    309 return state_;
    \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+\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#endif
    \n+
    Implements a random-access container that can efficiently change size (similar to std::deque)
    \n+
    Provides classes for use as the local index in ParallelIndexSet.
    \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:637
    \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:683
    \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:660
    \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:237
    \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:705
    \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:259
    \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-
    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+
    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:370
    \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,329 +1,1114 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-hash.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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 (C) 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+5#ifndef DUNE_INDEXSET_HH\n+6#define DUNE_INDEXSET_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-27\n-28#ifdef DOXYGEN\n+8#include \n+9#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+10#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+11#include \n+12\n+13#include \"_\bl_\bo_\bc_\ba_\bl_\bi_\bn_\bd_\be_\bx_\b._\bh_\bh\"\n+14\n+15#include // for uint32_t\n+16\n+17namespace _\bD_\bu_\bn_\be\n+18{\n+28 // forward declarations\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+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}\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+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_\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-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+_\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-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+_\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+_\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+_\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-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+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-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+_\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 // 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+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-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+_\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 hash_combiner()(seed,arg);\n+309 return state_;\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+_\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 size)\n+1059 : indexSet_(indexset), size_(size),\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#endif\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+_\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+_\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:637\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:683\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:660\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:237\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:705\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:259\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:_\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+_\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:370\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:500\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/a00248.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00248.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: hybridutilities.hh File Reference\n+dune-common: localindex.hh File Reference\n \n \n \n \n \n \n \n@@ -65,90 +65,55 @@\n \n \n \n \n \n \n \n
    \n \n-
    hybridutilities.hh File Reference
    \n+Enumerations
    \n+ \n \n
    \n-
    #include <tuple>
    \n-#include <utility>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/typeutilities.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/assertandreturn.hh>
    \n-#include <dune/common/rangeutilities.hh>
    \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 \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Hybrid
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\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 >
    constexpr auto Dune::Hybrid::size (const T &t)
     Size query.
     
    template<class Container , class Index >
    constexpr decltype(auto) Dune::Hybrid::elementAt (Container &&c, Index &&i)
     Get element at given position from container.
     
    template<class Begin , class End >
    constexpr auto Dune::Hybrid::integralRange (const Begin &begin, const End &end)
     Create an integral range.
     
    template<class End >
    constexpr auto Dune::Hybrid::integralRange (const End &end)
     Create an integral range starting from 0.
     
    template<class Range , class F >
    constexpr void Dune::Hybrid::forEach (Range &&range, F &&f)
     Range based for loop.
     
    template<class Range , class T , class F >
    constexpr T Dune::Hybrid::accumulate (Range &&range, T value, F &&f)
     Accumulate values.
     
    template<class Condition , class IfFunc , class ElseFunc >
    decltype(auto) Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
     A conditional expression.
     
    template<class Condition , class IfFunc >
    void Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc)
     A conditional expression.
     
    template<class T1 , class T2 >
    constexpr auto Dune::Hybrid::equals (T1 &&t1, T2 &&t2)
     Equality comparison.
     
    template<class Cases , class Value , class Branches , class ElseBranch >
    constexpr decltype(auto) Dune::Hybrid::switchCases (const Cases &cases, const Value &value, Branches &&branches, ElseBranch &&elseBranch)
     Switch statement.
     
    template<class Cases , class Value , class Branches >
    constexpr void Dune::Hybrid::switchCases (const Cases &cases, const Value &value, Branches &&branches)
     Switch statement.
     

    \n+Enumerations

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

    Detailed Description

    \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,77 +1,31 @@\n dune-common\u00a02.9.0\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-hybridutilities.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-#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/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\bs_\bs_\be_\br_\bt_\ba_\bn_\bd_\br_\be_\bt_\bu_\br_\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+ * _\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 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:_\bH_\by_\bb_\br_\bi_\bd\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:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bi_\bz_\be (const T &t)\n-\u00a0 Size query.\n-\u00a0\n-template\n-constexpr decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt (Container &&c, Index &&i)\n-\u00a0 Get element at given position from container.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be (const Begin &begin,\n- const End &end)\n-\u00a0 Create an integral range.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be (const End &end)\n-\u00a0 Create an integral range starting from 0.\n-\u00a0\n-template\n- constexpr void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh (Range &&_\br_\ba_\bn_\bg_\be, F &&f)\n-\u00a0 Range based for loop.\n-\u00a0\n-template\n- constexpr T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be (Range &&_\br_\ba_\bn_\bg_\be, T value, F\n- &&f)\n-\u00a0 Accumulate values.\n-\u00a0\n-template\n- decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bf_\bE_\bl_\bs_\be (const Condition &condition,\n- IfFunc &&ifFunc, ElseFunc &&elseFunc)\n-\u00a0 A conditional expression.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bf_\bE_\bl_\bs_\be (const Condition &condition,\n- IfFunc &&ifFunc)\n-\u00a0 A conditional expression.\n-\u00a0\n-template\n- constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs (T1 &&t1, T2 &&t2)\n-\u00a0 Equality comparison.\n-\u00a0\n-template\n-constexpr decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs (const Cases &cases, const\n- Value &value, Branches &&branches, ElseBranch\n- &&elseBranch)\n-\u00a0 Switch statement.\n-\u00a0\n-template\n- constexpr void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs (const Cases &cases, const\n- Value &value, Branches &&branches)\n-\u00a0 Switch statement.\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+\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/a00248_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: hybridutilities.hh Source File\n+dune-common: localindex.hh Source File\n \n \n \n \n \n \n \n@@ -70,379 +70,117 @@\n \n \n \n \n \n \n \n
    \n-
    hybridutilities.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 (C) 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_HYBRIDUTILITIES_HH
    \n-
    6#define DUNE_COMMON_HYBRIDUTILITIES_HH
    \n-
    7
    \n-
    8#include <tuple>
    \n-
    9#include <utility>
    \n+
    5
    \n+
    6#ifndef DUNE_COMMON_LOCALINDEX_HH
    \n+
    7#define DUNE_COMMON_LOCALINDEX_HH
    \n+
    8
    \n+
    9#include <cstddef>
    \n
    10
    \n-\n-\n-\n-\n-\n-\n-
    17
    \n-
    18
    \n-
    19
    \n-
    20namespace Dune {
    \n-
    \n-
    21namespace Hybrid {
    \n-
    22
    \n-
    23namespace Impl {
    \n-
    24
    \n-
    25 // Try if tuple_size is implemented for class
    \n-
    26 template<class T, int i>
    \n-
    27 constexpr auto size(const Dune::FieldVector<T, i>&, const PriorityTag<5>&)
    \n-
    28 -> decltype(std::integral_constant<std::size_t,i>())
    \n-
    29 {
    \n-
    30 return {};
    \n-
    31 }
    \n-
    32
    \n-
    33 // Try if tuple_size is implemented for class
    \n-
    34 template<class T>
    \n-
    35 constexpr auto size(const T&, const PriorityTag<3>&)
    \n-
    36 -> decltype(std::integral_constant<std::size_t,std::tuple_size<T>::value>())
    \n-
    37 {
    \n-
    38 return {};
    \n-
    39 }
    \n-
    40
    \n-
    41 // Try if there's a static constexpr size()
    \n-
    42 template<class T>
    \n-
    43 constexpr auto size(const T&, const PriorityTag<1>&)
    \n-
    44 -> decltype(std::integral_constant<std::size_t,T::size()>())
    \n-
    45 {
    \n-
    46 return {};
    \n-
    47 }
    \n-
    48
    \n-
    49 // As a last resort try if there's a static constexpr size()
    \n-
    50 template<class T>
    \n-
    51 constexpr auto size(const T& t, const PriorityTag<0>&)
    \n-
    52 {
    \n-
    53 return t.size();
    \n-
    54 }
    \n-
    55
    \n-
    56} // namespace Impl
    \n-
    57
    \n-
    58
    \n-
    59
    \n-
    81template<class T>
    \n-
    \n-
    82constexpr auto size(const T& t)
    \n-
    83{
    \n-
    84 return Impl::size(t, PriorityTag<42>());
    \n-
    85}
    \n-
    \n-
    86
    \n-
    87
    \n-
    88
    \n-
    89namespace Impl {
    \n-
    90
    \n-
    91 template<class Container, class Index,
    \n-
    92 std::enable_if_t<IsTuple<std::decay_t<Container>>::value, int> = 0>
    \n-
    93 constexpr decltype(auto) elementAt(Container&& c, Index&&, PriorityTag<2>)
    \n-
    94 {
    \n-
    95 return std::get<std::decay_t<Index>::value>(c);
    \n-
    96 }
    \n-
    97
    \n-
    98 template<class T, T... t, class Index>
    \n-
    99 constexpr decltype(auto) elementAt(std::integer_sequence<T, t...> c, Index, PriorityTag<1>)
    \n-
    100 {
    \n-
    101 return Dune::integerSequenceEntry(c, std::integral_constant<std::size_t, Index::value>());
    \n-
    102 }
    \n-
    103
    \n-
    104 template<class Container, class Index>
    \n-
    105 constexpr decltype(auto) elementAt(Container&& c, Index&& i, PriorityTag<0>)
    \n-
    106 {
    \n-
    107 return c[i];
    \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+
    49 LocalIndex(std::size_t index) :
    \n+
    50 localIndex_(index), state_(VALID){}
    \n+
    \n+
    55 inline const std::size_t& local() const;
    \n+
    56
    \n+
    60 inline operator std::size_t() const;
    \n+
    61
    \n+
    67 inline LocalIndex& operator=(std::size_t index);
    \n+
    68
    \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-
    110} // namespace Impl
    \n-
    111
    \n-
    112
    \n+
    \n+\n+
    111 return static_cast<LocalIndexState>(state_);
    \n+
    112 }
    \n+
    \n
    113
    \n-
    134template<class Container, class Index>
    \n-
    \n-
    135constexpr decltype(auto) elementAt(Container&& c, Index&& i)
    \n-
    136{
    \n-
    137 return Impl::elementAt(std::forward<Container>(c), std::forward<Index>(i), PriorityTag<42>());
    \n-
    138}
    \n-
    \n-
    139
    \n-
    140
    \n-
    141
    \n-
    142namespace Impl {
    \n-
    143
    \n-
    144 template<class Begin, class End,
    \n-
    145 std::enable_if_t<IsIntegralConstant<Begin>::value and IsIntegralConstant<End>::value, int> = 0>
    \n-
    146 constexpr auto integralRange(const Begin& /*begin*/, const End& /*end*/, const PriorityTag<1>&)
    \n-
    147 {
    \n-
    148 static_assert(Begin::value <= End::value, "You cannot create an integralRange where end<begin");
    \n-\n-
    150 }
    \n-
    151
    \n-
    152 // This should be constexpr but gcc-4.9 does not support
    \n-
    153 // the relaxed constexpr requirements. Hence for being
    \n-
    154 // constexpr the function body can only contain a return
    \n-
    155 // statement and no assertion before this.
    \n-
    156 template<class Begin, class End>
    \n-
    157 constexpr auto integralRange(const Begin& begin, const End& end, const PriorityTag<0>&)
    \n-
    158 {
    \n-
    159 return DUNE_ASSERT_AND_RETURN(begin<=end, Dune::IntegralRange<End>(begin, end));
    \n-
    160 }
    \n-
    161
    \n-
    162} // namespace Impl
    \n-
    163
    \n-
    164
    \n-
    165
    \n-
    183template<class Begin, class End>
    \n-
    \n-
    184constexpr auto integralRange(const Begin& begin, const End& end)
    \n-
    185{
    \n-
    186 return Impl::integralRange(begin, end, PriorityTag<42>());
    \n-
    187}
    \n-
    \n-
    188
    \n-
    202template<class End>
    \n-
    \n-
    203constexpr auto integralRange(const End& end)
    \n-
    204{
    \n-
    205 return Impl::integralRange(Dune::Indices::_0, end, PriorityTag<42>());
    \n-
    206}
    \n-
    \n-
    207
    \n-
    208
    \n-
    209
    \n-
    210namespace Impl {
    \n-
    211
    \n-
    212 template<class T>
    \n-
    213 constexpr void evaluateFoldExpression(std::initializer_list<T>&&)
    \n-
    214 {}
    \n-
    215
    \n-
    216 template<class Range, class F, class Index, Index... i>
    \n-
    217 constexpr void forEachIndex(Range&& range, F&& f, std::integer_sequence<Index, i...>)
    \n-
    218 {
    \n-
    219 evaluateFoldExpression<int>({(f(Hybrid::elementAt(range, std::integral_constant<Index,i>())), 0)...});
    \n-
    220 }
    \n-
    221
    \n-
    222 template<class F, class Index, Index... i>
    \n-
    223 constexpr void forEach(std::integer_sequence<Index, i...> /*range*/, F&& f, PriorityTag<2>)
    \n-
    224 {
    \n-
    225 evaluateFoldExpression<int>({(f(std::integral_constant<Index,i>()), 0)...});
    \n-
    226 }
    \n-
    227
    \n-
    228
    \n-
    229 template<class Range, class F,
    \n-
    230 std::enable_if_t<IsIntegralConstant<decltype(Hybrid::size(std::declval<Range>()))>::value, int> = 0>
    \n-
    231 constexpr void forEach(Range&& range, F&& f, PriorityTag<1>)
    \n-
    232 {
    \n-
    233 auto size = Hybrid::size(range);
    \n-
    234 auto indices = std::make_index_sequence<size>();
    \n-
    235 (forEachIndex)(std::forward<Range>(range), std::forward<F>(f), indices);
    \n-
    236 }
    \n-
    237
    \n-
    238 template<class Range, class F>
    \n-
    239 constexpr void forEach(Range&& range, F&& f, PriorityTag<0>)
    \n-
    240 {
    \n-
    241 for(auto&& e : range)
    \n-
    242 f(e);
    \n-
    243 }
    \n-
    244
    \n-
    245} // namespace Impl
    \n-
    246
    \n-
    247
    \n-
    248
    \n-
    267template<class Range, class F>
    \n-
    \n-
    268constexpr void forEach(Range&& range, F&& f)
    \n-
    269{
    \n-
    270 Impl::forEach(std::forward<Range>(range), std::forward<F>(f), PriorityTag<42>());
    \n-
    271}
    \n-
    \n-
    272
    \n-
    273
    \n-
    274
    \n-
    290template<class Range, class T, class F>
    \n-
    \n-
    291constexpr T accumulate(Range&& range, T value, F&& f)
    \n-
    292{
    \n-
    293 forEach(std::forward<Range>(range), [&](auto&& entry) {
    \n-
    294 value = f(value, entry);
    \n-
    295 });
    \n-
    296 return value;
    \n-
    297}
    \n-
    \n-
    298
    \n-
    299
    \n-
    300
    \n-
    301namespace Impl {
    \n-
    302
    \n-
    303 struct Id {
    \n-
    304 template<class T>
    \n-
    305 constexpr T operator()(T&& x) const {
    \n-
    306 return std::forward<T>(x);
    \n-
    307 }
    \n-
    308 };
    \n-
    309
    \n-
    310 template<class IfFunc, class ElseFunc>
    \n-
    311 constexpr decltype(auto) ifElse(std::true_type, IfFunc&& ifFunc, ElseFunc&& /*elseFunc*/)
    \n-
    312 {
    \n-
    313 return ifFunc(Id{});
    \n-
    314 }
    \n-
    315
    \n-
    316 template<class IfFunc, class ElseFunc>
    \n-
    317 constexpr decltype(auto) ifElse(std::false_type, IfFunc&& /*ifFunc*/, ElseFunc&& elseFunc)
    \n-
    318 {
    \n-
    319 return elseFunc(Id{});
    \n-
    320 }
    \n-
    321
    \n-
    322 template<class IfFunc, class ElseFunc>
    \n-
    323 decltype(auto) ifElse(const bool& condition, IfFunc&& ifFunc, ElseFunc&& elseFunc)
    \n-
    324 {
    \n-
    325 if (condition)
    \n-
    326 return ifFunc(Id{});
    \n-
    327 else
    \n-
    328 return elseFunc(Id{});
    \n-
    329 }
    \n-
    330
    \n-
    331} // namespace Impl
    \n-
    332
    \n-
    333
    \n-
    334
    \n-
    355template<class Condition, class IfFunc, class ElseFunc>
    \n-
    \n-
    356decltype(auto) ifElse(const Condition& condition, IfFunc&& ifFunc, ElseFunc&& elseFunc)
    \n-
    357{
    \n-
    358 return Impl::ifElse(condition, std::forward<IfFunc>(ifFunc), std::forward<ElseFunc>(elseFunc));
    \n-
    359}
    \n-
    \n-
    360
    \n-
    368template<class Condition, class IfFunc>
    \n-
    \n-
    369void ifElse(const Condition& condition, IfFunc&& ifFunc)
    \n-
    370{
    \n-
    371 ifElse(condition, std::forward<IfFunc>(ifFunc), [](auto&&) {});
    \n-
    372}
    \n-
    \n-
    373
    \n-
    374
    \n-
    375
    \n-
    376namespace Impl {
    \n-
    377
    \n-
    378 template<class T1, class T2>
    \n-
    379 constexpr auto equals(const T1& /*t1*/, const T2& /*t2*/, PriorityTag<1>) -> decltype(T1::value, T2::value, std::integral_constant<bool,T1::value == T2::value>())
    \n-
    380 { return {}; }
    \n-
    381
    \n-
    382 template<class T1, class T2>
    \n-
    383 constexpr auto equals(const T1& t1, const T2& t2, PriorityTag<0>)
    \n-
    384 {
    \n-
    385 return t1==t2;
    \n-
    386 }
    \n-
    387
    \n-
    388} // namespace Impl
    \n-
    389
    \n-
    390
    \n-
    391
    \n-
    401template<class T1, class T2>
    \n-
    \n-
    402constexpr auto equals(T1&& t1, T2&& t2)
    \n-
    403{
    \n-
    404 return Impl::equals(std::forward<T1>(t1), std::forward<T2>(t2), PriorityTag<1>());
    \n-
    405}
    \n-
    \n-
    406
    \n-
    407
    \n-
    408
    \n-
    409namespace Impl {
    \n-
    410
    \n-
    411 template<class Result, class T, class Value, class Branches, class ElseBranch>
    \n-
    412 constexpr Result switchCases(std::integer_sequence<T>, const Value& /*value*/, Branches&& /*branches*/, ElseBranch&& elseBranch)
    \n-
    413 {
    \n-
    414 return elseBranch();
    \n-
    415 }
    \n-
    416
    \n-
    417 template<class Result, class T, T t0, T... tt, class Value, class Branches, class ElseBranch>
    \n-
    418 constexpr Result switchCases(std::integer_sequence<T, t0, tt...>, const Value& value, Branches&& branches, ElseBranch&& elseBranch)
    \n-
    419 {
    \n-
    420 return ifElse(
    \n-
    421 Hybrid::equals(std::integral_constant<T, t0>(), value),
    \n-
    422 [&](auto id) -> decltype(auto) {
    \n-
    423 return id(branches)(std::integral_constant<T, t0>());
    \n-
    424 }, [&](auto id) -> decltype(auto) {
    \n-
    425 return Impl::switchCases<Result>(id(std::integer_sequence<T, tt...>()), value, branches, elseBranch);
    \n-
    426 });
    \n-
    427 }
    \n-
    428
    \n-
    429} // namespace Impl
    \n-
    430
    \n-
    431
    \n-
    432
    \n-
    460template<class Cases, class Value, class Branches, class ElseBranch>
    \n-
    \n-
    461constexpr decltype(auto) switchCases(const Cases& cases, const Value& value, Branches&& branches, ElseBranch&& elseBranch)
    \n-
    462{
    \n-
    463 return Impl::switchCases<decltype(elseBranch())>(cases, value, std::forward<Branches>(branches), std::forward<ElseBranch>(elseBranch));
    \n-
    464}
    \n-
    \n-
    465
    \n-
    486template<class Cases, class Value, class Branches>
    \n-
    \n-
    487constexpr void switchCases(const Cases& cases, const Value& value, Branches&& branches)
    \n-
    488{
    \n-
    489 Impl::switchCases<void>(cases, value, std::forward<Branches>(branches), []() {});
    \n-
    490}
    \n-
    \n-
    491
    \n-
    492
    \n-
    493} // namespace Hybrid
    \n-
    \n-
    494} // namespace Dune
    \n-
    495
    \n-
    496
    \n-
    497#endif // #ifndef DUNE_COMMON_HYBRIDUTILITIES_HH
    \n-
    Utilities for reduction like operations on ranges.
    \n-\n-
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n-\n-
    Utilities for type computations, constraining overloads, ...
    \n-
    Traits for type conversions and type information.
    \n-
    constexpr index_constant< 0 > _0
    Compile time index with value 0.
    Definition indices.hh:53
    \n-
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n-
    constexpr auto size(const T &t)
    Size query.
    Definition hybridutilities.hh:82
    \n-
    constexpr auto equals(T1 &&t1, T2 &&t2)
    Equality comparison.
    Definition hybridutilities.hh:402
    \n-
    constexpr void forEach(Range &&range, F &&f)
    Range based for loop.
    Definition hybridutilities.hh:268
    \n-
    constexpr decltype(auto) switchCases(const Cases &cases, const Value &value, Branches &&branches, ElseBranch &&elseBranch)
    Switch statement.
    Definition hybridutilities.hh:461
    \n-
    decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
    A conditional expression.
    Definition hybridutilities.hh:356
    \n-
    constexpr auto integralRange(const Begin &begin, const End &end)
    Create an integral range.
    Definition hybridutilities.hh:184
    \n-
    constexpr decltype(auto) elementAt(Container &&c, Index &&i)
    Get element at given position from container.
    Definition hybridutilities.hh:135
    \n-
    constexpr T accumulate(Range &&range, T value, F &&f)
    Accumulate values.
    Definition hybridutilities.hh:291
    \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:462
    \n-
    #define DUNE_ASSERT_AND_RETURN(C, X)
    Asserts a condition and return on success in constexpr context.
    Definition assertandreturn.hh:22
    \n+
    \n+\n+
    115 state_ = static_cast<char>(state);
    \n+
    116 }
    \n+
    \n+
    117
    \n+
    120} // namespace Dune
    \n+
    121
    \n+
    122#endif
    \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-
    vector space out of a tensor product of fields.
    Definition fvector.hh:95
    \n-
    dynamic integer range for use in range-based for loops
    Definition rangeutilities.hh:175
    \n-
    static integer range for use in range-based for loops
    Definition rangeutilities.hh:225
    \n-
    Check if T is an std::integral_constant<I, i>
    Definition typetraits.hh:384
    \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,433 +1,121 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-hybridutilities.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 (C) 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_HYBRIDUTILITIES_HH\n-6#define DUNE_COMMON_HYBRIDUTILITIES_HH\n-7\n-8#include \n-9#include \n+5\n+6#ifndef DUNE_COMMON_LOCALINDEX_HH\n+7#define DUNE_COMMON_LOCALINDEX_HH\n+8\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-12#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-13#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\ba_\bs_\bs_\be_\br_\bt_\ba_\bn_\bd_\br_\be_\bt_\bu_\br_\bn_\b._\bh_\bh>\n-16#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-17\n-18\n-19\n-20namespace _\bD_\bu_\bn_\be {\n-_\b2_\b1namespace Hybrid {\n-22\n-23namespace Impl {\n-24\n-25 // Try if tuple_size is implemented for class\n-26 template\n-27 constexpr auto size(const _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bi_\b>&, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b5_\b>&)\n-28 -> decltype(std::integral_constant())\n-29 {\n-30 return {};\n-31 }\n-32\n-33 // Try if tuple_size is implemented for class\n-34 template\n-35 constexpr auto size(const T&, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b3_\b>&)\n-36 -> decltype(std::integral_constant::value>())\n-37 {\n-38 return {};\n-39 }\n-40\n-41 // Try if there's a static constexpr size()\n-42 template\n-43 constexpr auto size(const T&, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>&)\n-44 -> decltype(std::integral_constant())\n-45 {\n-46 return {};\n-47 }\n-48\n-49 // As a last resort try if there's a static constexpr size()\n-50 template\n-51 constexpr auto size(const T& t, const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b0_\b>&)\n-52 {\n-53 return t.size();\n-54 }\n-55\n-56} // namespace Impl\n-57\n-58\n-59\n-81template\n-_\b8_\b2constexpr auto _\bs_\bi_\bz_\be(const T& t)\n-83{\n-84 return Impl::size(t, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n-85}\n-86\n-87\n-88\n-89namespace Impl {\n-90\n-91 template>::value, int> = 0>\n-93 constexpr decltype(auto) elementAt(Container&& c, Index&&, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>)\n-94 {\n-95 return std::get::value>(c);\n-96 }\n-97\n-98 template\n-99 constexpr decltype(auto) elementAt(std::integer_sequence c, Index,\n-PriorityTag<1>)\n-100 {\n-101 return _\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(c, std::integral_constant());\n-102 }\n-103\n-104 template\n-105 constexpr decltype(auto) elementAt(Container&& c, Index&& i,\n-PriorityTag<0>)\n-106 {\n-107 return c[i];\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_\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+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+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-110} // namespace Impl\n-111\n-112\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-134template\n-_\b1_\b3_\b5constexpr decltype(auto) _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(Container&& c, Index&& i)\n-136{\n-137 return Impl::elementAt(std::forward(c), std::forward(i),\n-_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n-138}\n-139\n-140\n-141\n-142namespace Impl {\n-143\n-144 template::value and\n-_\bI_\bs_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bC_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bE_\bn_\bd_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be, int> = 0>\n-146 constexpr auto integralRange(const Begin& /*begin*/, const End& /*end*/,\n-const _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>&)\n-147 {\n-148 static_assert(Begin::value <= End::value, \"You cannot create an\n-integralRange where end();\n-150 }\n-151\n-152 // This should be constexpr but gcc-4.9 does not support\n-153 // the relaxed constexpr requirements. Hence for being\n-154 // constexpr the function body can only contain a return\n-155 // statement and no assertion before this.\n-156 template\n-157 constexpr auto integralRange(const Begin& begin, const End& end, const\n-PriorityTag<0>&)\n-158 {\n-159 return _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bA_\bN_\bD_\b__\bR_\bE_\bT_\bU_\bR_\bN(begin<=end, _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be_\b<_\bE_\bn_\bd_\b>(begin,\n-end));\n-160 }\n-161\n-162} // namespace Impl\n-163\n-164\n-165\n-183template\n-_\b1_\b8_\b4constexpr auto _\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be(const Begin& begin, const End& end)\n-185{\n-186 return Impl::integralRange(begin, end, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n-187}\n-188\n-202template\n-_\b2_\b0_\b3constexpr auto _\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be(const End& end)\n-204{\n-205 return Impl::integralRange(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b0, end, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n-206}\n-207\n-208\n-209\n-210namespace Impl {\n-211\n-212 template\n-213 constexpr void evaluateFoldExpression(std::initializer_list&&)\n-214 {}\n-215\n-216 template\n-217 constexpr void forEachIndex(Range&& _\br_\ba_\bn_\bg_\be, F&& f, std::\n-integer_sequence)\n-218 {\n-219 evaluateFoldExpression({(f(_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\br_\ba_\bn_\bg_\be, std::\n-integral_constant())), 0)...});\n-220 }\n-221\n-222 template\n-223 constexpr void forEach(std::integer_sequence /*range*/, F&& f,\n-PriorityTag<2>)\n-224 {\n-225 evaluateFoldExpression({(f(std::integral_constant()),\n-0)...});\n-226 }\n-227\n-228\n-229 template()))>::value, int> = 0>\n-231 constexpr void forEach(Range&& _\br_\ba_\bn_\bg_\be, F&& f, PriorityTag<1>)\n-232 {\n-233 auto size = _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bi_\bz_\be(_\br_\ba_\bn_\bg_\be);\n-234 auto indices = std::make_index_sequence();\n-235 (forEachIndex)(std::forward(_\br_\ba_\bn_\bg_\be), std::forward(f), indices);\n-236 }\n-237\n-238 template\n-239 constexpr void forEach(Range&& _\br_\ba_\bn_\bg_\be, F&& f, PriorityTag<0>)\n-240 {\n-241 for(auto&& e : _\br_\ba_\bn_\bg_\be)\n-242 f(e);\n-243 }\n-244\n-245} // namespace Impl\n-246\n-247\n-248\n-267template\n-_\b2_\b6_\b8constexpr void _\bf_\bo_\br_\bE_\ba_\bc_\bh(Range&& _\br_\ba_\bn_\bg_\be, F&& f)\n-269{\n-270 Impl::forEach(std::forward(_\br_\ba_\bn_\bg_\be), std::forward(f),\n-_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b4_\b2_\b>());\n-271}\n-272\n-273\n-274\n-290template\n-_\b2_\b9_\b1constexpr T _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be(Range&& _\br_\ba_\bn_\bg_\be, T value, F&& f)\n-292{\n-293 _\bf_\bo_\br_\bE_\ba_\bc_\bh(std::forward(_\br_\ba_\bn_\bg_\be), [&](auto&& entry) {\n-294 value = f(value, entry);\n-295 });\n-296 return value;\n-297}\n-298\n-299\n-300\n-301namespace Impl {\n-302\n-303 struct Id {\n-304 template\n-305 constexpr T operator()(T&& x) const {\n-306 return std::forward(x);\n-307 }\n-308 };\n-309\n-310 template\n-311 constexpr decltype(auto) ifElse(std::true_type, IfFunc&& ifFunc, ElseFunc&&\n-/*elseFunc*/)\n-312 {\n-313 return ifFunc(Id{});\n-314 }\n-315\n-316 template\n-317 constexpr decltype(auto) ifElse(std::false_type, IfFunc&& /*ifFunc*/,\n-ElseFunc&& elseFunc)\n-318 {\n-319 return elseFunc(Id{});\n-320 }\n-321\n-322 template\n-323 decltype(auto) ifElse(const bool& condition, IfFunc&& ifFunc, ElseFunc&&\n-elseFunc)\n-324 {\n-325 if (condition)\n-326 return ifFunc(Id{});\n-327 else\n-328 return elseFunc(Id{});\n-329 }\n-330\n-331} // namespace Impl\n-332\n-333\n-334\n-355template\n-_\b3_\b5_\b6decltype(auto) _\bi_\bf_\bE_\bl_\bs_\be(const Condition& condition, IfFunc&& ifFunc,\n-ElseFunc&& elseFunc)\n-357{\n-358 return Impl::ifElse(condition, std::forward(ifFunc), std::\n-forward(elseFunc));\n-359}\n-360\n-368template\n-_\b3_\b6_\b9void _\bi_\bf_\bE_\bl_\bs_\be(const Condition& condition, IfFunc&& ifFunc)\n-370{\n-371 _\bi_\bf_\bE_\bl_\bs_\be(condition, std::forward(ifFunc), [](auto&&) {});\n-372}\n-373\n-374\n-375\n-376namespace Impl {\n-377\n-378 template\n-379 constexpr auto equals(const T1& /*t1*/, const T2& /*t2*/, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>) -\n-> decltype(T1::value, T2::value, std::integral_constant())\n-380 { return {}; }\n-381\n-382 template\n-383 constexpr auto equals(const T1& t1, const T2& t2, PriorityTag<0>)\n-384 {\n-385 return t1==t2;\n-386 }\n-387\n-388} // namespace Impl\n-389\n-390\n-391\n-401template\n-_\b4_\b0_\b2constexpr auto _\be_\bq_\bu_\ba_\bl_\bs(T1&& t1, T2&& t2)\n-403{\n-404 return Impl::equals(std::forward(t1), std::forward(t2),\n-_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b1_\b>());\n-405}\n-406\n-407\n-408\n-409namespace Impl {\n-410\n-411 template\n-412 constexpr Result switchCases(std::integer_sequence, const Value& /\n-*value*/, Branches&& /*branches*/, ElseBranch&& elseBranch)\n-413 {\n-414 return elseBranch();\n-415 }\n-416\n-417 template\n-418 constexpr Result switchCases(std::integer_sequence, const\n-Value& value, Branches&& branches, ElseBranch&& elseBranch)\n-419 {\n-420 return ifElse(\n-421 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(std::integral_constant(), value),\n-422 [&](auto id) -> decltype(auto) {\n-423 return id(branches)(std::integral_constant());\n-424 }, [&](auto id) -> decltype(auto) {\n-425 return Impl::switchCases(id(std::integer_sequence()),\n-value, branches, elseBranch);\n-426 });\n-427 }\n-428\n-429} // namespace Impl\n-430\n-431\n-432\n-460template\n-_\b4_\b6_\b1constexpr decltype(auto) _\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs(const Cases& cases, const Value& value,\n-Branches&& branches, ElseBranch&& elseBranch)\n-462{\n-463 return Impl::switchCases(cases, value, std::\n-forward(branches), std::forward(elseBranch));\n-464}\n-465\n-486template\n-_\b4_\b8_\b7constexpr void _\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs(const Cases& cases, const Value& value,\n-Branches&& branches)\n-488{\n-489 Impl::switchCases(cases, value, std::forward(branches), []\n-() {});\n-490}\n-491\n-492\n-493} // namespace Hybrid\n-494} // namespace Dune\n-495\n-496\n-497#endif // #ifndef DUNE_COMMON_HYBRIDUTILITIES_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-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\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-_\ba_\bs_\bs_\be_\br_\bt_\ba_\bn_\bd_\br_\be_\bt_\bu_\br_\bn_\b._\bh_\bh\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-_\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:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b0\n-constexpr index_constant< 0 > _0\n-Compile time index with value 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:53\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:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bi_\bz_\be\n-constexpr auto size(const T &t)\n-Size query.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-constexpr auto equals(T1 &&t1, T2 &&t2)\n-Equality comparison.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:402\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:268\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bs_\bw_\bi_\bt_\bc_\bh_\bC_\ba_\bs_\be_\bs\n-constexpr decltype(auto) switchCases(const Cases &cases, const Value &value,\n-Branches &&branches, ElseBranch &&elseBranch)\n-Switch statement.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:461\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bf_\bE_\bl_\bs_\be\n-decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc\n-&&elseFunc)\n-A conditional expression.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:356\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bi_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n-constexpr auto integralRange(const Begin &begin, const End &end)\n-Create an integral range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n-constexpr decltype(auto) elementAt(Container &&c, Index &&i)\n-Get element at given position from container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be\n-constexpr T accumulate(Range &&range, T value, F &&f)\n-Accumulate values.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hybridutilities.hh:291\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:462\n-_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bA_\bN_\bD_\b__\bR_\bE_\bT_\bU_\bR_\bN\n-#define DUNE_ASSERT_AND_RETURN(C, X)\n-Asserts a condition and return on success in constexpr context.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn assertandreturn.hh:22\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\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:_\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:95\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:175\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:225\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:_\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/a00251.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00251.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: typelist.hh File Reference\n+dune-common: selection.hh File Reference\n \n \n \n \n \n \n \n@@ -65,93 +65,53 @@\n \n \n \n \n \n \n \n
    \n \n-
    typelist.hh File Reference
    \n+Namespaces
    \n+ \n \n
    \n-
    #include <type_traits>
    \n-#include <tuple>
    \n-#include <utility>
    \n+\n+

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

    \n+
    #include "indexset.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-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::MetaType< T >
     A type that refers to another type. More...
     
    struct  Dune::IsTypeList< T >
     Check if given type is a TypeList. More...
     
    struct  Dune::IsTypeList< TypeList< T... > >
     Check if given type is a TypeList. More...
     
    struct  Dune::IsEmptyTypeList< T >
     Check if given type is an empty TypeList. More...
    class  Dune::SelectionIterator< TS, TG, TL, N >
     A const iterator over an uncached selection. More...
     
    struct  Dune::TypeListSize< T >
    class  Dune::UncachedSelection< TS, TG, TL, N >
     An uncached selection of indices. More...
     
    struct  Dune::TypeListSize< TypeList< T... > >
     Get size of TypeList. More...
     
    struct  Dune::TypeListElement< i, T >
     
    struct  Dune::TypeListElement< i, TypeList< T... > >
     Get element of TypeList. More...
    class  Dune::Selection< TS, TG, TL, N >
     A cached selection of indices. 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-Typedefs

    template<class... T>
    using Dune::TypeList = std::tuple< MetaType< T >... >
     A simple type list.
     
    template<std::size_t i, class T >
    using Dune::TypeListEntry_t = typename TypeListElement< i, T >::type
     Shortcut for TypeListElement<i, T>::type;.
     
    template<template< class... > class Target, class TL >
    using Dune::UnpackTypeList_t = typename Impl::UnpackTypeList< Target, TL >::type
     Unpack Dune::TypeList.
     
    template<template< class... > class Target, class... T>
    using Dune::UniqueTypes_t = typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type
     Remove duplicates from a list of types.
     
    template<class NonUniqueTypeList >
    using Dune::UniqueTypeList_t = typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type
     Remove duplicates from a Dune::TypeList.
     
    \n-\n-\n-\n-\n-\n

    \n-Functions

    template<class... T>
    constexpr auto Dune::uniqueTypeList (TypeList< T... > list)
     Remove duplicates from a Dune::TypeList.
     
    \n-
    \n+

    Detailed Description

    \n+

    Provides classes for selecting indices based on attribute flags.

    \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,70 +1,34 @@\n dune-common\u00a02.9.0\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-typelist.hh File Reference\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+selection.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 \"_\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/_\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n-\u00a0 A type that refers to another type. _\bM_\bo_\br_\be_\b._\b._\b.\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b _\b>\n-\u00a0 Check if given type is a TypeList. _\bM_\bo_\br_\be_\b._\b._\b.\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0 Check if given type is a TypeList. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bE_\bm_\bp_\bt_\by_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b _\b>\n-\u00a0 Check if given type is an empty TypeList. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bS_\bi_\bz_\be_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bS_\bi_\bz_\be_\b<_\b _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0 Get size of TypeList. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0 Get element of TypeList. _\bM_\bo_\br_\be_\b._\b._\b.\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 \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:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt = std::tuple< _\bM_\be_\bt_\ba_\bT_\by_\bp_\be< T >... >\n-\u00a0 A simple type list.\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bn_\bt_\br_\by_\b__\bt = typename _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt< i, T >::type\n-\u00a0 Shortcut for TypeListElement::type;.\n-\u00a0\n-template class Target, class TL >\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bp_\ba_\bc_\bk_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b__\bt = typename Impl::UnpackTypeList< Target, TL >::\n- type\n-\u00a0 Unpack _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt.\n-\u00a0\n-template class Target, class... T>\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bs_\b__\bt = typename Impl::UniqueTypesHelper< Target,\n- _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt< T... > >::type\n-\u00a0 Remove duplicates from a list of types.\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b__\bt = typename Impl::UniqueTypesHelper< _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt,\n- NonUniqueTypeList >::type\n-\u00a0 Remove duplicates from a _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt.\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:_\bu_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt (_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt< T... > list)\n-\u00a0 Remove duplicates from a _\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt.\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+ 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/a00251_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: typelist.hh Source File\n+dune-common: selection.hh Source File\n \n \n \n \n \n \n \n@@ -70,152 +70,322 @@\n \n \n \n \n \n \n \n
    \n-
    typelist.hh
    \n+
    selection.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 (C) 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_TYPELIST_HH
    \n-
    6#define DUNE_COMMON_TYPELIST_HH
    \n+
    5#ifndef DUNE_SELECTION_HH
    \n+
    6#define DUNE_SELECTION_HH
    \n
    7
    \n-
    8#include <type_traits>
    \n-
    9#include <tuple>
    \n-
    10#include <utility>
    \n-
    11
    \n-
    12namespace Dune {
    \n-
    13
    \n-
    32 template<class T>
    \n-
    \n-
    33 struct MetaType {
    \n-
    35 using type = T;
    \n-
    36 };
    \n-
    \n-
    37
    \n-
    86 template<class... T>
    \n-
    87 using TypeList = std::tuple<MetaType<T>...>;
    \n-
    88
    \n-
    89
    \n+
    8#include "indexset.hh"
    \n+\n+
    10
    \n+
    11namespace Dune
    \n+
    12{
    \n+
    27 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    29 {
    \n+
    30 public:
    \n+
    39 typedef TS AttributeSet;
    \n+
    40
    \n+\n+
    45
    \n+
    46 //typedef typename ParallelIndexSet::const_iterator ParallelIndexSetIterator;
    \n+
    47
    \n+
    48 typedef ConstArrayListIterator<IndexPair<TG,TL>, N, std::allocator<Dune::IndexPair<TG,TL> > > ParallelIndexSetIterator;
    \n+
    \n+\n+
    55 : iter_(iter), end_(end)
    \n+
    56 {
    \n+
    57 // Step to the first valid entry
    \n+
    58 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute()))
    \n+
    59 ++iter_;
    \n+
    60 }
    \n+
    \n+
    61
    \n+
    \n+\n+
    63 {
    \n+
    64 assert(iter_!=end_);
    \n+
    65 for(++iter_; iter_!=end_; ++iter_)
    \n+
    66 if(AttributeSet::contains(iter_->local().attribute()))
    \n+
    67 break;
    \n+
    68 }
    \n+
    \n+
    69
    \n+
    70
    \n+
    \n+
    71 uint32_t operator*() const
    \n+
    72 {
    \n+
    73 return iter_->local().local();
    \n+
    74 }
    \n+
    \n+
    75
    \n+
    \n+\n+
    77 {
    \n+
    78 return iter_ == other.iter_;
    \n+
    79 }
    \n+
    \n+
    80
    \n+
    \n+\n+
    82 {
    \n+
    83 return iter_ != other.iter_;
    \n+
    84 }
    \n+
    \n+
    85
    \n+
    86 private:
    \n+\n+
    88 const ParallelIndexSetIterator end_;
    \n+
    89 };
    \n+
    \n
    90
    \n-
    99 template<class T>
    \n-
    100 struct IsTypeList : std::false_type {};
    \n-
    101
    \n-
    107 template<class... T>
    \n-
    108 struct IsTypeList<TypeList<T...> > : std::true_type {};
    \n-
    109
    \n-
    110
    \n-
    111
    \n-
    120 template<class T>
    \n-
    121 struct IsEmptyTypeList : std::is_same<T, TypeList<> > {};
    \n-
    122
    \n-
    123
    \n-
    124
    \n-
    125 template<class T>
    \n-
    126 struct TypeListSize {};
    \n-
    127
    \n-
    136 template<class... T>
    \n-
    137 struct TypeListSize<TypeList<T...>> : std::integral_constant<std::size_t, sizeof...(T)> {};
    \n-
    138
    \n-
    139
    \n+
    91
    \n+
    95 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    97 {
    \n+
    98 public:
    \n+
    107 typedef TS AttributeSet;
    \n+
    108
    \n+
    112 typedef TG GlobalIndex;
    \n+
    113
    \n+
    120 typedef TL LocalIndex;
    \n+
    121
    \n+\n+
    126
    \n+\n+
    131
    \n+\n+
    136
    \n+
    \n+\n+
    138 : indexSet_()
    \n+
    139 {}
    \n+
    \n
    140
    \n-
    141 template<std::size_t i, class T>
    \n-\n-
    143
    \n-
    149 template<std::size_t i, class... T>
    \n-
    \n-
    150 struct TypeListElement<i, TypeList<T...>>
    \n-
    151 {
    \n-
    157 using type = typename std::tuple_element<i, std::tuple<T...>>::type;
    \n-
    158
    \n-
    164 using Type = type;
    \n-
    165 };
    \n+
    \n+\n+
    142 : indexSet_(&indexset)
    \n+
    143 {}
    \n
    \n+
    148 void setIndexSet(const ParallelIndexSet& indexset);
    \n+
    149
    \n+
    153 //const ParallelIndexSet& indexSet() const;
    \n+
    154
    \n+
    159 const_iterator begin() const;
    \n+
    160
    \n+
    165 const_iterator end() const;
    \n
    166
    \n-
    170 template<std::size_t i, class T>
    \n-\n+
    167
    \n+
    168 private:
    \n+
    169 const ParallelIndexSet* indexSet_;
    \n+
    170
    \n+
    171 };
    \n+
    \n
    172
    \n-
    173 namespace Impl {
    \n-
    174
    \n-
    175 template<template<class...> class Target, class ToDoList, class... Processed>
    \n-
    176 struct UniqueTypesHelper;
    \n-
    177
    \n-
    178 template<template<class...> class Target, class... Processed>
    \n-
    179 struct UniqueTypesHelper<Target, TypeList<>, Processed...>
    \n-
    180 {
    \n-
    181 using type = Target<Processed...>;
    \n-
    182 };
    \n-
    183
    \n-
    184 template<template<class...> class Target, class T0, class... T, class... Processed>
    \n-
    185 struct UniqueTypesHelper<Target, TypeList<T0, T...>, Processed...>
    \n-
    186 {
    \n-
    187 using type = std::conditional_t<
    \n-
    188 std::disjunction<std::is_same<T0, Processed>...>::value,
    \n-
    189 typename UniqueTypesHelper<Target, TypeList<T...>, Processed...>::type,
    \n-
    190 typename UniqueTypesHelper<Target, TypeList<T...>, T0, Processed...>::type>;
    \n-
    191 };
    \n-
    192
    \n-
    193 // Helper for unpacking Dune::TypeList
    \n-
    194 template<template<class...> class Target, class TL>
    \n-
    195 struct UnpackTypeList;
    \n-
    196
    \n-
    197 template<template<class...> class Target, class... T>
    \n-
    198 struct UnpackTypeList<Target, Dune::TypeList<T...>>
    \n-
    199 {
    \n-
    200 using type = Target<T...>;
    \n-
    201 };
    \n+
    176 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    178 {
    \n+
    179 public:
    \n+
    188 typedef TS AttributeSet;
    \n+
    189
    \n+
    193 typedef TG GlobalIndex;
    \n+
    194
    \n+
    201 typedef TL LocalIndex;
    \n
    202
    \n-
    203 } // namespace Impl
    \n-
    204
    \n-
    209 template<template<class...> class Target, class TL>
    \n-
    210 using UnpackTypeList_t = typename Impl::UnpackTypeList<Target, TL>::type;
    \n-
    211
    \n-
    219 template<template<class...> class Target, class... T>
    \n-
    220 using UniqueTypes_t = typename Impl::UniqueTypesHelper<Target, TypeList<T...>>::type;
    \n+\n+
    207
    \n+
    211 typedef uint32_t* iterator;
    \n+
    212
    \n+
    216 typedef uint32_t* const_iterator;
    \n+
    217
    \n+
    \n+\n+
    219 : selected_()
    \n+
    220 {}
    \n+
    \n
    221
    \n-
    227 template<class NonUniqueTypeList>
    \n-
    228 using UniqueTypeList_t = typename Impl::UniqueTypesHelper<TypeList, NonUniqueTypeList>::type;
    \n-
    229
    \n-
    235 template<class... T>
    \n-
    \n-
    236 constexpr auto uniqueTypeList(TypeList<T...> list)
    \n-
    237 {
    \n-
    238 return typename Impl::UniqueTypesHelper<TypeList, TypeList<T...>>::type{};
    \n-
    239 }
    \n+
    \n+\n+
    223 : selected_(), size_(0), built_(false)
    \n+
    224 {
    \n+
    225 setIndexSet(indexset);
    \n+
    226 }
    \n
    \n+
    227
    \n+
    228 ~Selection();
    \n+
    229
    \n+
    234 void setIndexSet(const ParallelIndexSet& indexset);
    \n+
    235
    \n+
    239 void free();
    \n
    240
    \n-
    241
    \n-
    242
    \n-
    243} // namespace Dune
    \n-
    244
    \n-
    245#endif // DUNE_COMMON_TYPELIST_HH
    \n-
    std::tuple< MetaType< T >... > TypeList
    A simple type list.
    Definition typelist.hh:87
    \n+
    244 //IndexSet indexSet() const;
    \n+
    245
    \n+
    250 const_iterator begin() const;
    \n+
    251
    \n+
    256 const_iterator end() const;
    \n+
    257
    \n+
    258
    \n+
    259 private:
    \n+
    260 uint32_t* selected_;
    \n+
    261 size_t size_;
    \n+
    262 bool built_;
    \n+
    263
    \n+
    264 };
    \n+
    \n+
    265
    \n+
    266 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    268 {
    \n+
    269 if(built_)
    \n+
    270 free();
    \n+
    271
    \n+
    272 // Count the number of entries the selection has to hold
    \n+\n+
    274 const const_iterator end = indexset.end();
    \n+
    275 int entries = 0;
    \n+
    276
    \n+
    277 for(const_iterator index = indexset.begin(); index != end; ++index)
    \n+
    278 if(AttributeSet::contains(index->local().attribute()))
    \n+
    279 ++entries;
    \n+
    280
    \n+
    281 selected_ = new uint32_t[entries];
    \n+
    282 built_ = true;
    \n+
    283
    \n+
    284 entries = 0;
    \n+
    285 for(const_iterator index = indexset.begin(); index != end; ++index)
    \n+
    286 if(AttributeSet::contains(index->local().attribute()))
    \n+
    287 selected_[entries++]= index->local().local();
    \n+
    288
    \n+
    289 size_=entries;
    \n+
    290 built_=true;
    \n+
    291 }
    \n+
    \n+
    292
    \n+
    293 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    295 {
    \n+
    296 return selected_;
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    299 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    301 {
    \n+
    302 return selected_+size_;
    \n+
    303 }
    \n+
    \n+
    304
    \n+
    305 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    307 {
    \n+
    308 delete[] selected_;
    \n+
    309 size_=0;
    \n+
    310 built_=false;
    \n+
    311 }
    \n+
    \n+
    312
    \n+
    313 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    315 {
    \n+
    316 if(built_)
    \n+
    317 free();
    \n+
    318 }
    \n+
    \n+
    319
    \n+
    320 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    322 {
    \n+
    323 return SelectionIterator<TS,TG,TL,N>(indexSet_->begin(),
    \n+
    324 indexSet_->end());
    \n+
    325 }
    \n+
    \n+
    326
    \n+
    327 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    329 {
    \n+
    330 return SelectionIterator<TS,TG,TL,N>(indexSet_->end(),
    \n+
    331 indexSet_->end());
    \n+
    332 }
    \n+
    \n+
    333 template<typename TS, typename TG, typename TL, int N>
    \n+
    \n+\n+
    335 {
    \n+
    336 indexSet_ = &indexset;
    \n+
    337 }
    \n+
    \n+
    338
    \n+
    342}
    \n+
    343#endif
    \n+
    This file implements iterator facade classes for writing stl conformant iterators.
    \n+
    Provides a map between global and local indices.
    \n+
    const_iterator end() const
    Get an iterator over the selected indices.
    Definition selection.hh:328
    \n+
    void setIndexSet(const ParallelIndexSet &indexset)
    Set the index set of the selection.
    Definition selection.hh:267
    \n+
    void setIndexSet(const ParallelIndexSet &indexset)
    Set the index set of the selection.
    Definition selection.hh:334
    \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:300
    \n+
    const_iterator begin() const
    Get the index set we are a selection for.
    Definition selection.hh:294
    \n+
    void free()
    Free allocated memory.
    Definition selection.hh:306
    \n+
    const_iterator begin() const
    Get the index set we are a selection for.
    Definition selection.hh:321
    \n+
    ~Selection()
    Definition selection.hh:314
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    typename Impl::UnpackTypeList< Target, TL >::type UnpackTypeList_t
    Unpack Dune::TypeList.
    Definition typelist.hh:210
    \n-
    constexpr auto uniqueTypeList(TypeList< T... > list)
    Remove duplicates from a Dune::TypeList.
    Definition typelist.hh:236
    \n-
    typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type UniqueTypes_t
    Remove duplicates from a list of types.
    Definition typelist.hh:220
    \n-
    typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type UniqueTypeList_t
    Remove duplicates from a Dune::TypeList.
    Definition typelist.hh:228
    \n-
    typename TypeListElement< i, T >::type TypeListEntry_t
    Shortcut for TypeListElement<i, T>::type;.
    Definition typelist.hh:171
    \n-
    A type that refers to another type.
    Definition typelist.hh:33
    \n-
    T type
    The referred-to type.
    Definition typelist.hh:35
    \n-
    Check if given type is a TypeList.
    Definition typelist.hh:100
    \n-
    Check if given type is an empty TypeList.
    Definition typelist.hh:121
    \n-
    Definition typelist.hh:126
    \n-
    Definition typelist.hh:142
    \n-
    typename std::tuple_element< i, std::tuple< T... > >::type type
    Export type of i-th element in TypeList.
    Definition typelist.hh:157
    \n-
    type Type
    Export type of i-th element in TypeList.
    Definition typelist.hh:164
    \n+
    A constant random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:370
    \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:29
    \n+
    ConstArrayListIterator< IndexPair< TG, TL >, N, std::allocator< Dune::IndexPair< TG, TL > > > ParallelIndexSetIterator
    Definition selection.hh:48
    \n+
    void operator++()
    Definition selection.hh:62
    \n+
    uint32_t operator*() const
    Definition selection.hh:71
    \n+
    TS AttributeSet
    The type of the Set of attributes.
    Definition selection.hh:39
    \n+
    Dune::ParallelIndexSet< TG, TL, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:44
    \n+
    SelectionIterator(const ParallelIndexSetIterator &iter, const ParallelIndexSetIterator &end)
    Constructor.
    Definition selection.hh:54
    \n+
    bool operator!=(const SelectionIterator< TS, TG, TL, N > &other) const
    Definition selection.hh:81
    \n+
    bool operator==(const SelectionIterator< TS, TG, TL, N > &other) const
    Definition selection.hh:76
    \n+
    An uncached selection of indices.
    Definition selection.hh:97
    \n+
    UncachedSelection()
    Definition selection.hh:137
    \n+
    SelectionIterator< TS, TG, TL, N > iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:130
    \n+
    TS AttributeSet
    The type of the Set of attributes.
    Definition selection.hh:107
    \n+
    iterator const_iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:135
    \n+
    TG GlobalIndex
    The type of the global index of the underlying index set.
    Definition selection.hh:112
    \n+
    UncachedSelection(const ParallelIndexSet &indexset)
    Definition selection.hh:141
    \n+
    Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:125
    \n+
    TL LocalIndex
    The type of the local index of the underlying index set.
    Definition selection.hh:120
    \n+
    A cached selection of indices.
    Definition selection.hh:178
    \n+
    TG GlobalIndex
    The type of the global index of the underlying index set.
    Definition selection.hh:193
    \n+
    Selection(const ParallelIndexSet &indexset)
    Definition selection.hh:222
    \n+
    Selection()
    Definition selection.hh:218
    \n+
    TL LocalIndex
    The type of the local index of the underlying index set.
    Definition selection.hh:201
    \n+
    TS AttributeSet
    The type of the set of attributes.
    Definition selection.hh:188
    \n+
    uint32_t * iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:211
    \n+
    uint32_t * const_iterator
    The type of the iterator of the selected indices.
    Definition selection.hh:216
    \n+
    Dune::ParallelIndexSet< GlobalIndex, LocalIndex, N > ParallelIndexSet
    The type of the underlying index set.
    Definition selection.hh:206
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,181 +1,386 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-typelist.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\n+selection.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 (C) 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_TYPELIST_HH\n-6#define DUNE_COMMON_TYPELIST_HH\n+5#ifndef DUNE_SELECTION_HH\n+6#define DUNE_SELECTION_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-12namespace _\bD_\bu_\bn_\be {\n-13\n-32 template\n-_\b3_\b3 struct _\bM_\be_\bt_\ba_\bT_\by_\bp_\be {\n-_\b3_\b5 using _\bt_\by_\bp_\be = T;\n-36 };\n-37\n-86 template\n-_\b8_\b7 using _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt = std::tuple...>;\n-88\n-89\n+8#include \"_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\"\n+9#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+10\n+11namespace _\bD_\bu_\bn_\be\n+12{\n+27 template\n+_\b2_\b8 class _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+29 {\n+30 public:\n+_\b3_\b9 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n+40\n+_\b4_\b4 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+45\n+46 //typedef typename ParallelIndexSet::const_iterator\n+ParallelIndexSetIterator;\n+47\n+_\b4_\b8 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_\b4 _\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+55 : iter_(iter), end_(end)\n+56 {\n+57 // Step to the first valid entry\n+58 while(iter_!=end_ && !AttributeSet::contains(iter_->local().attribute()))\n+59 ++iter_;\n+60 }\n+61\n+_\b6_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+63 {\n+64 assert(iter_!=end_);\n+65 for(++iter_; iter_!=end_; ++iter_)\n+66 if(AttributeSet::contains(iter_->local().attribute()))\n+67 break;\n+68 }\n+69\n+70\n+_\b7_\b1 uint32_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n+72 {\n+73 return iter_->local().local();\n+74 }\n+75\n+_\b7_\b6 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+77 {\n+78 return iter_ == other.iter_;\n+79 }\n+80\n+_\b8_\b1 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+82 {\n+83 return iter_ != other.iter_;\n+84 }\n+85\n+86 private:\n+87 _\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+88 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+89 };\n 90\n-99 template\n-_\b1_\b0_\b0 struct _\bI_\bs_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt : std::false_type {};\n-101\n-107 template\n-_\b1_\b0_\b8 struct _\bI_\bs_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt<_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt > : std::true_type {};\n-109\n-110\n-111\n-120 template\n-_\b1_\b2_\b1 struct _\bI_\bs_\bE_\bm_\bp_\bt_\by_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt : std::is_same > {};\n-122\n-123\n-124\n-125 template\n-_\b1_\b2_\b6 struct _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bS_\bi_\bz_\be {};\n-127\n-136 template\n-_\b1_\b3_\b7 struct _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bS_\bi_\bz_\be<_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt> : std::integral_constant {};\n-138\n-139\n+91\n+95 template\n+_\b9_\b6 class _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n+97 {\n+98 public:\n+_\b1_\b0_\b7 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n+108\n+_\b1_\b1_\b2 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+113\n+_\b1_\b2_\b0 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+121\n+_\b1_\b2_\b5 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+126\n+_\b1_\b3_\b0 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+131\n+_\b1_\b3_\b5 typedef _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+136\n+_\b1_\b3_\b7 _\bU_\bn_\bc_\ba_\bc_\bh_\be_\bd_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn()\n+138 : indexSet_()\n+139 {}\n 140\n-141 template\n-_\b1_\b4_\b2 struct _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt {};\n-143\n-149 template\n-_\b1_\b5_\b0 struct _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt>\n-151 {\n-_\b1_\b5_\b7 using _\bt_\by_\bp_\be = typename std::tuple_element>::type;\n-158\n-_\b1_\b6_\b4 using _\bT_\by_\bp_\be = _\bt_\by_\bp_\be;\n-165 };\n+_\b1_\b4_\b1 _\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+142 : indexSet_(&indexset)\n+143 {}\n+148 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+149\n+153 //const ParallelIndexSet& indexSet() const;\n+154\n+159 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+160\n+165 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n 166\n-170 template\n-_\b1_\b7_\b1 using _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bn_\bt_\br_\by_\b__\bt = typename _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt_\b<_\bi_\b,_\b _\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n+167\n+168 private:\n+169 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* indexSet_;\n+170\n+171 };\n 172\n-173 namespace Impl {\n-174\n-175 template class Target, class ToDoList, class...\n-Processed>\n-176 struct UniqueTypesHelper;\n-177\n-178 template class Target, class... Processed>\n-179 struct UniqueTypesHelper, Processed...>\n-180 {\n-181 using type = Target;\n-182 };\n-183\n-184 template class Target, class T0, class... T, class...\n-Processed>\n-185 struct UniqueTypesHelper, Processed...>\n-186 {\n-187 using type = std::conditional_t<\n-188 std::disjunction...>::value,\n-189 typename UniqueTypesHelper, Processed...>::type,\n-190 typename UniqueTypesHelper, T0, Processed...>::\n-type>;\n-191 };\n-192\n-193 // Helper for unpacking Dune::TypeList\n-194 template class Target, class TL>\n-195 struct UnpackTypeList;\n-196\n-197 template class Target, class... T>\n-198 struct UnpackTypeList>\n-199 {\n-200 using type = Target;\n-201 };\n+176 template\n+_\b1_\b7_\b7 class _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn\n+178 {\n+179 public:\n+_\b1_\b8_\b8 typedef TS _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n+189\n+_\b1_\b9_\b3 typedef TG _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+194\n+_\b2_\b0_\b1 typedef TL _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n 202\n-203 } // namespace Impl\n-204\n-209 template class Target, class TL>\n-_\b2_\b1_\b0 using _\bU_\bn_\bp_\ba_\bc_\bk_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b__\bt = typename Impl::UnpackTypeList::type;\n-211\n-219 template class Target, class... T>\n-_\b2_\b2_\b0 using _\bU_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bs_\b__\bt = typename Impl::UniqueTypesHelper>::type;\n+_\b2_\b0_\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<_\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+207\n+_\b2_\b1_\b1 typedef uint32_t* _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+212\n+_\b2_\b1_\b6 typedef uint32_t* _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+217\n+_\b2_\b1_\b8 _\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn()\n+219 : selected_()\n+220 {}\n 221\n-227 template\n-_\b2_\b2_\b8 using _\bU_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b__\bt = typename Impl::UniqueTypesHelper::type;\n+_\b2_\b2_\b2 _\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+223 : selected_(), size_(0), built_(false)\n+224 {\n+225 _\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(indexset);\n+226 }\n+227\n+228 _\b~_\bS_\be_\bl_\be_\bc_\bt_\bi_\bo_\bn();\n 229\n-235 template\n-_\b2_\b3_\b6 constexpr auto _\bu_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt(_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\bT_\b._\b._\b._\b> list)\n-237 {\n-238 return typename Impl::UniqueTypesHelper<_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt, _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt>::type{};\n-239 }\n+234 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+235\n+239 void _\bf_\br_\be_\be();\n 240\n-241\n-242\n-243} // namespace Dune\n-244\n-245#endif // DUNE_COMMON_TYPELIST_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt\n-std::tuple< MetaType< T >... > TypeList\n-A simple type list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:87\n+244 //IndexSet indexSet() const;\n+245\n+250 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+251\n+256 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+257\n+258\n+259 private:\n+260 uint32_t* selected_;\n+261 size_t size_;\n+262 bool built_;\n+263\n+264 };\n+265\n+266 template\n+_\b2_\b6_\b7 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+268 {\n+269 if(built_)\n+270 free();\n+271\n+272 // Count the number of entries the selection has to hold\n+273 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+274 const _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br end = indexset._\be_\bn_\bd();\n+275 int entries = 0;\n+276\n+277 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+278 if(AttributeSet::contains(index->local().attribute()))\n+279 ++entries;\n+280\n+281 selected_ = new uint32_t[entries];\n+282 built_ = true;\n+283\n+284 entries = 0;\n+285 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+286 if(AttributeSet::contains(index->local().attribute()))\n+287 selected_[entries++]= index->local().local();\n+288\n+289 size_=entries;\n+290 built_=true;\n+291 }\n+292\n+293 template\n+_\b2_\b9_\b4 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+295 {\n+296 return selected_;\n+297 }\n+298\n+299 template\n+_\b3_\b0_\b0 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+301 {\n+302 return selected_+size_;\n+303 }\n+304\n+305 template\n+_\b3_\b0_\b6 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+307 {\n+308 delete[] selected_;\n+309 size_=0;\n+310 built_=false;\n+311 }\n+312\n+313 template\n+_\b3_\b1_\b4 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+315 {\n+316 if(built_)\n+317 free();\n+318 }\n+319\n+320 template\n+_\b3_\b2_\b1 _\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+322 {\n+323 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+324 indexSet_->end());\n+325 }\n+326\n+327 template\n+_\b3_\b2_\b8 _\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+329 {\n+330 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+331 indexSet_->end());\n+332 }\n+333 template\n+_\b3_\b3_\b4 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+335 {\n+336 indexSet_ = &indexset;\n+337 }\n+338\n+342}\n+343#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+_\bi_\bn_\bd_\be_\bx_\bs_\be_\bt_\b._\bh_\bh\n+Provides a map between global and local indices.\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:328\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:267\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:334\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:_\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:300\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:294\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:306\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+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:321\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:314\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:_\bU_\bn_\bp_\ba_\bc_\bk_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b__\bt\n-typename Impl::UnpackTypeList< Target, TL >::type UnpackTypeList_t\n-Unpack Dune::TypeList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:210\n-_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt\n-constexpr auto uniqueTypeList(TypeList< T... > list)\n-Remove duplicates from a Dune::TypeList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:236\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bs_\b__\bt\n-typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type\n-UniqueTypes_t\n-Remove duplicates from a list of types.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:220\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bi_\bq_\bu_\be_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b__\bt\n-typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type\n-UniqueTypeList_t\n-Remove duplicates from a Dune::TypeList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:228\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bn_\bt_\br_\by_\b__\bt\n-typename TypeListElement< i, T >::type TypeListEntry_t\n-Shortcut for TypeListElement::type;.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\ba_\bT_\by_\bp_\be\n-A type that refers to another type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n-T type\n-The referred-to type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt\n-Check if given type is a TypeList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bE_\bm_\bp_\bt_\by_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt\n-Check if given type is an empty TypeList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bS_\bi_\bz_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-typename std::tuple_element< i, std::tuple< T... > >::type type\n-Export type of i-th element in TypeList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\bE_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n-type Type\n-Export type of i-th element in TypeList.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:164\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:370\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:29\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:48\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:62\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:71\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:39\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:44\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:54\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:81\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:76\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:97\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: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:_\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:130\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:107\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:135\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:112\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:141\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:125\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:120\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:178\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:193\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:222\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:218\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:201\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:188\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:211\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:216\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:206\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/a00254.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00254.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: fvector.hh File Reference\n+dune-common: remoteindices.hh File Reference\n \n \n \n \n \n \n \n@@ -65,90 +65,89 @@\n
    \n
    \n \n \n \n \n \n
    \n \n- \n+ \n
    \n
    \n \n-

    Implements a vector constructed from a given type representing a field and a compile-time given size. \n+

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

    \n-
    #include <array>
    \n-#include <cmath>
    \n-#include <cstddef>
    \n-#include <cstdlib>
    \n-#include <complex>
    \n-#include <cstring>
    \n+
    #include <cassert>
    \n+#include <iostream>
    \n+#include <ostream>
    \n+#include <map>
    \n+#include <memory>
    \n+#include <set>
    \n #include <utility>
    \n-#include <initializer_list>
    \n-#include <algorithm>
    \n-#include "typetraits.hh"
    \n-#include "exceptions.hh"
    \n-#include "ftraits.hh"
    \n-#include "densevector.hh"
    \n-#include "boundschecking.hh"
    \n-#include <dune/common/math.hh>
    \n-#include <dune/common/promotiontraits.hh>
    \n+#include <vector>
    \n+#include <mpi.h>
    \n+#include <dune/common/exceptions.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/sllist.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+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::DenseMatVecTraits< FieldVector< K, SIZE > >
    class  Dune::MPITraits< IndexPair< TG, ParallelLocalIndex< TA > > >
     
    struct  Dune::FieldTraits< FieldVector< K, SIZE > >
    class  Dune::RemoteIndex< T1, T2 >
     Information about an index residing on another processor. More...
     
    struct  Dune::IsFieldVectorSizeCorrect< C, SIZE >
     TMP to check the size of a DenseVectors statically, if possible. More...
    class  Dune::RemoteIndices< T, A >
     The indices present on remote processes. More...
     
    struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE >, SIZE >
    class  Dune::RemoteIndexListModifier< T, A, mode >
     Modifier for adding and/or deleting remote indices from the remote index list. More...
     
    struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE1 >, SIZE >
    class  Dune::RemoteIndexListModifier< T, A, mode >::InvalidPosition
     
    class  Dune::FieldVector< K, SIZE >
     vector space out of a tensor product of fields. More...
    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-\n-\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::MathOverloads
     namespace for customization of math functions with Dune-Semantics
     
    \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 K , int SIZE>
    auto Dune::MathOverloads::isFinite (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
     
    template<class K , int SIZE>
    bool Dune::MathOverloads::isInf (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
     
    template<class K , int SIZE, typename = std::enable_if_t<HasNaN<K>::value>>
    bool Dune::MathOverloads::isNaN (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
     
    template<class K , typename = std::enable_if_t<HasNaN<K>::value>>
    bool Dune::MathOverloads::isUnordered (const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
     
    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 vector constructed from a given type representing a field and a compile-time given size.

    \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,73 +1,72 @@\n dune-common\u00a02.9.0\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-fvector.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 vector constructed from a given type representing a field and a\n-compile-time given size. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \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 \"_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-#include \"_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n-#include \"_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-#include \"_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\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/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\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 \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_\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+#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 _\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b _\b>\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\b _\bC_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\n-\u00a0 TMP to check the size of a DenseVectors statically, if possible.\n- _\bM_\bo_\br_\be_\b._\b._\b.\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bS_\bI_\bZ_\bE_\b1_\b _\b>_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\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:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\n-\u00a0 vector space out of a tensor product of fields. _\bM_\bo_\br_\be_\b._\b._\b.\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-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 F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\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_\bF_\bi_\bn_\bi_\bt_\be (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, SIZE > &b,\n- _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n-\u00a0\n-template\n-bool\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, SIZE > &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg<\n- 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n-\u00a0\n-template::value>>\n-bool\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, SIZE > &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg<\n- 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n-\u00a0\n-template::value>>\n-bool\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, 1 > &b, const\n- _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, 1 > &c, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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 vector constructed from a given type representing a field and a\n-compile-time given size.\n+Classes describing a distributed indexset.\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/a00254_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: fvector.hh Source File\n+dune-common: remoteindices.hh Source File\n \n \n \n \n \n \n \n@@ -70,643 +70,1697 @@\n
    \n
    \n \n \n \n \n \n
    \n-
    fvector.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 (C) 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_FVECTOR_HH
    \n-
    6#define DUNE_FVECTOR_HH
    \n+
    5#ifndef DUNE_REMOTEINDICES_HH
    \n+
    6#define DUNE_REMOTEINDICES_HH
    \n
    7
    \n-
    8#include <array>
    \n-
    9#include <cmath>
    \n-
    10#include <cstddef>
    \n-
    11#include <cstdlib>
    \n-
    12#include <complex>
    \n-
    13#include <cstring>
    \n-
    14#include <utility>
    \n-
    15#include <initializer_list>
    \n-
    16#include <algorithm>
    \n-
    17
    \n-
    18#include "typetraits.hh"
    \n-
    19#include "exceptions.hh"
    \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 <utility>
    \n+
    17#include <vector>
    \n+
    18
    \n+
    19#include <mpi.h>
    \n
    20
    \n-
    21#include "ftraits.hh"
    \n-
    22#include "densevector.hh"
    \n-
    23#include "boundschecking.hh"
    \n-
    24
    \n-
    25#include <dune/common/math.hh>
    \n-\n+\n+\n+\n+\n+
    25#include <dune/common/sllist.hh>
    \n+\n
    27
    \n
    28namespace Dune {
    \n-
    29
    \n-
    39 template< class K, int SIZE > class FieldVector;
    \n-
    40 template< class K, int SIZE >
    \n+
    40 template<typename TG, typename TA>
    \n
    \n-\n+\n
    42 {
    \n-\n-
    44 typedef std::array<K,SIZE> container_type;
    \n-
    45 typedef K value_type;
    \n-
    46 typedef typename container_type::size_type size_type;
    \n+
    43 public:
    \n+
    44 inline static MPI_Datatype getType();
    \n+
    45 private:
    \n+
    46 static MPI_Datatype type;
    \n
    47 };
    \n
    \n
    48
    \n-
    49 template< class K, int SIZE >
    \n-
    \n-
    50 struct FieldTraits< FieldVector<K,SIZE> >
    \n-
    51 {
    \n-\n-\n-
    54 };
    \n-
    \n+
    49
    \n+
    50 template<typename T, typename A>
    \n+
    51 class RemoteIndices;
    \n+
    52
    \n+
    53 template<typename T1, typename T2>
    \n+
    54 class RemoteIndex;
    \n
    55
    \n-
    64 template<typename C, int SIZE>
    \n-
    \n-\n-
    66 {
    \n-
    71 constexpr static bool value = true;
    \n-
    72 };
    \n-
    \n-
    73
    \n-
    74 template<typename T, int SIZE>
    \n-
    \n-\n-
    76 {
    \n-
    77 constexpr static bool value = true;
    \n-
    78 };
    \n-
    \n-
    79
    \n-
    80 template<typename T, int SIZE, int SIZE1>
    \n-
    \n-\n-
    82 {
    \n-
    83 constexpr static bool value = false;
    \n-
    84 };
    \n-
    \n-
    85
    \n-
    86
    \n-
    92 template< class K, int SIZE >
    \n-
    \n-\n-
    94 public DenseVector< FieldVector<K,SIZE> >
    \n-
    95 {
    \n-
    96 std::array<K,SIZE> _data;
    \n-\n-
    98 public:
    \n-
    100 constexpr static int dimension = SIZE;
    \n-
    101
    \n-
    102 typedef typename Base::size_type size_type;
    \n-
    103 typedef typename Base::value_type value_type;
    \n-
    104
    \n-\n-
    107
    \n-\n-
    110
    \n-
    \n-
    112 constexpr FieldVector()
    \n-
    113 : _data{{}}
    \n-
    114 {}
    \n-
    \n-
    115
    \n-
    \n-
    117 explicit FieldVector (const K& t)
    \n-
    118 {
    \n-
    119 std::fill(_data.begin(),_data.end(),t);
    \n-
    120 }
    \n-
    \n-
    121
    \n-
    122#if __GNUC__ == 5 && !defined(__clang__)
    \n-
    123 // `... = default;` causes an internal compiler error on GCC 5.4 (Ubuntu 16.04)
    \n-
    125 FieldVector(const FieldVector& x) : _data(x._data) {}
    \n-
    126#else
    \n-
    128 FieldVector (const FieldVector&) = default;
    \n-
    129#endif
    \n-
    130
    \n-
    \n-
    132 FieldVector (std::initializer_list<K> const &l)
    \n-
    133 {
    \n-
    134 assert(l.size() == dimension);// Actually, this is not needed any more!
    \n-
    135 std::copy_n(l.begin(), std::min(static_cast<std::size_t>(dimension),
    \n-
    136 l.size()),
    \n-
    137 _data.begin());
    \n-
    138 }
    \n-
    \n-
    139
    \n-
    141 FieldVector& operator= (const FieldVector&) = default;
    \n-
    142
    \n-
    143 template <typename T>
    \n-
    \n-
    144 FieldVector& operator= (const FieldVector<T, SIZE>& x)
    \n-
    145 {
    \n-
    146 std::copy_n(x.begin(), SIZE, _data.begin());
    \n-
    147 return *this;
    \n-
    148 }
    \n-
    \n-
    149
    \n-
    150 template<typename T, int N>
    \n-\n-
    152
    \n-
    164 template<class C>
    \n-
    \n-\n-
    166 [[maybe_unused]] typename std::enable_if<IsFieldVectorSizeCorrect<C,SIZE>::value>::type* dummy=0)
    \n-
    167 {
    \n-
    168 // do a run-time size check, for the case that x is not a FieldVector
    \n-
    169 assert(x.size() == SIZE); // Actually this is not needed any more!
    \n-
    170 std::copy_n(x.begin(), std::min(static_cast<std::size_t>(SIZE),x.size()), _data.begin());
    \n-
    171 }
    \n-
    \n-
    172
    \n-
    174 template<class K1>
    \n-
    \n-\n-
    176 {
    \n-
    177 std::copy_n(x.begin(), SIZE, _data.begin());
    \n-
    178 }
    \n-
    \n-
    179
    \n-
    180 template<typename T, int N>
    \n-
    181 explicit FieldVector(const FieldVector<T, N>&) = delete;
    \n-
    182
    \n-
    183 using Base::operator=;
    \n-
    184
    \n-
    185 // make this thing a vector
    \n-
    186 static constexpr size_type size () { return SIZE; }
    \n-
    187
    \n-
    \n-\n-
    189 DUNE_ASSERT_BOUNDS(i < SIZE);
    \n-
    190 return _data[i];
    \n-
    191 }
    \n-
    \n-
    \n-
    192 const K & operator[](size_type i) const {
    \n-
    193 DUNE_ASSERT_BOUNDS(i < SIZE);
    \n-
    194 return _data[i];
    \n-
    195 }
    \n+
    56 // forward declaration needed for friend declaration.
    \n+
    57 template<typename T>
    \n+
    58 class IndicesSyncer;
    \n+
    59
    \n+
    60 template<typename T1, typename T2>
    \n+
    61 std::ostream& operator<<(std::ostream& os, const RemoteIndex<T1,T2>& index);
    \n+
    62
    \n+
    63
    \n+
    64 template<typename T, typename A, bool mode>
    \n+\n+
    66
    \n+
    67
    \n+
    71 template<typename T1, typename T2>
    \n+
    \n+\n+
    73 {
    \n+
    74 template<typename T>
    \n+
    75 friend class IndicesSyncer;
    \n+
    76
    \n+
    77 template<typename T, typename A, typename A1>
    \n+
    78 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >&,
    \n+\n+
    80 const T&);
    \n+
    81
    \n+
    82 template<typename T, typename A, bool mode>
    \n+\n+
    84
    \n+
    85 public:
    \n+
    90 typedef T1 GlobalIndex;
    \n+
    99 typedef T2 Attribute;
    \n+
    100
    \n+\n+\n+
    106
    \n+
    111 const Attribute attribute() const;
    \n+
    112
    \n+
    118 const PairType& localIndexPair() const;
    \n+
    119
    \n+
    123 RemoteIndex();
    \n+
    124
    \n+
    125
    \n+
    131 RemoteIndex(const T2& attribute,
    \n+
    132 const PairType* local);
    \n+
    133
    \n+
    134
    \n+
    140 RemoteIndex(const T2& attribute);
    \n+
    141
    \n+
    142 bool operator==(const RemoteIndex& ri) const;
    \n+
    143
    \n+
    144 bool operator!=(const RemoteIndex& ri) const;
    \n+
    145 private:
    \n+
    147 const PairType* localIndex_;
    \n+
    148
    \n+
    150 char attribute_;
    \n+
    151 };
    \n
    \n+
    152
    \n+
    153 template<class T, class A>
    \n+
    154 std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices);
    \n+
    155
    \n+
    156 class InterfaceBuilder;
    \n+
    157
    \n+
    158 template<class T, class A>
    \n+
    159 class CollectiveIterator;
    \n+
    160
    \n+
    161 // forward declaration needed for friend declaration.
    \n+
    162 template<class T>
    \n+
    163 class IndicesSyncer;
    \n+
    164
    \n+
    165 // forward declaration needed for friend declaration.
    \n+
    166 template<typename T1, typename T2>
    \n+\n+
    168
    \n+
    169
    \n+
    186 template<class T, class A=std::allocator<RemoteIndex<typename T::GlobalIndex,
    \n+
    187 typename T::LocalIndex::Attribute> > >
    \n+
    \n+\n+
    189 {
    \n+
    190 friend class InterfaceBuilder;
    \n+
    191 friend class IndicesSyncer<T>;
    \n+
    192 template<typename T1, typename A2, typename A1>
    \n+
    193 friend void repairLocalIndexPointers(std::map<int,SLList<std::pair<typename T1::GlobalIndex, typename T1::LocalIndex::Attribute>,A2> >&,
    \n+\n+
    195 const T1&);
    \n
    196
    \n-
    \n-
    198 K* data() noexcept
    \n-
    199 {
    \n-
    200 return _data.data();
    \n-
    201 }
    \n-
    \n+
    197 template<class G, class T1, class T2>
    \n+\n+
    199 friend std::ostream& operator<<<>(std::ostream&, const RemoteIndices<T>&);
    \n+
    200
    \n+
    201 public:
    \n
    202
    \n-
    \n-
    204 const K* data() const noexcept
    \n-
    205 {
    \n-
    206 return _data.data();
    \n-
    207 }
    \n-
    \n-
    208
    \n-
    210 template <class Scalar,
    \n-
    211 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n-
    \n-
    212 friend auto operator* ( const FieldVector& vector, Scalar scalar)
    \n-
    213 {
    \n-\n-
    215
    \n-
    216 for (size_type i = 0; i < vector.size(); ++i)
    \n-
    217 result[i] = vector[i] * scalar;
    \n-
    218
    \n-
    219 return result;
    \n-
    220 }
    \n-
    \n-
    221
    \n-
    223 template <class Scalar,
    \n-
    224 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n-
    \n-
    225 friend auto operator* ( Scalar scalar, const FieldVector& vector)
    \n-
    226 {
    \n-\n-
    228
    \n-
    229 for (size_type i = 0; i < vector.size(); ++i)
    \n-
    230 result[i] = scalar * vector[i];
    \n-
    231
    \n-
    232 return result;
    \n-
    233 }
    \n-
    \n-
    234
    \n-
    236 template <class Scalar,
    \n-
    237 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n-
    \n-
    238 friend auto operator/ ( const FieldVector& vector, Scalar scalar)
    \n-
    239 {
    \n-\n-
    241
    \n-
    242 for (size_type i = 0; i < vector.size(); ++i)
    \n-
    243 result[i] = vector[i] / scalar;
    \n-
    244
    \n-
    245 return result;
    \n-
    246 }
    \n-
    \n-
    247
    \n-
    248 };
    \n-
    \n-
    249
    \n-
    261 template<class K, int SIZE>
    \n-
    \n-
    262 inline std::istream &operator>> ( std::istream &in,
    \n-\n-
    264 {
    \n-\n-
    266 for( typename FieldVector<K, SIZE>::size_type i = 0; i < SIZE; ++i )
    \n-
    267 in >> w[ i ];
    \n-
    268 if(in)
    \n-
    269 v = w;
    \n-
    270 return in;
    \n-
    271 }
    \n-
    \n-
    272
    \n-
    273#ifndef DOXYGEN
    \n-
    274 template< class K >
    \n-
    275 struct DenseMatVecTraits< FieldVector<K,1> >
    \n-
    276 {
    \n-
    277 typedef FieldVector<K,1> derived_type;
    \n-
    278 typedef K container_type;
    \n-
    279 typedef K value_type;
    \n-
    280 typedef size_t size_type;
    \n-
    281 };
    \n-
    282
    \n-
    285 template<class K>
    \n-
    286 class FieldVector<K, 1> :
    \n-
    287 public DenseVector< FieldVector<K,1> >
    \n-
    288 {
    \n-
    289 K _data;
    \n-
    290 typedef DenseVector< FieldVector<K,1> > Base;
    \n-
    291 public:
    \n-
    293 constexpr static int dimension = 1;
    \n-
    294
    \n-
    295 typedef typename Base::size_type size_type;
    \n-
    296
    \n-
    298 typedef K& reference;
    \n-
    299
    \n-
    301 typedef const K& const_reference;
    \n-
    302
    \n-
    303 //===== construction
    \n+\n+
    207
    \n+\n+
    211
    \n+\n+
    216
    \n+
    217
    \n+\n+
    222
    \n+
    226 typedef typename LocalIndex::Attribute Attribute;
    \n+
    227
    \n+\n+
    232
    \n+
    233
    \n+
    237 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n+
    238
    \n+\n+\n+
    242
    \n+
    244 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n+\n+
    246
    \n+
    247 typedef typename RemoteIndexMap::const_iterator const_iterator;
    \n+
    248
    \n+
    266 inline RemoteIndices(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n+
    267 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>(), bool includeSelf=false);
    \n+
    268
    \n+\n+
    270
    \n+
    278 void setIncludeSelf(bool includeSelf);
    \n+
    279
    \n+
    296 void setIndexSets(const ParallelIndexSet& source, const ParallelIndexSet& destination,
    \n+
    297 const MPI_Comm& comm, const std::vector<int>& neighbours=std::vector<int>());
    \n+
    298
    \n+
    299 template<typename C>
    \n+
    \n+\n+
    301 {
    \n+
    302 neighbourIds.clear();
    \n+
    303 neighbourIds.insert(neighbours.begin(), neighbours.end());
    \n
    304
    \n-
    306 constexpr FieldVector ()
    \n-
    307 : _data()
    \n-
    308 {}
    \n-
    309
    \n-
    311 template<typename T,
    \n-
    312 typename EnableIf = typename std::enable_if<
    \n-
    313 std::is_convertible<T, K>::value &&
    \n-
    314 ! std::is_base_of<DenseVector<typename FieldTraits<T>::field_type>, K
    \n-
    315 >::value
    \n-
    316 >::type
    \n-
    317 >
    \n-
    318 FieldVector (const T& k) : _data(k) {}
    \n-
    319
    \n-
    321 template<class C,
    \n-
    322 std::enable_if_t<
    \n-
    323 std::is_assignable<K&, typename DenseVector<C>::value_type>::value, int> = 0>
    \n-
    324 FieldVector (const DenseVector<C> & x)
    \n-
    325 {
    \n-
    326 static_assert(((bool)IsFieldVectorSizeCorrect<C,1>::value), "FieldVectors do not match in dimension!");
    \n-
    327 assert(x.size() == 1);
    \n-
    328 _data = x[0];
    \n-
    329 }
    \n+
    305 }
    \n+
    \n+
    306
    \n+
    \n+
    307 const std::set<int>& getNeighbours() const
    \n+
    308 {
    \n+
    309 return neighbourIds;
    \n+
    310 }
    \n+
    \n+
    311
    \n+\n+
    316
    \n+
    326 template<bool ignorePublic>
    \n+
    327 void rebuild();
    \n+
    328
    \n+
    329 bool operator==(const RemoteIndices& ri) const;
    \n
    330
    \n-
    332 FieldVector(const FieldVector&) = default;
    \n-
    333
    \n-
    335 FieldVector& operator=(const FieldVector&) = default;
    \n-
    336
    \n-
    337 template <typename T>
    \n-
    338 FieldVector& operator= (const FieldVector<T, 1>& other)
    \n-
    339 {
    \n-
    340 _data = other[0];
    \n-
    341 return *this;
    \n-
    342 }
    \n-
    343
    \n-
    344 template<typename T, int N>
    \n-
    345 FieldVector& operator=(const FieldVector<T, N>&) = delete;
    \n-
    346
    \n-
    348 FieldVector (std::initializer_list<K> const &l)
    \n-
    349 {
    \n-
    350 assert(l.size() == 1);
    \n-
    351 _data = *l.begin();
    \n-
    352 }
    \n-
    353
    \n-
    355 template<typename T,
    \n-
    356 typename EnableIf = typename std::enable_if<
    \n-
    357 std::is_assignable<K&, T>::value &&
    \n-
    358 ! std::is_base_of<DenseVector<typename FieldTraits<T>::field_type>, K
    \n-
    359 >::value
    \n-
    360 >::type
    \n-
    361 >
    \n-
    362 inline FieldVector& operator= (const T& k)
    \n-
    363 {
    \n-
    364 _data = k;
    \n-
    365 return *this;
    \n-
    366 }
    \n-
    367
    \n-
    368 //===== forward methods to container
    \n-
    369 static constexpr size_type size () { return 1; }
    \n-
    370
    \n-
    371 K & operator[]([[maybe_unused]] size_type i)
    \n-
    372 {
    \n-
    373 DUNE_ASSERT_BOUNDS(i == 0);
    \n-
    374 return _data;
    \n-
    375 }
    \n-
    376 const K & operator[]([[maybe_unused]] size_type i) const
    \n-
    377 {
    \n-
    378 DUNE_ASSERT_BOUNDS(i == 0);
    \n-
    379 return _data;
    \n-
    380 }
    \n+
    338 inline bool isSynced() const;
    \n+
    339
    \n+
    343 inline MPI_Comm communicator() const;
    \n+
    344
    \n+
    359 template<bool mode, bool send>
    \n+\n+
    361
    \n+
    368 inline const_iterator find(int proc) const;
    \n+
    369
    \n+
    374 inline const_iterator begin() const;
    \n+
    375
    \n+
    380 inline const_iterator end() const;
    \n
    381
    \n-
    383 K* data() noexcept
    \n-
    384 {
    \n-
    385 return &_data;
    \n-
    386 }
    \n+
    385 template<bool send>
    \n+
    386 inline CollectiveIteratorT iterator() const;
    \n
    387
    \n-
    389 const K* data() const noexcept
    \n-
    390 {
    \n-
    391 return &_data;
    \n-
    392 }
    \n-
    393
    \n-
    394 //===== conversion operator
    \n-
    395
    \n-
    397 operator K& () { return _data; }
    \n+
    391 inline void free();
    \n+
    392
    \n+
    397 inline int neighbours() const;
    \n
    398
    \n-
    400 operator const K& () const { return _data; }
    \n-
    401 };
    \n-
    402
    \n-
    403 /* ----- FV / FV ----- */
    \n-
    404 /* mostly not necessary as these operations are already covered via the cast operator */
    \n-
    405
    \n-
    407 template<class K>
    \n-
    408 inline bool operator> (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n-
    409 {
    \n-
    410 return a[0]>b[0];
    \n-
    411 }
    \n-
    412
    \n-
    414 template<class K>
    \n-
    415 inline bool operator>= (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n-
    416 {
    \n-
    417 return a[0]>=b[0];
    \n-
    418 }
    \n-
    419
    \n-
    421 template<class K>
    \n-
    422 inline bool operator< (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n-
    423 {
    \n-
    424 return a[0]<b[0];
    \n-
    425 }
    \n-
    426
    \n-
    428 template<class K>
    \n-
    429 inline bool operator<= (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n-
    430 {
    \n-
    431 return a[0]<=b[0];
    \n-
    432 }
    \n-
    433
    \n-
    434 /* ----- FV / scalar ----- */
    \n-
    435
    \n-
    437 template<class K>
    \n-
    438 inline FieldVector<K,1> operator+ (const FieldVector<K,1>& a, const K b)
    \n-
    439 {
    \n-
    440 return a[0]+b;
    \n-
    441 }
    \n-
    442
    \n-
    444 template<class K>
    \n-
    445 inline FieldVector<K,1> operator- (const FieldVector<K,1>& a, const K b)
    \n-
    446 {
    \n-
    447 return a[0]-b;
    \n-
    448 }
    \n-
    449
    \n-
    451 template<class K>
    \n-
    452 inline FieldVector<K,1> operator* (const FieldVector<K,1>& a, const K b)
    \n-
    453 {
    \n-
    454 return a[0]*b;
    \n-
    455 }
    \n-
    456
    \n-
    458 template<class K>
    \n-
    459 inline FieldVector<K,1> operator/ (const FieldVector<K,1>& a, const K b)
    \n-
    460 {
    \n-
    461 return a[0]/b;
    \n-
    462 }
    \n-
    463
    \n-
    465 template<class K>
    \n-
    466 inline bool operator> (const FieldVector<K,1>& a, const K b)
    \n-
    467 {
    \n-
    468 return a[0]>b;
    \n-
    469 }
    \n-
    470
    \n-
    472 template<class K>
    \n-
    473 inline bool operator>= (const FieldVector<K,1>& a, const K b)
    \n-
    474 {
    \n-
    475 return a[0]>=b;
    \n-
    476 }
    \n-
    477
    \n-
    479 template<class K>
    \n-
    480 inline bool operator< (const FieldVector<K,1>& a, const K b)
    \n-
    481 {
    \n-
    482 return a[0]<b;
    \n-
    483 }
    \n-
    484
    \n-
    486 template<class K>
    \n-
    487 inline bool operator<= (const FieldVector<K,1>& a, const K b)
    \n-
    488 {
    \n-
    489 return a[0]<=b;
    \n-
    490 }
    \n-
    491
    \n-
    493 template<class K>
    \n-
    494 inline bool operator== (const FieldVector<K,1>& a, const K b)
    \n-
    495 {
    \n-
    496 return a[0]==b;
    \n-
    497 }
    \n-
    498
    \n-
    500 template<class K>
    \n-
    501 inline bool operator!= (const FieldVector<K,1>& a, const K b)
    \n-
    502 {
    \n-
    503 return a[0]!=b;
    \n-
    504 }
    \n-
    505
    \n-
    506 /* ----- scalar / FV ------ */
    \n-
    507
    \n-
    509 template<class K>
    \n-
    510 inline FieldVector<K,1> operator+ (const K a, const FieldVector<K,1>& b)
    \n-
    511 {
    \n-
    512 return a+b[0];
    \n-
    513 }
    \n-
    514
    \n-
    516 template<class K>
    \n-
    517 inline FieldVector<K,1> operator- (const K a, const FieldVector<K,1>& b)
    \n-
    518 {
    \n-
    519 return a-b[0];
    \n-
    520 }
    \n-
    521
    \n-
    523 template<class K>
    \n-
    524 inline FieldVector<K,1> operator* (const K a, const FieldVector<K,1>& b)
    \n-
    525 {
    \n-
    526 return a*b[0];
    \n-
    527 }
    \n-
    528
    \n-
    530 template<class K>
    \n-
    531 inline FieldVector<K,1> operator/ (const K a, const FieldVector<K,1>& b)
    \n-
    532 {
    \n-
    533 return a/b[0];
    \n-
    534 }
    \n-
    535
    \n-
    537 template<class K>
    \n-
    538 inline bool operator> (const K a, const FieldVector<K,1>& b)
    \n-
    539 {
    \n-
    540 return a>b[0];
    \n-
    541 }
    \n-
    542
    \n-
    544 template<class K>
    \n-
    545 inline bool operator>= (const K a, const FieldVector<K,1>& b)
    \n-
    546 {
    \n-
    547 return a>=b[0];
    \n-
    548 }
    \n-
    549
    \n-
    551 template<class K>
    \n-
    552 inline bool operator< (const K a, const FieldVector<K,1>& b)
    \n-
    553 {
    \n-
    554 return a<b[0];
    \n-
    555 }
    \n-
    556
    \n-
    558 template<class K>
    \n-
    559 inline bool operator<= (const K a, const FieldVector<K,1>& b)
    \n-
    560 {
    \n-
    561 return a<=b[0];
    \n-
    562 }
    \n-
    563
    \n-
    565 template<class K>
    \n-
    566 inline bool operator== (const K a, const FieldVector<K,1>& b)
    \n-
    567 {
    \n-
    568 return a==b[0];
    \n-
    569 }
    \n-
    570
    \n-
    572 template<class K>
    \n-
    573 inline bool operator!= (const K a, const FieldVector<K,1>& b)
    \n-
    574 {
    \n-
    575 return a!=b[0];
    \n-
    576 }
    \n-
    577#endif
    \n-
    578
    \n-
    579 /* Overloads for common classification functions */
    \n-
    \n-
    580 namespace MathOverloads {
    \n-
    581
    \n-
    582 // ! Returns whether all entries are finite
    \n-
    583 template<class K, int SIZE>
    \n-
    \n-\n-
    585 bool out = true;
    \n-
    586 for(int i=0; i<SIZE; i++) {
    \n-
    587 out &= Dune::isFinite(b[i]);
    \n-
    588 }
    \n-
    589 return out;
    \n-
    590 }
    \n-
    \n-
    591
    \n-
    592 // ! Returns whether any entry is infinite
    \n-
    593 template<class K, int SIZE>
    \n-
    \n-\n-
    595 bool out = false;
    \n-
    596 for(int i=0; i<SIZE; i++) {
    \n-
    597 out |= Dune::isInf(b[i]);
    \n-
    598 }
    \n-
    599 return out;
    \n-
    600 }
    \n-
    \n-
    601
    \n-
    602 // ! Returns whether any entry is NaN
    \n-
    603 template<class K, int SIZE, typename = std::enable_if_t<HasNaN<K>::value>>
    \n-
    \n-\n-
    605 bool out = false;
    \n-
    606 for(int i=0; i<SIZE; i++) {
    \n-
    607 out |= Dune::isNaN(b[i]);
    \n-
    608 }
    \n-
    609 return out;
    \n-
    610 }
    \n-
    \n-
    611
    \n-
    612 // ! Returns true if either b or c is NaN
    \n-
    613 template<class K, typename = std::enable_if_t<HasNaN<K>::value>>
    \n-
    \n-\n-\n-
    616 return Dune::isUnordered(b[0],c[0]);
    \n-
    617 }
    \n-
    \n-
    618 } //MathOverloads
    \n-
    \n-
    619
    \n-
    622} // end namespace
    \n-
    623
    \n-
    624#endif
    \n-
    Some useful basic math stuff.
    \n-
    Type traits to determine the type of reals (when working with complex numbers)
    \n-
    Implements the dense vector interface, with an exchangeable storage class.
    \n-
    Macro for wrapping boundary checks.
    \n-
    Traits for type conversions and type information.
    \n-
    Compute type of the result of an arithmetic operation involving two different number types.
    \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-
    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:556
    \n+
    400 inline const ParallelIndexSet& sourceIndexSet() const;
    \n+
    401
    \n+
    403 inline const ParallelIndexSet& destinationIndexSet() const;
    \n+
    404
    \n+
    405 private:
    \n+
    407 RemoteIndices(const RemoteIndices&) = delete;
    \n+
    408
    \n+
    410 const ParallelIndexSet* source_;
    \n+
    411
    \n+
    413 const ParallelIndexSet* target_;
    \n+
    414
    \n+
    416 MPI_Comm comm_;
    \n+
    417
    \n+
    420 std::set<int> neighbourIds;
    \n+
    421
    \n+
    423 const static int commTag_=333;
    \n+
    424
    \n+
    429 int sourceSeqNo_;
    \n+
    430
    \n+
    435 int destSeqNo_;
    \n+
    436
    \n+
    440 bool publicIgnored;
    \n+
    441
    \n+
    445 bool firstBuild;
    \n+
    446
    \n+
    447 /*
    \n+
    448 * @brief If true, sending from indices of the processor to other
    \n+
    449 * indices on the same processor is enabled even if the same indexset is used
    \n+
    450 * on both the
    \n+
    451 * sending and receiving side.
    \n+
    452 */
    \n+
    453 bool includeSelf;
    \n+
    454
    \n+\n+
    457 PairType;
    \n+
    458
    \n+
    465 RemoteIndexMap remoteIndices_;
    \n+
    466
    \n+
    477 template<bool ignorePublic>
    \n+
    478 inline void buildRemote(bool includeSelf);
    \n+
    479
    \n+
    485 inline int noPublic(const ParallelIndexSet& indexSet);
    \n+
    486
    \n+
    498 template<bool ignorePublic>
    \n+
    499 inline void packEntries(PairType** myPairs, const ParallelIndexSet& indexSet,
    \n+
    500 char* p_out, MPI_Datatype type, int bufferSize,
    \n+
    501 int* position, int n);
    \n+
    502
    \n+
    516 inline void unpackIndices(RemoteIndexList& remote, int remoteEntries,
    \n+
    517 PairType** local, int localEntries, char* p_in,
    \n+
    518 MPI_Datatype type, int* position, int bufferSize,
    \n+
    519 bool fromOurself);
    \n+
    520
    \n+
    521 inline void unpackIndices(RemoteIndexList& send, RemoteIndexList& receive,
    \n+
    522 int remoteEntries, PairType** localSource,
    \n+
    523 int localSourceEntries, PairType** localDest,
    \n+
    524 int localDestEntries, char* p_in,
    \n+
    525 MPI_Datatype type, int* position, int bufferSize);
    \n+
    526
    \n+
    527 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType** DestPairs,
    \n+
    528 int remoteProc, int sourcePublish, int destPublish,
    \n+
    529 int bufferSize, bool sendTwo, bool fromOurSelf=false);
    \n+
    530 };
    \n+
    \n+
    531
    \n+
    549 template<class T, class A, bool mode>
    \n+
    \n+\n+
    551 {
    \n+
    552
    \n+
    553 template<typename T1, typename A1>
    \n+
    554 friend class RemoteIndices;
    \n+
    555
    \n+
    556 public:
    \n+
    \n+\n+
    558 {};
    \n+
    \n+
    559
    \n+
    568 constexpr static bool MODIFYINDEXSET = mode;
    \n+
    569
    \n+\n+
    574
    \n+\n+
    579
    \n+\n+
    584
    \n+
    588 typedef typename LocalIndex::Attribute Attribute;
    \n+
    589
    \n+\n+
    594
    \n+
    598 typedef A Allocator;
    \n+
    599
    \n+\n+\n+
    603
    \n+\n+
    608
    \n+\n+
    613
    \n+
    627 void insert(const RemoteIndex& index);
    \n+
    628
    \n+
    629
    \n+
    644 void insert(const RemoteIndex& index, const GlobalIndex& global);
    \n+
    645
    \n+
    653 bool remove(const GlobalIndex& global);
    \n+
    654
    \n+\n+
    668
    \n+
    669
    \n+\n+
    671
    \n+
    \n+\n+
    677 : glist_()
    \n+
    678 {}
    \n+
    \n+
    679
    \n+
    680 private:
    \n+
    681
    \n+\n+
    688 RemoteIndexList& rList);
    \n+
    689
    \n+
    690 typedef SLList<GlobalIndex,Allocator> GlobalList;
    \n+
    691 typedef typename GlobalList::ModifyIterator GlobalModifyIterator;
    \n+
    692 RemoteIndexList* rList_;
    \n+
    693 const ParallelIndexSet* indexSet_;
    \n+
    694 GlobalList glist_;
    \n+
    695 ModifyIterator iter_;
    \n+
    696 GlobalModifyIterator giter_;
    \n+
    697 ConstIterator end_;
    \n+
    698 bool first_;
    \n+
    699 GlobalIndex last_;
    \n+
    700 };
    \n+
    \n+
    701
    \n+
    706 template<class T, class A>
    \n+
    \n+\n+
    708 {
    \n+
    709
    \n+
    713 typedef T ParallelIndexSet;
    \n+
    714
    \n+
    718 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n+
    719
    \n+
    723 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n+
    724
    \n+
    728 typedef typename LocalIndex::Attribute Attribute;
    \n+
    729
    \n+\n+
    732
    \n+
    734 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<RemoteIndex>;
    \n+
    735
    \n+\n+
    738
    \n+
    740 typedef std::map<int,std::pair<typename RemoteIndexList::const_iterator,
    \n+
    741 const typename RemoteIndexList::const_iterator> >
    \n+
    742 Map;
    \n+
    743
    \n+
    744 public:
    \n+
    745
    \n+
    747 typedef std::map<int, std::pair<RemoteIndexList*,RemoteIndexList*> >
    \n+\n+
    749
    \n+
    755 inline CollectiveIterator(const RemoteIndexMap& map_, bool send);
    \n+
    756
    \n+
    765 inline void advance(const GlobalIndex& global);
    \n+
    766
    \n+
    776 inline void advance(const GlobalIndex& global, const Attribute& attribute);
    \n+
    777
    \n+\n+
    779
    \n+
    783 inline bool empty() const;
    \n+
    784
    \n+
    \n+\n+
    792 {
    \n+
    793 public:
    \n+
    794 typedef typename Map::iterator RealIterator;
    \n+
    795 typedef typename Map::iterator ConstRealIterator;
    \n+
    796
    \n+
    797
    \n+
    \n+
    799 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex& index)
    \n+
    800 : iter_(iter), end_(end), index_(index), hasAttribute(false)
    \n+
    801 {
    \n+
    802 // Move to the first valid entry
    \n+
    803 while(iter_!=end_ && iter_->second.first->localIndexPair().global()!=index_)
    \n+
    804 ++iter_;
    \n+
    805 }
    \n+
    \n+
    806
    \n+
    \n+
    807 iterator(const RealIterator& iter, const ConstRealIterator& end, GlobalIndex index,
    \n+
    808 Attribute attribute)
    \n+
    809 : iter_(iter), end_(end), index_(index), attribute_(attribute), hasAttribute(true)
    \n+
    810 {
    \n+
    811 // Move to the first valid entry or the end
    \n+
    812 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_
    \n+
    813 || iter_->second.first->localIndexPair().local().attribute()!=attribute))
    \n+
    814 ++iter_;
    \n+
    815 }
    \n+
    \n+
    \n+
    817 iterator(const iterator& other)
    \n+
    818 : iter_(other.iter_), end_(other.end_), index_(other.index_)
    \n+
    819 { }
    \n+
    \n+
    820
    \n+
    \n+\n+
    823 {
    \n+
    824 ++iter_;
    \n+
    825 // If entry is not valid move on
    \n+
    826 while(iter_!=end_ && (iter_->second.first->localIndexPair().global()!=index_ ||
    \n+
    827 (hasAttribute &&
    \n+
    828 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))
    \n+
    829 ++iter_;
    \n+
    830 assert(iter_==end_ ||
    \n+
    831 (iter_->second.first->localIndexPair().global()==index_));
    \n+
    832 assert(iter_==end_ || !hasAttribute ||
    \n+
    833 (iter_->second.first->localIndexPair().local().attribute()==attribute_));
    \n+
    834 return *this;
    \n+
    835 }
    \n+
    \n+
    836
    \n+
    \n+
    838 const RemoteIndex& operator*() const
    \n+
    839 {
    \n+
    840 return *(iter_->second.first);
    \n+
    841 }
    \n+
    \n+
    842
    \n+
    \n+
    844 int process() const
    \n+
    845 {
    \n+
    846 return iter_->first;
    \n+
    847 }
    \n+
    \n+
    848
    \n+
    \n+
    850 const RemoteIndex* operator->() const
    \n+
    851 {
    \n+
    852 return iter_->second.first.operator->();
    \n+
    853 }
    \n+
    \n+
    854
    \n+
    \n+
    856 bool operator==(const iterator& other) const
    \n+
    857 {
    \n+
    858 return other.iter_==iter_;
    \n+
    859 }
    \n+
    \n+
    860
    \n+
    \n+
    862 bool operator!=(const iterator& other) const
    \n+
    863 {
    \n+
    864 return other.iter_!=iter_;
    \n+
    865 }
    \n+
    \n+
    866
    \n+
    867 private:
    \n+
    868 iterator();
    \n+
    869
    \n+
    870 RealIterator iter_;
    \n+
    871 RealIterator end_;
    \n+
    872 GlobalIndex index_;
    \n+
    873 Attribute attribute_;
    \n+
    874 bool hasAttribute;
    \n+
    875 };
    \n+
    \n+
    876
    \n+
    877 iterator begin();
    \n+
    878
    \n+
    879 iterator end();
    \n+
    880
    \n+
    881 private:
    \n+
    882
    \n+
    883 Map map_;
    \n+
    884 GlobalIndex index_;
    \n+
    885 Attribute attribute_;
    \n+
    886 bool noattribute;
    \n+
    887 };
    \n+
    \n+
    888
    \n+
    889 template<typename TG, typename TA>
    \n+
    \n+\n+
    891 {
    \n+
    892 if(type==MPI_DATATYPE_NULL) {
    \n+
    893 int length[2] = {1, 1};
    \n+
    894 MPI_Aint base;
    \n+
    895 MPI_Aint disp[2];
    \n+
    896 MPI_Datatype types[2] = {MPITraits<TG>::getType(),
    \n+\n+\n+
    899 MPI_Get_address(&rep, &base); // lower bound of the datatype
    \n+
    900 MPI_Get_address(&(rep.global_), &disp[0]);
    \n+
    901 MPI_Get_address(&(rep.local_), &disp[1]);
    \n+
    902 for (MPI_Aint& d : disp)
    \n+
    903 d -= base;
    \n+
    904
    \n+
    905 MPI_Datatype tmp;
    \n+
    906 MPI_Type_create_struct(2, length, disp, types, &tmp);
    \n+
    907
    \n+
    908 MPI_Type_create_resized(tmp, 0, sizeof(IndexPair<TG,ParallelLocalIndex<TA> >), &type);
    \n+
    909 MPI_Type_commit(&type);
    \n+
    910
    \n+
    911 MPI_Type_free(&tmp);
    \n+
    912 }
    \n+
    913 return type;
    \n+
    914 }
    \n+
    \n+
    915
    \n+
    916 template<typename TG, typename TA>
    \n+
    917 MPI_Datatype MPITraits<IndexPair<TG,ParallelLocalIndex<TA> > >::type=MPI_DATATYPE_NULL;
    \n+
    918
    \n+
    919 template<typename T1, typename T2>
    \n+
    \n+
    920 RemoteIndex<T1,T2>::RemoteIndex(const T2& attribute, const PairType* local)
    \n+
    921 : localIndex_(local), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n+
    922 {}
    \n+
    \n+
    923
    \n+
    924 template<typename T1, typename T2>
    \n+
    \n+\n+
    926 : localIndex_(0), attribute_(static_cast<std::underlying_type_t<T2>>(attribute))
    \n+
    927 {}
    \n+
    \n+
    928
    \n+
    929 template<typename T1, typename T2>
    \n+
    \n+\n+
    931 : localIndex_(0), attribute_()
    \n+
    932 {}
    \n+
    \n+
    933 template<typename T1, typename T2>
    \n+
    \n+
    934 inline bool RemoteIndex<T1,T2>::operator==(const RemoteIndex& ri) const
    \n+
    935 {
    \n+
    936 return localIndex_==ri.localIndex_ && attribute_==ri.attribute;
    \n+
    937 }
    \n+
    \n+
    938
    \n+
    939 template<typename T1, typename T2>
    \n+
    \n+
    940 inline bool RemoteIndex<T1,T2>::operator!=(const RemoteIndex& ri) const
    \n+
    941 {
    \n+
    942 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;
    \n+
    943 }
    \n+
    \n+
    944
    \n+
    945 template<typename T1, typename T2>
    \n+
    \n+
    946 inline const T2 RemoteIndex<T1,T2>::attribute() const
    \n+
    947 {
    \n+
    948 return T2(attribute_);
    \n+
    949 }
    \n+
    \n+
    950
    \n+
    951 template<typename T1, typename T2>
    \n+
    \n+\n+
    953 {
    \n+
    954 return *localIndex_;
    \n+
    955 }
    \n+
    \n+
    956
    \n+
    957 template<typename T, typename A>
    \n+
    \n+\n+
    959 const ParallelIndexSet& destination,
    \n+
    960 const MPI_Comm& comm,
    \n+
    961 const std::vector<int>& neighbours,
    \n+
    962 bool includeSelf_)
    \n+
    963 : source_(&source), target_(&destination), comm_(comm),
    \n+
    964 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n+
    965 includeSelf(includeSelf_)
    \n+
    966 {
    \n+\n+
    968 }
    \n+
    \n+
    969
    \n+
    970 template<typename T, typename A>
    \n+
    \n+\n+
    972 {
    \n+
    973 includeSelf=b;
    \n+
    974 }
    \n+
    \n+
    975
    \n+
    976 template<typename T, typename A>
    \n+
    \n+\n+
    978 : source_(0), target_(0), sourceSeqNo_(-1),
    \n+
    979 destSeqNo_(-1), publicIgnored(false), firstBuild(true),
    \n+
    980 includeSelf(false)
    \n+
    981 {}
    \n+
    \n+
    982
    \n+
    983 template<class T, typename A>
    \n+
    \n+\n+
    985 const ParallelIndexSet& destination,
    \n+
    986 const MPI_Comm& comm,
    \n+
    987 const std::vector<int>& neighbours)
    \n+
    988 {
    \n+
    989 free();
    \n+
    990 source_ = &source;
    \n+
    991 target_ = &destination;
    \n+
    992 comm_ = comm;
    \n+
    993 firstBuild = true;
    \n+
    994 setNeighbours(neighbours);
    \n+
    995 }
    \n+
    \n+
    996
    \n+
    997 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1000 {
    \n+
    1001 return *source_;
    \n+
    1002 }
    \n+
    \n+
    1003
    \n+
    1004
    \n+
    1005 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1008 {
    \n+
    1009 return *target_;
    \n+
    1010 }
    \n+
    \n+
    1011
    \n+
    1012
    \n+
    1013 template<typename T, typename A>
    \n+
    \n+\n+
    1015 {
    \n+
    1016 free();
    \n+
    1017 }
    \n+
    \n+
    1018
    \n+
    1019 template<typename T, typename A>
    \n+
    1020 template<bool ignorePublic>
    \n+
    \n+\n+
    1022 const ParallelIndexSet& indexSet,
    \n+
    1023 char* p_out, MPI_Datatype type,
    \n+
    1024 int bufferSize,
    \n+
    1025 int *position,
    \n+
    1026 [[maybe_unused]] int n)
    \n+
    1027 {
    \n+
    1028 // fill with own indices
    \n+
    1029 const auto end = indexSet.end();
    \n+
    1030
    \n+
    1031 //Now pack the source indices
    \n+
    1032 int i=0;
    \n+
    1033 for(auto index = indexSet.begin(); index != end; ++index)
    \n+
    1034 if(ignorePublic || index->local().isPublic()) {
    \n+
    1035
    \n+
    1036 MPI_Pack(const_cast<PairType*>(&(*index)), 1,
    \n+
    1037 type,
    \n+
    1038 p_out, bufferSize, position, comm_);
    \n+
    1039 pairs[i++] = const_cast<PairType*>(&(*index));
    \n+
    1040
    \n+
    1041 }
    \n+
    1042 assert(i==n);
    \n+
    1043 }
    \n+
    \n+
    1044
    \n+
    1045 template<typename T, typename A>
    \n+
    1046 inline int RemoteIndices<T,A>::noPublic(const ParallelIndexSet& indexSet)
    \n+
    1047 {
    \n+
    1048
    \n+
    1049 int noPublic=0;
    \n+
    1050
    \n+
    1051 const auto end=indexSet.end();
    \n+
    1052 for(auto index=indexSet.begin(); index!=end; ++index)
    \n+
    1053 if(index->local().isPublic())
    \n+
    1054 noPublic++;
    \n+
    1055
    \n+
    1056 return noPublic;
    \n+
    1057
    \n+
    1058 }
    \n+
    1059
    \n+
    1060
    \n+
    1061 template<typename T, typename A>
    \n+
    1062 inline void RemoteIndices<T,A>::unpackCreateRemote(char* p_in, PairType** sourcePairs,
    \n+
    1063 PairType** destPairs, int remoteProc,
    \n+
    1064 int sourcePublish, int destPublish,
    \n+
    1065 int bufferSize, bool sendTwo,
    \n+
    1066 bool fromOurSelf)
    \n+
    1067 {
    \n+
    1068
    \n+
    1069 // unpack the number of indices we received
    \n+
    1070 int noRemoteSource=-1, noRemoteDest=-1;
    \n+
    1071 char twoIndexSets=0;
    \n+
    1072 int position=0;
    \n+
    1073 // Did we receive two index sets?
    \n+
    1074 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR, comm_);
    \n+
    1075 // The number of source indices received
    \n+
    1076 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT, comm_);
    \n+
    1077 // The number of destination indices received
    \n+
    1078 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);
    \n+
    1079
    \n+
    1080
    \n+
    1081 // Indices for which we receive
    \n+
    1082 RemoteIndexList* receive= new RemoteIndexList();
    \n+
    1083 // Indices for which we send
    \n+
    1084 RemoteIndexList* send=0;
    \n+
    1085
    \n+
    1086 MPI_Datatype type= MPITraits<PairType>::getType();
    \n+
    1087
    \n+
    1088 if(!twoIndexSets) {
    \n+
    1089 if(sendTwo) {
    \n+
    1090 send = new RemoteIndexList();
    \n+
    1091 // Create both remote index sets simultaneously
    \n+
    1092 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,
    \n+
    1093 destPairs, destPublish, p_in, type, &position, bufferSize);
    \n+
    1094 }else{
    \n+
    1095 // we only need one list
    \n+
    1096 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,
    \n+
    1097 p_in, type, &position, bufferSize, fromOurSelf);
    \n+
    1098 send=receive;
    \n+
    1099 }
    \n+
    1100 }else{
    \n+
    1101
    \n+
    1102 int oldPos=position;
    \n+
    1103 // Two index sets received
    \n+
    1104 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,
    \n+
    1105 p_in, type, &position, bufferSize, fromOurSelf);
    \n+
    1106 if(!sendTwo)
    \n+
    1107 //unpack source entries again as destination entries
    \n+
    1108 position=oldPos;
    \n+
    1109
    \n+
    1110 send = new RemoteIndexList();
    \n+
    1111 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,
    \n+
    1112 p_in, type, &position, bufferSize, fromOurSelf);
    \n+
    1113 }
    \n+
    1114
    \n+
    1115 if(receive->empty() && send->empty()) {
    \n+
    1116 if(send==receive) {
    \n+
    1117 delete send;
    \n+
    1118 }else{
    \n+
    1119 delete send;
    \n+
    1120 delete receive;
    \n+
    1121 }
    \n+
    1122 }else{
    \n+
    1123 remoteIndices_.insert(std::make_pair(remoteProc,
    \n+
    1124 std::make_pair(send,receive)));
    \n+
    1125 }
    \n+
    1126 }
    \n+
    1127
    \n+
    1128
    \n+
    1129 template<typename T, typename A>
    \n+
    1130 template<bool ignorePublic>
    \n+
    1131 inline void RemoteIndices<T,A>::buildRemote(bool includeSelf_)
    \n+
    1132 {
    \n+
    1133 // Processor configuration
    \n+
    1134 int rank, procs;
    \n+
    1135 MPI_Comm_rank(comm_, &rank);
    \n+
    1136 MPI_Comm_size(comm_, &procs);
    \n+
    1137
    \n+
    1138 // number of local indices to publish
    \n+
    1139 // The indices of the destination will be send.
    \n+
    1140 int sourcePublish, destPublish;
    \n+
    1141
    \n+
    1142 // Do we need to send two index sets?
    \n+
    1143 char sendTwo = (source_ != target_);
    \n+
    1144
    \n+
    1145 if(procs==1 && !(sendTwo || includeSelf_))
    \n+
    1146 // Nothing to communicate
    \n+
    1147 return;
    \n+
    1148
    \n+
    1149 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);
    \n+
    1150
    \n+
    1151 if(sendTwo)
    \n+
    1152 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);
    \n+
    1153 else
    \n+
    1154 // we only need to send one set of indices
    \n+
    1155 destPublish = 0;
    \n+
    1156
    \n+
    1157 int maxPublish, publish=sourcePublish+destPublish;
    \n+
    1158
    \n+
    1159 // Calculate maximum number of indices send
    \n+
    1160 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);
    \n+
    1161
    \n+
    1162 // allocate buffers
    \n+
    1163 PairType** destPairs;
    \n+
    1164 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish : 1];
    \n+
    1165
    \n+
    1166 if(sendTwo)
    \n+
    1167 destPairs = new PairType*[destPublish>0 ? destPublish : 1];
    \n+
    1168 else
    \n+
    1169 destPairs=sourcePairs;
    \n+
    1170
    \n+
    1171 char** buffer = new char*[2];
    \n+
    1172 int bufferSize;
    \n+
    1173 int position=0;
    \n+
    1174 int intSize;
    \n+
    1175 int charSize;
    \n+
    1176
    \n+
    1177 // calculate buffer size
    \n+
    1178 MPI_Datatype type = MPITraits<PairType>::getType();
    \n+
    1179
    \n+
    1180 MPI_Pack_size(maxPublish, type, comm_,
    \n+
    1181 &bufferSize);
    \n+
    1182 MPI_Pack_size(1, MPI_INT, comm_,
    \n+
    1183 &intSize);
    \n+
    1184 MPI_Pack_size(1, MPI_CHAR, comm_,
    \n+
    1185 &charSize);
    \n+
    1186 // Our message will contain the following:
    \n+
    1187 // a bool whether two index sets where sent
    \n+
    1188 // the size of the source and the dest indexset,
    \n+
    1189 // then the source and destination indices
    \n+
    1190 bufferSize += 2 * intSize + charSize;
    \n+
    1191
    \n+
    1192 if(bufferSize<=0) bufferSize=1;
    \n+
    1193
    \n+
    1194 buffer[0] = new char[bufferSize];
    \n+
    1195 buffer[1] = new char[bufferSize];
    \n+
    1196
    \n+
    1197
    \n+
    1198 // pack entries into buffer[0], p_out below!
    \n+
    1199 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,
    \n+
    1200 comm_);
    \n+
    1201
    \n+
    1202 // The number of indices we send for each index set
    \n+
    1203 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n+
    1204 comm_);
    \n+
    1205 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,
    \n+
    1206 comm_);
    \n+
    1207
    \n+
    1208 // Now pack the source indices and setup the destination pairs
    \n+
    1209 packEntries<ignorePublic>(sourcePairs, *source_, buffer[0], type,
    \n+
    1210 bufferSize, &position, sourcePublish);
    \n+
    1211 // If necessary send the dest indices and setup the source pairs
    \n+
    1212 if(sendTwo)
    \n+
    1213 packEntries<ignorePublic>(destPairs, *target_, buffer[0], type,
    \n+
    1214 bufferSize, &position, destPublish);
    \n+
    1215
    \n+
    1216
    \n+
    1217 // Update remote indices for ourself
    \n+
    1218 if(sendTwo|| includeSelf_)
    \n+
    1219 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,
    \n+
    1220 destPublish, bufferSize, sendTwo, includeSelf_);
    \n+
    1221
    \n+
    1222 neighbourIds.erase(rank);
    \n+
    1223
    \n+
    1224 if(neighbourIds.size()==0)
    \n+
    1225 {
    \n+
    1226 Dune::dvverb<<rank<<": Sending messages in a ring"<<std::endl;
    \n+
    1227 // send messages in ring
    \n+
    1228 for(int proc=1; proc<procs; proc++) {
    \n+
    1229 // pointers to the current input and output buffers
    \n+
    1230 char* p_out = buffer[1-(proc%2)];
    \n+
    1231 char* p_in = buffer[proc%2];
    \n+
    1232
    \n+
    1233 MPI_Status status;
    \n+
    1234 if(rank%2==0) {
    \n+
    1235 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n+
    1236 commTag_, comm_);
    \n+
    1237 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n+
    1238 commTag_, comm_, &status);
    \n+
    1239 }else{
    \n+
    1240 MPI_Recv(p_in, bufferSize, MPI_PACKED, (rank+procs-1)%procs,
    \n+
    1241 commTag_, comm_, &status);
    \n+
    1242 MPI_Ssend(p_out, bufferSize, MPI_PACKED, (rank+1)%procs,
    \n+
    1243 commTag_, comm_);
    \n+
    1244 }
    \n+
    1245
    \n+
    1246
    \n+
    1247 // The process these indices are from
    \n+
    1248 int remoteProc = (rank+procs-proc)%procs;
    \n+
    1249
    \n+
    1250 unpackCreateRemote(p_in, sourcePairs, destPairs, remoteProc, sourcePublish,
    \n+
    1251 destPublish, bufferSize, sendTwo);
    \n+
    1252
    \n+
    1253 }
    \n+
    1254
    \n+
    1255 }
    \n+
    1256 else
    \n+
    1257 {
    \n+
    1258 MPI_Request* requests=new MPI_Request[neighbourIds.size()];
    \n+
    1259 MPI_Request* req=requests;
    \n+
    1260
    \n+
    1261 typedef typename std::set<int>::size_type size_type;
    \n+
    1262 size_type noNeighbours=neighbourIds.size();
    \n+
    1263
    \n+
    1264 // setup sends
    \n+
    1265 for(std::set<int>::iterator neighbour=neighbourIds.begin();
    \n+
    1266 neighbour!= neighbourIds.end(); ++neighbour) {
    \n+
    1267 // Only send the information to the neighbouring processors
    \n+
    1268 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_, req++);
    \n+
    1269 }
    \n+
    1270
    \n+
    1271 //Test for received messages
    \n+
    1272
    \n+
    1273 for(size_type received=0; received <noNeighbours; ++received)
    \n+
    1274 {
    \n+
    1275 MPI_Status status;
    \n+
    1276 // probe for next message
    \n+
    1277 MPI_Probe(MPI_ANY_SOURCE, commTag_, comm_, &status);
    \n+
    1278 int remoteProc=status.MPI_SOURCE;
    \n+
    1279 int size;
    \n+
    1280 MPI_Get_count(&status, MPI_PACKED, &size);
    \n+
    1281 // receive message
    \n+
    1282 MPI_Recv(buffer[1], size, MPI_PACKED, remoteProc,
    \n+
    1283 commTag_, comm_, &status);
    \n+
    1284
    \n+
    1285 unpackCreateRemote(buffer[1], sourcePairs, destPairs, remoteProc, sourcePublish,
    \n+
    1286 destPublish, bufferSize, sendTwo);
    \n+
    1287 }
    \n+
    1288 // wait for completion of pending requests
    \n+
    1289 MPI_Status* statuses = new MPI_Status[neighbourIds.size()];
    \n+
    1290
    \n+
    1291 if(MPI_ERR_IN_STATUS==MPI_Waitall(neighbourIds.size(), requests, statuses)) {
    \n+
    1292 for(size_type i=0; i < neighbourIds.size(); ++i)
    \n+
    1293 if(statuses[i].MPI_ERROR!=MPI_SUCCESS) {
    \n+
    1294 std::cerr<<rank<<": MPI_Error occurred while receiving message."<<std::endl;
    \n+
    1295 MPI_Abort(comm_, 999);
    \n+
    1296 }
    \n+
    1297 }
    \n+
    1298 delete[] requests;
    \n+
    1299 delete[] statuses;
    \n+
    1300 }
    \n+
    1301
    \n+
    1302
    \n+
    1303 // delete allocated memory
    \n+
    1304 if(destPairs!=sourcePairs)
    \n+
    1305 delete[] destPairs;
    \n+
    1306
    \n+
    1307 delete[] sourcePairs;
    \n+
    1308 delete[] buffer[0];
    \n+
    1309 delete[] buffer[1];
    \n+
    1310 delete[] buffer;
    \n+
    1311 }
    \n+
    1312
    \n+
    1313 template<typename T, typename A>
    \n+
    1314 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& remote,
    \n+
    1315 int remoteEntries,
    \n+
    1316 PairType** local,
    \n+
    1317 int localEntries,
    \n+
    1318 char* p_in,
    \n+
    1319 MPI_Datatype type,
    \n+
    1320 int* position,
    \n+
    1321 int bufferSize,
    \n+
    1322 bool fromOurSelf)
    \n+
    1323 {
    \n+
    1324 if(remoteEntries==0)
    \n+
    1325 return;
    \n+
    1326
    \n+
    1327 PairType index;
    \n+
    1328 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1329 type, comm_);
    \n+
    1330 GlobalIndex oldGlobal=index.global();
    \n+
    1331 int n_in=0, localIndex=0;
    \n+
    1332
    \n+
    1333 //Check if we know the global index
    \n+
    1334 while(localIndex<localEntries) {
    \n+
    1335 if(local[localIndex]->global()==index.global()) {
    \n+
    1336 int oldLocalIndex=localIndex;
    \n+
    1337
    \n+
    1338 while(localIndex<localEntries &&
    \n+
    1339 local[localIndex]->global()==index.global()) {
    \n+
    1340 if(!fromOurSelf || index.local().attribute() !=
    \n+
    1341 local[localIndex]->local().attribute())
    \n+
    1342 // if index is from us it has to have a different attribute
    \n+
    1343 remote.push_back(RemoteIndex(index.local().attribute(),
    \n+
    1344 local[localIndex]));
    \n+
    1345 localIndex++;
    \n+
    1346 }
    \n+
    1347
    \n+
    1348 // unpack next remote index
    \n+
    1349 if((++n_in) < remoteEntries) {
    \n+
    1350 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1351 type, comm_);
    \n+
    1352 if(index.global()==oldGlobal)
    \n+
    1353 // Restart comparison for the same global indices
    \n+
    1354 localIndex=oldLocalIndex;
    \n+
    1355 else
    \n+
    1356 oldGlobal=index.global();
    \n+
    1357 }else{
    \n+
    1358 // No more received indices
    \n+
    1359 break;
    \n+
    1360 }
    \n+
    1361 continue;
    \n+
    1362 }
    \n+
    1363
    \n+
    1364 if (local[localIndex]->global()<index.global()) {
    \n+
    1365 // compare with next entry in our list
    \n+
    1366 ++localIndex;
    \n+
    1367 }else{
    \n+
    1368 // We do not know the index, unpack next
    \n+
    1369 if((++n_in) < remoteEntries) {
    \n+
    1370 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1371 type, comm_);
    \n+
    1372 oldGlobal=index.global();
    \n+
    1373 }else
    \n+
    1374 // No more received indices
    \n+
    1375 break;
    \n+
    1376 }
    \n+
    1377 }
    \n+
    1378
    \n+
    1379 // Unpack the other received indices without doing anything
    \n+
    1380 while(++n_in < remoteEntries)
    \n+
    1381 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1382 type, comm_);
    \n+
    1383 }
    \n+
    1384
    \n+
    1385
    \n+
    1386 template<typename T, typename A>
    \n+
    1387 inline void RemoteIndices<T,A>::unpackIndices(RemoteIndexList& send,
    \n+
    1388 RemoteIndexList& receive,
    \n+
    1389 int remoteEntries,
    \n+
    1390 PairType** localSource,
    \n+
    1391 int localSourceEntries,
    \n+
    1392 PairType** localDest,
    \n+
    1393 int localDestEntries,
    \n+
    1394 char* p_in,
    \n+
    1395 MPI_Datatype type,
    \n+
    1396 int* position,
    \n+
    1397 int bufferSize)
    \n+
    1398 {
    \n+
    1399 int n_in=0, sourceIndex=0, destIndex=0;
    \n+
    1400
    \n+
    1401 //Check if we know the global index
    \n+
    1402 while(n_in<remoteEntries && (sourceIndex<localSourceEntries || destIndex<localDestEntries)) {
    \n+
    1403 // Unpack next index
    \n+
    1404 PairType index;
    \n+
    1405 MPI_Unpack(p_in, bufferSize, position, &index, 1,
    \n+
    1406 type, comm_);
    \n+
    1407 n_in++;
    \n+
    1408
    \n+
    1409 // Advance until global index in localSource and localDest are >= than the one in the unpacked index
    \n+
    1410 while(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()<index.global())
    \n+
    1411 sourceIndex++;
    \n+
    1412
    \n+
    1413 while(destIndex<localDestEntries && localDest[destIndex]->global()<index.global())
    \n+
    1414 destIndex++;
    \n+
    1415
    \n+
    1416 // Add a remote index if we found the global index.
    \n+
    1417 if(sourceIndex<localSourceEntries && localSource[sourceIndex]->global()==index.global())
    \n+
    1418 send.push_back(RemoteIndex(index.local().attribute(),
    \n+
    1419 localSource[sourceIndex]));
    \n+
    1420
    \n+
    1421 if(destIndex < localDestEntries && localDest[destIndex]->global() == index.global())
    \n+
    1422 receive.push_back(RemoteIndex(index.local().attribute(),
    \n+
    1423 localDest[sourceIndex]));
    \n+
    1424 }
    \n+
    1425
    \n+
    1426 }
    \n+
    1427
    \n+
    1428 template<typename T, typename A>
    \n+
    \n+\n+
    1430 {
    \n+
    1431 auto lend = remoteIndices_.end();
    \n+
    1432 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {
    \n+
    1433 if(lists->second.first==lists->second.second) {
    \n+
    1434 // there is only one remote index list.
    \n+
    1435 delete lists->second.first;
    \n+
    1436 }else{
    \n+
    1437 delete lists->second.first;
    \n+
    1438 delete lists->second.second;
    \n+
    1439 }
    \n+
    1440 }
    \n+
    1441 remoteIndices_.clear();
    \n+
    1442 firstBuild=true;
    \n+
    1443 }
    \n+
    \n+
    1444
    \n+
    1445 template<typename T, typename A>
    \n+
    \n+\n+
    1447 {
    \n+
    1448 return remoteIndices_.size();
    \n+
    1449 }
    \n+
    \n+
    1450
    \n+
    1451 template<typename T, typename A>
    \n+
    1452 template<bool ignorePublic>
    \n+
    \n+\n+
    1454 {
    \n+
    1455 // Test whether a rebuild is Needed.
    \n+
    1456 if(firstBuild ||
    \n+
    1457 ignorePublic!=publicIgnored || !
    \n+
    1458 isSynced()) {
    \n+
    1459 free();
    \n+
    1460
    \n+
    1461 buildRemote<ignorePublic>(includeSelf);
    \n+
    1462
    \n+
    1463 sourceSeqNo_ = source_->seqNo();
    \n+
    1464 destSeqNo_ = target_->seqNo();
    \n+
    1465 firstBuild=false;
    \n+
    1466 publicIgnored=ignorePublic;
    \n+
    1467 }
    \n+
    1468
    \n+
    1469
    \n+
    1470 }
    \n+
    \n+
    1471
    \n+
    1472 template<typename T, typename A>
    \n+
    \n+\n+
    1474 {
    \n+
    1475 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();
    \n+
    1476 }
    \n+
    \n+
    1477
    \n+
    1478 template<typename T, typename A>
    \n+
    1479 template<bool mode, bool send>
    \n+
    \n+\n+
    1481 {
    \n+
    1482
    \n+
    1483 // The user are on their own now!
    \n+
    1484 // We assume they know what they are doing and just set the
    \n+
    1485 // remote indices to synced status.
    \n+
    1486 sourceSeqNo_ = source_->seqNo();
    \n+
    1487 destSeqNo_ = target_->seqNo();
    \n+
    1488
    \n+
    1489 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);
    \n+
    1490
    \n+
    1491 if(found == remoteIndices_.end())
    \n+
    1492 {
    \n+
    1493 if(source_ != target_)
    \n+
    1494 found = remoteIndices_.insert(found, std::make_pair(process,
    \n+
    1495 std::make_pair(new RemoteIndexList(),
    \n+
    1496 new RemoteIndexList())));
    \n+
    1497 else{
    \n+
    1498 RemoteIndexList* rlist = new RemoteIndexList();
    \n+
    1499 found = remoteIndices_.insert(found,
    \n+
    1500 std::make_pair(process,
    \n+
    1501 std::make_pair(rlist, rlist)));
    \n+
    1502 }
    \n+
    1503 }
    \n+
    1504
    \n+
    1505 firstBuild = false;
    \n+
    1506
    \n+
    1507 if(send)
    \n+
    1508 return RemoteIndexListModifier<T,A,mode>(*source_, *(found->second.first));
    \n+
    1509 else
    \n+
    1510 return RemoteIndexListModifier<T,A,mode>(*target_, *(found->second.second));
    \n+
    1511 }
    \n+
    \n+
    1512
    \n+
    1513 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1516 {
    \n+
    1517 return remoteIndices_.find(proc);
    \n+
    1518 }
    \n+
    \n+
    1519
    \n+
    1520 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1523 {
    \n+
    1524 return remoteIndices_.begin();
    \n+
    1525 }
    \n+
    \n+
    1526
    \n+
    1527 template<typename T, typename A>
    \n+\n+
    \n+\n+
    1530 {
    \n+
    1531 return remoteIndices_.end();
    \n+
    1532 }
    \n+
    \n+
    1533
    \n+
    1534
    \n+
    1535 template<typename T, typename A>
    \n+
    \n+\n+
    1537 {
    \n+
    1538 if(neighbours()!=ri.neighbours())
    \n+
    1539 return false;
    \n+
    1540
    \n+
    1541 const auto rend = remoteIndices_.end();
    \n+
    1542
    \n+
    1543 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin(); rindex!=rend; ++rindex, ++rindex1) {
    \n+
    1544 if(rindex->first != rindex1->first)
    \n+
    1545 return false;
    \n+
    1546 if(*(rindex->second.first) != *(rindex1->second.first))
    \n+
    1547 return false;
    \n+
    1548 if(*(rindex->second.second) != *(rindex1->second.second))
    \n+
    1549 return false;
    \n+
    1550 }
    \n+
    1551 return true;
    \n+
    1552 }
    \n+
    \n+
    1553
    \n+
    1554 template<class T, class A, bool mode>
    \n+\n+
    1556 RemoteIndexList& rList)
    \n+
    1557 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_(rList.end()), first_(true)
    \n+
    1558 {
    \n+
    1559 if(MODIFYINDEXSET) {
    \n+
    1560 assert(indexSet_);
    \n+
    1561 for(ConstIterator iter=iter_; iter != end_; ++iter)
    \n+
    1562 glist_.push_back(iter->localIndexPair().global());
    \n+
    1563 giter_ = glist_.beginModify();
    \n+
    1564 }
    \n+
    1565 }
    \n+
    1566
    \n+
    1567 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1569 : rList_(other.rList_), indexSet_(other.indexSet_),
    \n+
    1570 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_(other.end_),
    \n+
    1571 first_(other.first_), last_(other.last_)
    \n+
    1572 {}
    \n+
    \n+
    1573
    \n+
    1574 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1576 {
    \n+
    1577 if(MODIFYINDEXSET) {
    \n+
    1578 // repair pointers to local index set.
    \n+
    1579#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1580 if(indexSet_->state()!=GROUND)
    \n+
    1581 DUNE_THROW(InvalidIndexSetState, "Index has to be in ground mode for repairing pointers to indices");
    \n+
    1582#endif
    \n+
    1583 auto giter = glist_.begin();
    \n+
    1584 auto index = indexSet_->begin();
    \n+
    1585
    \n+
    1586 for(auto iter=rList_->begin(); iter != end_; ++iter) {
    \n+
    1587 while(index->global()<*giter) {
    \n+
    1588 ++index;
    \n+
    1589#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1590 if(index == indexSet_->end())
    \n+
    1591 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n+
    1592#endif
    \n+
    1593 }
    \n+
    1594
    \n+
    1595#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1596 if(index->global() != *giter)
    \n+
    1597 DUNE_THROW(InvalidPosition, "No such global index in set!");
    \n+
    1598#endif
    \n+
    1599 iter->localIndex_ = &(*index);
    \n+
    1600 }
    \n+
    1601 }
    \n+
    1602 }
    \n+
    \n+
    1603
    \n+
    1604 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1606 {
    \n+
    1607 static_assert(!mode,"Not allowed if the mode indicates that new indices"
    \n+
    1608 "might be added to the underlying index set. Use "
    \n+
    1609 "insert(const RemoteIndex&, const GlobalIndex&) instead");
    \n+
    1610
    \n+
    1611#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1612 if(!first_ && index.localIndexPair().global()<last_)
    \n+
    1613 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n+
    1614#endif
    \n+
    1615 // Move to the correct position
    \n+
    1616 while(iter_ != end_ && iter_->localIndexPair().global() < index.localIndexPair().global()) {
    \n+
    1617 ++iter_;
    \n+
    1618 }
    \n+
    1619
    \n+
    1620 // No duplicate entries allowed
    \n+
    1621 assert(iter_==end_ || iter_->localIndexPair().global() != index.localIndexPair().global());
    \n+
    1622 iter_.insert(index);
    \n+
    1623 last_ = index.localIndexPair().global();
    \n+
    1624 first_ = false;
    \n+
    1625 }
    \n+
    \n+
    1626
    \n+
    1627 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1629 {
    \n+
    1630 static_assert(mode,"Not allowed if the mode indicates that no new indices"
    \n+
    1631 "might be added to the underlying index set. Use "
    \n+
    1632 "insert(const RemoteIndex&) instead");
    \n+
    1633#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1634 if(!first_ && global<last_)
    \n+
    1635 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n+
    1636#endif
    \n+
    1637 // Move to the correct position
    \n+
    1638 while(iter_ != end_ && *giter_ < global) {
    \n+
    1639 ++giter_;
    \n+
    1640 ++iter_;
    \n+
    1641 }
    \n+
    1642
    \n+
    1643 // No duplicate entries allowed
    \n+
    1644 assert(iter_->localIndexPair().global() != global);
    \n+
    1645 iter_.insert(index);
    \n+
    1646 giter_.insert(global);
    \n+
    1647
    \n+
    1648 last_ = global;
    \n+
    1649 first_ = false;
    \n+
    1650 }
    \n+
    \n+
    1651
    \n+
    1652 template<typename T, typename A, bool mode>
    \n+
    \n+\n+
    1654 {
    \n+
    1655#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1656 if(!first_ && global<last_)
    \n+
    1657 DUNE_THROW(InvalidPosition, "Modification of remote indices have to occur with ascending global index.");
    \n+
    1658#endif
    \n+
    1659
    \n+
    1660 bool found= false;
    \n+
    1661
    \n+
    1662 if(MODIFYINDEXSET) {
    \n+
    1663 // Move to the correct position
    \n+
    1664 while(iter_!=end_ && *giter_< global) {
    \n+
    1665 ++giter_;
    \n+
    1666 ++iter_;
    \n+
    1667 }
    \n+
    1668 if(*giter_ == global) {
    \n+
    1669 giter_.remove();
    \n+
    1670 iter_.remove();
    \n+
    1671 found=true;
    \n+
    1672 }
    \n+
    1673 }else{
    \n+
    1674 while(iter_!=end_ && iter_->localIndexPair().global() < global)
    \n+
    1675 ++iter_;
    \n+
    1676
    \n+
    1677 if(iter_->localIndexPair().global()==global) {
    \n+
    1678 iter_.remove();
    \n+
    1679 found = true;
    \n+
    1680 }
    \n+
    1681 }
    \n+
    1682
    \n+
    1683 last_ = global;
    \n+
    1684 first_ = false;
    \n+
    1685 return found;
    \n+
    1686 }
    \n+
    \n+
    1687
    \n+
    1688 template<typename T, typename A>
    \n+
    1689 template<bool send>
    \n+
    \n+\n+
    1691 {
    \n+
    1692 return CollectiveIterator<T,A>(remoteIndices_, send);
    \n+
    1693 }
    \n+
    \n+
    1694
    \n+
    1695 template<typename T, typename A>
    \n+
    \n+
    1696 inline MPI_Comm RemoteIndices<T,A>::communicator() const
    \n+
    1697 {
    \n+
    1698 return comm_;
    \n+
    1699
    \n+
    1700 }
    \n+
    \n+
    1701
    \n+
    1702 template<typename T, typename A>
    \n+
    \n+\n+
    1704 {
    \n+
    1705
    \n+
    1706 const auto end = pmap.end();
    \n+
    1707 for(auto process = pmap.begin(); process != end; ++process) {
    \n+
    1708 const RemoteIndexList* list = send ? process->second.first : process->second.second;
    \n+
    1709 using ri_iterator = typename RemoteIndexList::const_iterator;
    \n+
    1710 map_.insert(std::make_pair(process->first,
    \n+
    1711 std::pair<ri_iterator, const ri_iterator>(list->begin(), list->end())));
    \n+
    1712 }
    \n+
    1713 }
    \n+
    \n+
    1714
    \n+
    1715 template<typename T, typename A>
    \n+
    \n+
    1716 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index)
    \n+
    1717 {
    \n+
    1718 const auto end = map_.end();
    \n+
    1719
    \n+
    1720 for(auto iter = map_.begin(); iter != end;) {
    \n+
    1721 // Step the iterator until we are >= index
    \n+
    1722 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n+
    1723 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n+
    1724 RemoteIndex remoteIndex;
    \n+
    1725 if(current != rend)
    \n+
    1726 remoteIndex = *current;
    \n+
    1727
    \n+
    1728 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n+
    1729 ++(iter->second.first);
    \n+
    1730
    \n+
    1731 // erase from the map if there are no more entries.
    \n+
    1732 if(iter->second.first == iter->second.second)
    \n+
    1733 map_.erase(iter++);
    \n+
    1734 else{
    \n+
    1735 ++iter;
    \n+
    1736 }
    \n+
    1737 }
    \n+
    1738 index_=index;
    \n+
    1739 noattribute=true;
    \n+
    1740 }
    \n+
    \n+
    1741
    \n+
    1742 template<typename T, typename A>
    \n+
    \n+
    1743 inline void CollectiveIterator<T,A>::advance(const GlobalIndex& index,
    \n+
    1744 const Attribute& attribute)
    \n+
    1745 {
    \n+
    1746 const auto end = map_.end();
    \n+
    1747
    \n+
    1748 for(auto iter = map_.begin(); iter != end;) {
    \n+
    1749 // Step the iterator until we are >= index
    \n+
    1750 typename RemoteIndexList::const_iterator current = iter->second.first;
    \n+
    1751 typename RemoteIndexList::const_iterator rend = iter->second.second;
    \n+
    1752 RemoteIndex remoteIndex;
    \n+
    1753 if(current != rend)
    \n+
    1754 remoteIndex = *current;
    \n+
    1755
    \n+
    1756 // Move to global index or bigger
    \n+
    1757 while(iter->second.first!=iter->second.second && iter->second.first->localIndexPair().global()<index)
    \n+
    1758 ++(iter->second.first);
    \n+
    1759
    \n+
    1760 // move to attribute or bigger
    \n+
    1761 while(iter->second.first!=iter->second.second
    \n+
    1762 && iter->second.first->localIndexPair().global()==index
    \n+
    1763 && iter->second.first->localIndexPair().local().attribute()<attribute)
    \n+
    1764 ++(iter->second.first);
    \n+
    1765
    \n+
    1766 // erase from the map if there are no more entries.
    \n+
    1767 if(iter->second.first == iter->second.second)
    \n+
    1768 map_.erase(iter++);
    \n+
    1769 else{
    \n+
    1770 ++iter;
    \n+
    1771 }
    \n+
    1772 }
    \n+
    1773 index_=index;
    \n+
    1774 attribute_=attribute;
    \n+
    1775 noattribute=false;
    \n+
    1776 }
    \n+
    \n+
    1777
    \n+
    1778 template<typename T, typename A>
    \n+
    \n+\n+
    1780 {
    \n+
    1781 const auto end = map_.end();
    \n+
    1782
    \n+
    1783 for(auto iter = map_.begin(); iter != end;) {
    \n+
    1784 // Step the iterator until we are >= index
    \n+
    1785 auto current = iter->second.first;
    \n+
    1786 auto rend = iter->second.second;
    \n+
    1787
    \n+
    1788 // move all iterators pointing to the current global index to next value
    \n+
    1789 if(iter->second.first->localIndexPair().global()==index_ &&
    \n+
    1790 (noattribute || iter->second.first->localIndexPair().local().attribute() == attribute_))
    \n+
    1791 ++(iter->second.first);
    \n+
    1792
    \n+
    1793 // erase from the map if there are no more entries.
    \n+
    1794 if(iter->second.first == iter->second.second)
    \n+
    1795 map_.erase(iter++);
    \n+
    1796 else{
    \n+
    1797 ++iter;
    \n+
    1798 }
    \n+
    1799 }
    \n+
    1800 return *this;
    \n+
    1801 }
    \n+
    \n+
    1802
    \n+
    1803 template<typename T, typename A>
    \n+
    \n+\n+
    1805 {
    \n+
    1806 return map_.empty();
    \n+
    1807 }
    \n+
    \n+
    1808
    \n+
    1809 template<typename T, typename A>
    \n+
    1810 inline typename CollectiveIterator<T,A>::iterator
    \n+
    \n+\n+
    1812 {
    \n+
    1813 if(noattribute)
    \n+
    1814 return iterator(map_.begin(), map_.end(), index_);
    \n+
    1815 else
    \n+
    1816 return iterator(map_.begin(), map_.end(), index_,
    \n+
    1817 attribute_);
    \n+
    1818 }
    \n+
    \n+
    1819
    \n+
    1820 template<typename T, typename A>
    \n+
    1821 inline typename CollectiveIterator<T,A>::iterator
    \n+
    \n+\n+
    1823 {
    \n+
    1824 return iterator(map_.end(), map_.end(), index_);
    \n+
    1825 }
    \n+
    \n+
    1826
    \n+
    1827 template<typename TG, typename TA>
    \n+
    \n+
    1828 inline std::ostream& operator<<(std::ostream& os, const RemoteIndex<TG,TA>& index)
    \n+
    1829 {
    \n+
    1830 os<<"[global="<<index.localIndexPair().global()<<", remote attribute="<<index.attribute()<<" local attribute="<<index.localIndexPair().local().attribute()<<"]";
    \n+
    1831 return os;
    \n+
    1832 }
    \n+
    \n+
    1833
    \n+
    1834 template<typename T, typename A>
    \n+
    \n+
    1835 inline std::ostream& operator<<(std::ostream& os, const RemoteIndices<T,A>& indices)
    \n+
    1836 {
    \n+
    1837 int rank;
    \n+
    1838 MPI_Comm_rank(indices.comm_, &rank);
    \n+
    1839 const auto rend = indices.remoteIndices_.end();
    \n+
    1840
    \n+
    1841 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex) {
    \n+
    1842 os<<rank<<": Process "<<rindex->first<<":";
    \n+
    1843
    \n+
    1844 if(!rindex->second.first->empty()) {
    \n+
    1845 os<<" send:";
    \n+
    1846
    \n+
    1847 const auto send= rindex->second.first->end();
    \n+
    1848
    \n+
    1849 for(auto index = rindex->second.first->begin();
    \n+
    1850 index != send; ++index)
    \n+
    1851 os<<*index<<" ";
    \n+
    1852 os<<std::endl;
    \n+
    1853 }
    \n+
    1854 if(!rindex->second.second->empty()) {
    \n+
    1855 os<<rank<<": Process "<<rindex->first<<": "<<"receive: ";
    \n+
    1856
    \n+
    1857 for(const auto& index : *(rindex->second.second))
    \n+
    1858 os << index << " ";
    \n+
    1859 }
    \n+
    1860 os<<std::endl<<std::flush;
    \n+
    1861 }
    \n+
    1862 return os;
    \n+
    1863 }
    \n+
    \n+
    1865}
    \n+
    1866
    \n+
    1867#endif // HAVE_MPI
    \n+
    1868
    \n+
    1869#endif
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \n+
    Provides classes for use as the local index in ParallelIndexSet for distributed computing.
    \n+
    Provides a map between global and local indices.
    \n+
    Implements a singly linked list together with the necessary iterators.
    \n+
    Standard Dune debug streams.
    \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+
    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+
    TL LocalIndex
    The type of the local index, e.g. ParallelLocalIndex.
    Definition indexset.hh:239
    \n+
    const GlobalIndex & global() const
    Get the global index.
    \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+
    @ 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:95
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:604
    \n-
    bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:594
    \n-
    auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:584
    \n-
    bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:614
    \n-
    vector space out of a tensor product of fields.
    Definition fvector.hh:95
    \n-
    K * data() noexcept
    return pointer to underlying array
    Definition fvector.hh:198
    \n-
    constexpr FieldVector()
    Constructor making default-initialized vector.
    Definition fvector.hh:112
    \n-
    const value_type & const_reference
    The type used for const references to the vector entry.
    Definition fvector.hh:109
    \n-
    Base::size_type size_type
    Definition fvector.hh:102
    \n-
    FieldVector(const DenseVector< C > &x, typename std::enable_if< IsFieldVectorSizeCorrect< C, SIZE >::value >::type *dummy=0)
    Copy constructor from a second vector of possibly different type.
    Definition fvector.hh:165
    \n-
    FieldVector(const FieldVector< T, N > &)=delete
    \n-
    FieldVector(const K &t)
    Constructor making vector with identical coordinates.
    Definition fvector.hh:117
    \n-
    FieldVector(std::initializer_list< K > const &l)
    Construct from a std::initializer_list.
    Definition fvector.hh:132
    \n-
    const K * data() const noexcept
    return pointer to underlying array
    Definition fvector.hh:204
    \n-
    static constexpr int dimension
    The size of this vector.
    Definition fvector.hh:100
    \n-
    FieldVector(const FieldVector< K1, SIZE > &x)
    Constructor making vector with identical coordinates.
    Definition fvector.hh:175
    \n-
    static constexpr size_type size()
    Definition fvector.hh:186
    \n-
    K & operator[](size_type i)
    Definition fvector.hh:188
    \n-
    value_type & reference
    The type used for references to the vector entry.
    Definition fvector.hh:106
    \n-
    Base::value_type value_type
    Definition fvector.hh:103
    \n-
    const K & operator[](size_type i) const
    Definition fvector.hh:192
    \n-
    FieldVector & operator=(const FieldVector< T, N > &)=delete
    \n-
    FieldVector(const FieldVector &)=default
    Copy constructor.
    \n-
    Interface for a class of dense vectors over a given field.
    Definition densevector.hh:229
    \n-
    Traits::value_type value_type
    export the type representing the field
    Definition densevector.hh:250
    \n-
    Iterator begin()
    begin iterator
    Definition densevector.hh:347
    \n-
    size_type size() const
    size method
    Definition densevector.hh:336
    \n-
    Traits::size_type size_type
    The type used for the index access and size operation.
    Definition densevector.hh:259
    \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-\n-
    std::array< K, SIZE > container_type
    Definition fvector.hh:44
    \n-
    container_type::size_type size_type
    Definition fvector.hh:46
    \n-
    FieldVector< K, SIZE > derived_type
    Definition fvector.hh:43
    \n-
    FieldTraits< K >::real_type real_type
    Definition fvector.hh:53
    \n-
    FieldTraits< K >::field_type field_type
    Definition fvector.hh:52
    \n-
    TMP to check the size of a DenseVectors statically, if possible.
    Definition fvector.hh:66
    \n-
    static constexpr bool value
    True if C is not of type FieldVector or its dimension is not equal SIZE.
    Definition fvector.hh:71
    \n-
    Tag to make sure the functions in this namespace can be found by ADL.
    Definition math.hh:230
    \n-
    Definition matvectraits.hh:31
    \n-
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \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:41
    \n+
    Base class of all classes representing a communication interface.
    Definition parallel/interface.hh:35
    \n+
    An index present on the local process with an additional attribute flag.
    Definition plocalindex.hh:49
    \n+
    The indices present on remote processes.
    Definition remoteindices.hh:189
    \n+
    const std::set< int > & getNeighbours() const
    Definition remoteindices.hh:307
    \n+
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:231
    \n+
    RemoteIndices()
    Definition remoteindices.hh:977
    \n+
    friend void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1, T2 > &oocomm)
    \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:984
    \n+
    void free()
    Free the index lists.
    Definition remoteindices.hh:1429
    \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:215
    \n+
    void rebuild()
    Rebuilds the set of remote indices.
    Definition remoteindices.hh:1453
    \n+
    T ParallelIndexSet
    Type of the index set we use, e.g. ParallelLocalIndexSet.
    Definition remoteindices.hh:206
    \n+
    MPI_Comm communicator() const
    Get the mpi communicator used.
    Definition remoteindices.hh:1696
    \n+
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:226
    \n+
    CollectiveIteratorT iterator() const
    Get an iterator for colletively iterating over the remote indices of all remote processes.
    Definition remoteindices.hh:1690
    \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:971
    \n+
    const_iterator end() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1529
    \n+
    bool operator==(const RemoteIndices &ri) const
    Definition remoteindices.hh:1536
    \n+
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:245
    \n+
    void setNeighbours(const C &neighbours)
    Definition remoteindices.hh:300
    \n+
    RemoteIndexListModifier< T, A, mode > getModifier(int process)
    Get a modifier for a remote index list.
    Definition remoteindices.hh:1480
    \n+
    const ParallelIndexSet & sourceIndexSet() const
    Get the index set at the source.
    Definition remoteindices.hh:999
    \n+
    ~RemoteIndices()
    Destructor.
    Definition remoteindices.hh:1014
    \n+
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:241
    \n+
    int neighbours() const
    Get the number of processors we share indices with.
    Definition remoteindices.hh:1446
    \n+
    CollectiveIterator< T, A > CollectiveIteratorT
    The type of the collective iterator over all remote indices.
    Definition remoteindices.hh:210
    \n+
    const ParallelIndexSet & destinationIndexSet() const
    Get the index set at destination.
    Definition remoteindices.hh:1007
    \n+
    typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:237
    \n+
    const_iterator find(int proc) const
    Find an iterator over the remote index lists of a specific process.
    Definition remoteindices.hh:1515
    \n+
    bool isSynced() const
    Checks whether the remote indices are synced with the indexsets.
    Definition remoteindices.hh:1473
    \n+
    const_iterator begin() const
    Get an iterator over all remote index lists.
    Definition remoteindices.hh:1522
    \n+
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:221
    \n+
    RemoteIndexMap::const_iterator const_iterator
    Definition remoteindices.hh:247
    \n+
    Information about an index residing on another processor.
    Definition remoteindices.hh:73
    \n+
    const Attribute attribute() const
    Get the attribute of the index on the remote process.
    Definition remoteindices.hh:946
    \n+
    friend void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &, RemoteIndices< T, A1 > &, const T &)
    \n+
    bool operator==(const RemoteIndex &ri) const
    Definition remoteindices.hh:934
    \n+
    T1 GlobalIndex
    the type of the global index. This type has to provide at least a operator< for sorting.
    Definition remoteindices.hh:90
    \n+
    T2 Attribute
    The type of the attributes. Normally this will be an enumeration like.
    Definition remoteindices.hh:99
    \n+
    IndexPair< GlobalIndex, ParallelLocalIndex< Attribute > > PairType
    The type of the index pair.
    Definition remoteindices.hh:105
    \n+
    const PairType & localIndexPair() const
    Get the corresponding local index pair.
    Definition remoteindices.hh:952
    \n+
    RemoteIndex()
    Parameterless Constructor.
    Definition remoteindices.hh:930
    \n+
    bool operator!=(const RemoteIndex &ri) const
    Definition remoteindices.hh:940
    \n+
    Modifier for adding and/or deleting remote indices from the remote index list.
    Definition remoteindices.hh:551
    \n+
    void repairLocalIndexPointers()
    Repair the pointers to the local index pairs.
    Definition remoteindices.hh:1575
    \n+
    Dune::SLList< RemoteIndex, Allocator > RemoteIndexList
    The type of the remote index list.
    Definition remoteindices.hh:602
    \n+
    A Allocator
    The type of the allocator for the remote index list.
    Definition remoteindices.hh:598
    \n+
    void insert(const RemoteIndex &index)
    Insert an index to the list.
    Definition remoteindices.hh:1605
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition remoteindices.hh:578
    \n+
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition remoteindices.hh:583
    \n+
    RemoteIndexList::const_iterator ConstIterator
    The type of the remote index list iterator.
    Definition remoteindices.hh:612
    \n+
    SLListModifyIterator< RemoteIndex, Allocator > ModifyIterator
    The type of the modifying iterator of the remote index list.
    Definition remoteindices.hh:607
    \n+
    bool remove(const GlobalIndex &global)
    Remove a remote index.
    Definition remoteindices.hh:1653
    \n+
    T ParallelIndexSet
    Type of the index set we use.
    Definition remoteindices.hh:573
    \n+
    RemoteIndexListModifier()
    Default constructor.
    Definition remoteindices.hh:676
    \n+
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition remoteindices.hh:588
    \n+
    Dune::RemoteIndex< GlobalIndex, Attribute > RemoteIndex
    Type of the remote indices we manage.
    Definition remoteindices.hh:593
    \n+
    static constexpr bool MODIFYINDEXSET
    If true the index set corresponding to the remote indices might get modified.
    Definition remoteindices.hh:568
    \n+
    A collective iterator for moving over the remote indices for all processes collectively.
    Definition remoteindices.hh:708
    \n+
    CollectiveIterator & operator++()
    Definition remoteindices.hh:1779
    \n+
    iterator end()
    Definition remoteindices.hh:1822
    \n+
    CollectiveIterator(const RemoteIndexMap &map_, bool send)
    Constructor.
    Definition remoteindices.hh:1703
    \n+
    bool empty() const
    Checks whether there are still iterators in the map.
    Definition remoteindices.hh:1804
    \n+
    void advance(const GlobalIndex &global)
    Advances all underlying iterators.
    Definition remoteindices.hh:1716
    \n+
    std::map< int, std::pair< RemoteIndexList *, RemoteIndexList * > > RemoteIndexMap
    The type of the map from rank to remote index list.
    Definition remoteindices.hh:748
    \n+
    iterator begin()
    Definition remoteindices.hh:1811
    \n+
    Definition remoteindices.hh:167
    \n+
    Definition remoteindices.hh:558
    \n+
    Iterator over the valid underlying iterators.
    Definition remoteindices.hh:792
    \n+
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex &index)
    Definition remoteindices.hh:799
    \n+
    iterator(const iterator &other)
    Definition remoteindices.hh:817
    \n+
    const RemoteIndex & operator*() const
    Definition remoteindices.hh:838
    \n+
    Map::iterator ConstRealIterator
    Definition remoteindices.hh:795
    \n+
    iterator & operator++()
    Definition remoteindices.hh:822
    \n+
    const RemoteIndex * operator->() const
    Definition remoteindices.hh:850
    \n+
    bool operator==(const iterator &other) const
    Definition remoteindices.hh:856
    \n+
    int process() const
    Definition remoteindices.hh:844
    \n+
    iterator(const RealIterator &iter, const ConstRealIterator &end, GlobalIndex index, Attribute attribute)
    Definition remoteindices.hh:807
    \n+
    bool operator!=(const iterator &other) const
    Definition remoteindices.hh:862
    \n+
    Map::iterator RealIterator
    Definition remoteindices.hh:794
    \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,713 +1,1925 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-fvector.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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 (C) 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_FVECTOR_HH\n-6#define DUNE_FVECTOR_HH\n+5#ifndef DUNE_REMOTEINDICES_HH\n+6#define DUNE_REMOTEINDICES_HH\n 7\n-8#include \n-9#include \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 \"_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-19#include \"_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\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 \"_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n-22#include \"_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-23#include \"_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\"\n-24\n-25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n-26#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/_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\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/_\bm_\bp_\bi_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+24#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+25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bl_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n+26#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 27\n 28namespace _\bD_\bu_\bn_\be {\n-29\n-39 template< class K, int SIZE > class FieldVector;\n-40 template< class K, int SIZE >\n-_\b4_\b1 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n+40 template\n+_\b4_\b1 class _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br > >\n 42 {\n-_\b4_\b3 typedef _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n-_\b4_\b4 typedef std::array _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be;\n-_\b4_\b5 typedef K _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b4_\b6 typedef typename container_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+43 public:\n+44 inline static MPI_Datatype _\bg_\be_\bt_\bT_\by_\bp_\be();\n+45 private:\n+46 static MPI_Datatype type;\n 47 };\n 48\n-49 template< class K, int SIZE >\n-_\b5_\b0 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n-51 {\n-_\b5_\b2 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_\b3 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-54 };\n+49\n+50 template\n+51 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n+52\n+53 template\n+54 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx;\n 55\n-64 template\n-_\b6_\b5 struct _\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt\n-66 {\n-_\b7_\b1 constexpr static bool _\bv_\ba_\bl_\bu_\be = true;\n-72 };\n-73\n-74 template\n-_\b7_\b5 struct _\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br,SIZE>\n-76 {\n-_\b7_\b7 constexpr static bool _\bv_\ba_\bl_\bu_\be = true;\n-78 };\n-79\n-80 template\n-_\b8_\b1 struct _\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br,SIZE>\n-82 {\n-_\b8_\b3 constexpr static bool _\bv_\ba_\bl_\bu_\be = false;\n-84 };\n-85\n-86\n-92 template< class K, int SIZE >\n-_\b9_\b3 class _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br :\n-94 public _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br< FieldVector >\n-95 {\n-96 std::array _data;\n-97 typedef _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> > _\bB_\ba_\bs_\be;\n-98 public:\n-_\b1_\b0_\b0 constexpr static int _\bd_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn = SIZE;\n-101\n-_\b1_\b0_\b2 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-_\b1_\b0_\b3 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-104\n-_\b1_\b0_\b6 typedef _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-107\n-_\b1_\b0_\b9 typedef const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-110\n-_\b1_\b1_\b2 constexpr _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br()\n-113 : _data{{}}\n-114 {}\n-115\n-_\b1_\b1_\b7 explicit _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const K& t)\n-118 {\n-119 std::fill(_data.begin(),_data.end(),t);\n-120 }\n-121\n-122#if __GNUC__ == 5 && !defined(__clang__)\n-123 // `... = default;` causes an internal compiler error on GCC 5.4 (Ubuntu\n-16.04)\n-125 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& x) : _data(x._data) {}\n-126#else\n-_\b1_\b2_\b8 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br&) = default;\n-129#endif\n-130\n-_\b1_\b3_\b2 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (std::initializer_list const &l)\n-133 {\n-134 assert(l.size() == dimension);// Actually, this is not needed any more!\n-135 std::copy_n(l.begin(), std::min(static_cast(dimension),\n-136 l.size()),\n-137 _data.begin());\n-138 }\n-139\n-_\b1_\b4_\b1 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& operator= (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br&) = default;\n-142\n-143 template \n-_\b1_\b4_\b4 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& operator= (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bS_\bI_\bZ_\bE_\b>& x)\n-145 {\n-146 std::copy_n(x._\bb_\be_\bg_\bi_\bn(), SIZE, _data.begin());\n-147 return *this;\n-148 }\n-149\n-150 template\n-_\b1_\b5_\b1 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bN_\b>&) = delete;\n+56 // forward declaration needed for friend declaration.\n+57 template\n+58 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+59\n+60 template\n+_\b6_\b1 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+62\n+63\n+64 template\n+65 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+66\n+67\n+71 template\n+_\b7_\b2 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+73 {\n+74 template\n+_\b7_\b5 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+76\n+77 template\n+_\b7_\b8 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+79 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b,_\bA_\b1_\b>&,\n+80 const T&);\n+81\n+82 template\n+_\b8_\b3 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+84\n+85 public:\n+_\b9_\b0 typedef T1 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+_\b9_\b9 typedef T2 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+100\n+104 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_\b5 _\bP_\ba_\bi_\br_\bT_\by_\bp_\be;\n+106\n+111 const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be() const;\n+112\n+118 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+119\n+123 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx();\n+124\n+125\n+131 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be,\n+132 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* local);\n+133\n+134\n+140 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx(const T2& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be);\n+141\n+142 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+143\n+144 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+145 private:\n+147 const _\bP_\ba_\bi_\br_\bT_\by_\bp_\be* localIndex_;\n+148\n+150 char attribute_;\n+151 };\n 152\n-164 template\n-_\b1_\b6_\b5 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bC_\b> & x,\n-166 [[maybe_unused]] typename std::enable_if<_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\bC_\b,_\bS_\bI_\bZ_\bE_\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be>::type* dummy=0)\n-167 {\n-168 // do a run-time size check, for the case that x is not a FieldVector\n-169 assert(x._\bs_\bi_\bz_\be() == SIZE); // Actually this is not needed any more!\n-170 std::copy_n(x._\bb_\be_\bg_\bi_\bn(), std::min(static_cast(SIZE),x._\bs_\bi_\bz_\be()),\n-_data.begin());\n-171 }\n-172\n-174 template\n-_\b1_\b7_\b5 explicit _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b1_\b,_\bS_\bI_\bZ_\bE_\b> & x)\n-176 {\n-177 std::copy_n(x._\bb_\be_\bg_\bi_\bn(), SIZE, _data.begin());\n-178 }\n-179\n-180 template\n-_\b1_\b8_\b1 explicit _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bN_\b>&) = delete;\n-182\n-183 using Base::operator=;\n-184\n-185 // make this thing a vector\n-_\b1_\b8_\b6 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be () { return SIZE; }\n-187\n-_\b1_\b8_\b8 K & _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {\n-189 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < SIZE);\n-190 return _data[i];\n-191 }\n-_\b1_\b9_\b2 const K & _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const {\n-193 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < SIZE);\n-194 return _data[i];\n-195 }\n+153 template\n+154 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+155\n+156 class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n+157\n+158 template\n+159 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+160\n+161 // forward declaration needed for friend declaration.\n+162 template\n+163 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+164\n+165 // forward declaration needed for friend declaration.\n+166 template\n+_\b1_\b6_\b7 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+168\n+169\n+186 template > >\n+_\b1_\b8_\b8 class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+189 {\n+_\b1_\b9_\b0 friend class _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\bB_\bu_\bi_\bl_\bd_\be_\br;\n+191 friend class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bS_\by_\bn_\bc_\be_\br;\n+192 template\n+_\b1_\b9_\b3 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+194 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b1_\b,_\bA_\b1_\b>&,\n+195 const T1&);\n 196\n-_\b1_\b9_\b8 K* _\bd_\ba_\bt_\ba() noexcept\n-199 {\n-200 return _data.data();\n-201 }\n+197 template\n+_\b1_\b9_\b8 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+_\b1_\b9_\b9 friend std::ostream& operator<<<>(std::ostream&, const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b<_\bT_\b>&);\n+200\n+201 public:\n 202\n-_\b2_\b0_\b4 const K* _\bd_\ba_\bt_\ba() const noexcept\n-205 {\n-206 return _data.data();\n-207 }\n-208\n-210 template ::value, int> = 0>\n-_\b2_\b1_\b2 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& vector, Scalar scalar)\n-213 {\n-214 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,SIZE>\n-result;\n-215\n-216 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < vector._\bs_\bi_\bz_\be(); ++i)\n-217 result[i] = vector[i] * scalar;\n-218\n-219 return result;\n-220 }\n-221\n-223 template ::value, int> = 0>\n-_\b2_\b2_\b5 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( Scalar scalar, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& vector)\n-226 {\n-227 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,SIZE>\n-result;\n-228\n-229 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < vector._\bs_\bi_\bz_\be(); ++i)\n-230 result[i] = scalar * vector[i];\n-231\n-232 return result;\n-233 }\n-234\n-236 template ::value, int> = 0>\n-_\b2_\b3_\b8 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b ( const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& vector, Scalar scalar)\n-239 {\n-240 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,SIZE>\n-result;\n-241\n-242 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < vector._\bs_\bi_\bz_\be(); ++i)\n-243 result[i] = vector[i] / scalar;\n-244\n-245 return result;\n-246 }\n-247\n-248 };\n-249\n-261 template\n-_\b2_\b6_\b2 inline std::istream &operator>> ( std::istream &in,\n-263 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b> &v )\n-264 {\n-265 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b> w;\n-266 for( typename _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < SIZE; ++i )\n-267 in >> w[ i ];\n-268 if(in)\n-269 v = w;\n-270 return in;\n-271 }\n-272\n-273#ifndef DOXYGEN\n-274 template< class K >\n-275 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n-276 {\n-277 typedef _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b1_\b> derived_type;\n-278 typedef K container_type;\n-279 typedef K value_type;\n-280 typedef size_t size_type;\n-281 };\n-282\n-285 template\n-286 class FieldVector :\n-287 public DenseVector< FieldVector >\n-288 {\n-289 K _data;\n-290 typedef DenseVector< FieldVector > Base;\n-291 public:\n-293 constexpr static int dimension = 1;\n-294\n-295 typedef typename Base::size_type size_type;\n-296\n-298 typedef K& reference;\n-299\n-301 typedef const K& const_reference;\n-302\n-303 //===== construction\n+_\b2_\b0_\b6 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+207\n+_\b2_\b1_\b0 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+211\n+_\b2_\b1_\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+216\n+217\n+_\b2_\b2_\b1 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+222\n+_\b2_\b2_\b6 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+227\n+_\b2_\b3_\b1 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+232\n+233\n+_\b2_\b3_\b7 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n+rebind_alloc;\n+238\n+240 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_\b1 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n+242\n+244 typedef std::map >\n+_\b2_\b4_\b5 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n+246\n+_\b2_\b4_\b7 typedef typename RemoteIndexMap::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+248\n+266 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+267 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n+(), bool includeSelf=false);\n+268\n+269 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n+270\n+278 void _\bs_\be_\bt_\bI_\bn_\bc_\bl_\bu_\bd_\be_\bS_\be_\bl_\bf(bool includeSelf);\n+279\n+296 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+297 const MPI_Comm& comm, const std::vector& _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs=std::vector\n+());\n+298\n+299 template\n+_\b3_\b0_\b0 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+301 {\n+302 neighbourIds.clear();\n+303 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 304\n-306 constexpr FieldVector ()\n-307 : _data()\n-308 {}\n-309\n-311 template::value &&\n-314 ! std::is_base_of::field_type>, K\n-315 >::value\n-316 >::type\n-317 >\n-318 FieldVector (const T& k) : _data(k) {}\n-319\n-321 template::value_type>::value, int> =\n-0>\n-324 FieldVector (const DenseVector & x)\n-325 {\n-326 static_assert(((bool)IsFieldVectorSizeCorrect::value), \"FieldVectors\n-do not match in dimension!\");\n-327 assert(x.size() == 1);\n-328 _data = x[0];\n-329 }\n+305 }\n+306\n+_\b3_\b0_\b7 const std::set& _\bg_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const\n+308 {\n+309 return neighbourIds;\n+310 }\n+311\n+315 _\b~_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs();\n+316\n+326 template\n+327 void _\br_\be_\bb_\bu_\bi_\bl_\bd();\n+328\n+329 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 330\n-332 FieldVector(const FieldVector&) = default;\n-333\n-335 FieldVector& operator=(const FieldVector&) = default;\n-336\n-337 template \n-338 FieldVector& operator= (const FieldVector& other)\n-339 {\n-340 _data = other[0];\n-341 return *this;\n-342 }\n-343\n-344 template\n-345 FieldVector& operator=(const FieldVector&) = delete;\n-346\n-348 FieldVector (std::initializer_list const &l)\n-349 {\n-350 assert(l.size() == 1);\n-351 _data = *l.begin();\n-352 }\n-353\n-355 template::value &&\n-358 ! std::is_base_of::field_type>, K\n-359 >::value\n-360 >::type\n-361 >\n-362 inline FieldVector& operator= (const T& k)\n-363 {\n-364 _data = k;\n-365 return *this;\n-366 }\n-367\n-368 //===== forward methods to container\n-369 static constexpr size_type size () { return 1; }\n-370\n-371 K & operator[]([[maybe_unused]] size_type i)\n-372 {\n-373 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n-374 return _data;\n-375 }\n-376 const K & operator[]([[maybe_unused]] size_type i) const\n-377 {\n-378 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n-379 return _data;\n-380 }\n+338 inline bool _\bi_\bs_\bS_\by_\bn_\bc_\be_\bd() const;\n+339\n+343 inline MPI_Comm _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const;\n+344\n+359 template\n+360 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+361\n+368 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd(int proc) const;\n+369\n+374 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+375\n+380 inline _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n 381\n-383 K* data() noexcept\n-384 {\n-385 return &_data;\n-386 }\n+385 template\n+386 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 387\n-389 const K* data() const noexcept\n-390 {\n-391 return &_data;\n-392 }\n-393\n-394 //===== conversion operator\n-395\n-397 operator K& () { return _data; }\n+391 inline void _\bf_\br_\be_\be();\n+392\n+397 inline int _\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs() const;\n 398\n-400 operator const K& () const { return _data; }\n-401 };\n-402\n-403 /* ----- FV / FV ----- */\n-404 /* mostly not necessary as these operations are already covered via the\n-cast operator */\n-405\n-407 template\n-408 inline bool operator> (const FieldVector& a, const FieldVector&\n-b)\n-409 {\n-410 return a[0]>b[0];\n-411 }\n-412\n-414 template\n-415 inline bool operator>= (const FieldVector& a, const FieldVector&\n-b)\n-416 {\n-417 return a[0]>=b[0];\n-418 }\n-419\n-421 template\n-422 inline bool operator< (const FieldVector& a, const FieldVector&\n-b)\n-423 {\n-424 return a[0]\n-429 inline bool operator<= (const FieldVector& a, const FieldVector&\n-b)\n-430 {\n-431 return a[0]<=b[0];\n-432 }\n-433\n-434 /* ----- FV / scalar ----- */\n-435\n-437 template\n-438 inline FieldVector operator+ (const FieldVector& a, const K b)\n-439 {\n-440 return a[0]+b;\n-441 }\n-442\n-444 template\n-445 inline FieldVector operator- (const FieldVector& a, const K b)\n-446 {\n-447 return a[0]-b;\n-448 }\n-449\n-451 template\n-452 inline FieldVector operator* (const FieldVector& a, const K b)\n-453 {\n-454 return a[0]*b;\n-455 }\n-456\n-458 template\n-459 inline FieldVector operator/ (const FieldVector& a, const K b)\n-460 {\n-461 return a[0]/b;\n-462 }\n-463\n-465 template\n-466 inline bool operator> (const FieldVector& a, const K b)\n-467 {\n-468 return a[0]>b;\n-469 }\n-470\n-472 template\n-473 inline bool operator>= (const FieldVector& a, const K b)\n-474 {\n-475 return a[0]>=b;\n-476 }\n-477\n-479 template\n-480 inline bool operator< (const FieldVector& a, const K b)\n-481 {\n-482 return a[0]\n-487 inline bool operator<= (const FieldVector& a, const K b)\n-488 {\n-489 return a[0]<=b;\n-490 }\n-491\n-493 template\n-494 inline bool operator== (const FieldVector& a, const K b)\n-495 {\n-496 return a[0]==b;\n-497 }\n-498\n-500 template\n-501 inline bool operator!= (const FieldVector& a, const K b)\n-502 {\n-503 return a[0]!=b;\n-504 }\n-505\n-506 /* ----- scalar / FV ------ */\n-507\n-509 template\n-510 inline FieldVector operator+ (const K a, const FieldVector& b)\n-511 {\n-512 return a+b[0];\n-513 }\n-514\n-516 template\n-517 inline FieldVector operator- (const K a, const FieldVector& b)\n-518 {\n-519 return a-b[0];\n-520 }\n-521\n-523 template\n-524 inline FieldVector operator* (const K a, const FieldVector& b)\n-525 {\n-526 return a*b[0];\n-527 }\n-528\n-530 template\n-531 inline FieldVector operator/ (const K a, const FieldVector& b)\n-532 {\n-533 return a/b[0];\n-534 }\n-535\n-537 template\n-538 inline bool operator> (const K a, const FieldVector& b)\n-539 {\n-540 return a>b[0];\n-541 }\n-542\n-544 template\n-545 inline bool operator>= (const K a, const FieldVector& b)\n-546 {\n-547 return a>=b[0];\n-548 }\n-549\n-551 template\n-552 inline bool operator< (const K a, const FieldVector& b)\n-553 {\n-554 return a\n-559 inline bool operator<= (const K a, const FieldVector& b)\n-560 {\n-561 return a<=b[0];\n-562 }\n-563\n-565 template\n-566 inline bool operator== (const K a, const FieldVector& b)\n-567 {\n-568 return a==b[0];\n-569 }\n-570\n-572 template\n-573 inline bool operator!= (const K a, const FieldVector& b)\n-574 {\n-575 return a!=b[0];\n-576 }\n-577#endif\n-578\n-579 /* Overloads for common classification functions */\n-_\b5_\b8_\b0 namespace MathOverloads {\n-581\n-582 // ! Returns whether all entries are finite\n-583 template\n-_\b5_\b8_\b4 auto _\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-585 bool out = true;\n-586 for(int i=0; i\n-_\b5_\b9_\b4 bool _\bi_\bs_\bI_\bn_\bf(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-595 bool out = false;\n-596 for(int i=0; i::value>>\n-_\b6_\b0_\b4 bool _\bi_\bs_\bN_\ba_\bN(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-605 bool out = false;\n-606 for(int i=0; i::value>>\n-_\b6_\b1_\b4 bool _\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b1_\b> &b, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b1_\b> &c,\n-615 _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-616 return Dune::isUnordered(b[0],c[0]);\n-617 }\n-618 } //MathOverloads\n-619\n-622} // end namespace\n-623\n-624#endif\n-_\bm_\ba_\bt_\bh_\b._\bh_\bh\n-Some useful basic math stuff.\n-_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Type traits to determine the type of reals (when working with complex numbers)\n-_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-Implements the dense vector interface, with an exchangeable storage class.\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-_\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+400 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+401\n+403 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+404\n+405 private:\n+407 _\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+408\n+410 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* source_;\n+411\n+413 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* target_;\n+414\n+416 MPI_Comm comm_;\n+417\n+420 std::set neighbourIds;\n+421\n+423 const static int commTag_=333;\n+424\n+429 int sourceSeqNo_;\n+430\n+435 int destSeqNo_;\n+436\n+440 bool publicIgnored;\n+441\n+445 bool firstBuild;\n+446\n+447 /*\n+448 * @brief If true, sending from indices of the processor to other\n+449 * indices on the same processor is enabled even if the same indexset is\n+used\n+450 * on both the\n+451 * sending and receiving side.\n+452 */\n+453 bool includeSelf;\n+454\n+456 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+457 PairType;\n+458\n+465 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp remoteIndices_;\n+466\n+477 template\n+478 inline void buildRemote(bool includeSelf);\n+479\n+485 inline int noPublic(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet);\n+486\n+498 template\n+499 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+500 char* p_out, MPI_Datatype type, int bufferSize,\n+501 int* position, int n);\n+502\n+516 inline void unpackIndices(_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& remote, int remoteEntries,\n+517 PairType** local, int localEntries, char* p_in,\n+518 MPI_Datatype type, int* position, int bufferSize,\n+519 bool fromOurself);\n+520\n+521 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+522 int remoteEntries, PairType** localSource,\n+523 int localSourceEntries, PairType** localDest,\n+524 int localDestEntries, char* p_in,\n+525 MPI_Datatype type, int* position, int bufferSize);\n+526\n+527 void unpackCreateRemote(char* p_in, PairType** sourcePairs, PairType**\n+DestPairs,\n+528 int remoteProc, int sourcePublish, int destPublish,\n+529 int bufferSize, bool sendTwo, bool fromOurSelf=false);\n+530 };\n+531\n+549 template\n+_\b5_\b5_\b0 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+551 {\n+552\n+553 template\n+_\b5_\b5_\b4 friend class _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n+555\n+556 public:\n+_\b5_\b5_\b7 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+558 {};\n+559\n+_\b5_\b6_\b8 constexpr static bool _\bM_\bO_\bD_\bI_\bF_\bY_\bI_\bN_\bD_\bE_\bX_\bS_\bE_\bT = mode;\n+569\n+_\b5_\b7_\b3 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+574\n+_\b5_\b7_\b8 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+579\n+_\b5_\b8_\b3 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+584\n+_\b5_\b8_\b8 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+589\n+_\b5_\b9_\b3 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+594\n+_\b5_\b9_\b8 typedef A _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+599\n+601 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_\b2 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt;\n+603\n+_\b6_\b0_\b7 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+608\n+_\b6_\b1_\b2 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+613\n+627 void _\bi_\bn_\bs_\be_\br_\bt(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& index);\n+628\n+629\n+644 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+645\n+653 bool _\br_\be_\bm_\bo_\bv_\be(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global);\n+654\n+667 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+668\n+669\n+670 _\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+671\n+_\b6_\b7_\b6 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\bi_\be_\br()\n+677 : glist_()\n+678 {}\n+679\n+680 private:\n+681\n+687 _\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+688 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt& rList);\n+689\n+690 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+691 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+692 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt* rList_;\n+693 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* indexSet_;\n+694 GlobalList glist_;\n+695 _\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n+696 GlobalModifyIterator giter_;\n+697 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n+698 bool first_;\n+699 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx last_;\n+700 };\n+701\n+706 template\n+_\b7_\b0_\b7 class _\bC_\bo_\bl_\bl_\be_\bc_\bt_\bi_\bv_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+708 {\n+709\n+713 typedef T ParallelIndexSet;\n+714\n+718 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+719\n+723 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+724\n+728 typedef typename LocalIndex::Attribute Attribute;\n+729\n+731 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+732\n+734 using Allocator = typename std::allocator_traits::template\n+rebind_alloc;\n+735\n+737 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+738\n+740 typedef std::map >\n+742 Map;\n+743\n+744 public:\n+745\n+747 typedef std::map >\n+_\b7_\b4_\b8 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp;\n+749\n+755 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+756\n+765 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global);\n+766\n+776 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(const GlobalIndex& global, const Attribute& attribute);\n+777\n+778 _\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+779\n+783 inline bool _\be_\bm_\bp_\bt_\by() const;\n+784\n+_\b7_\b9_\b1 class _\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+792 {\n+793 public:\n+_\b7_\b9_\b4 typedef typename Map::iterator _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b9_\b5 typedef typename Map::iterator _\bC_\bo_\bn_\bs_\bt_\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+796\n+797\n+_\b7_\b9_\b9 _\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+800 : iter_(iter), end_(_\be_\bn_\bd), index_(index), hasAttribute(false)\n+801 {\n+802 // Move to the first valid entry\n+803 while(iter_!=end_ && iter_->second.first->localIndexPair().global\n+()!=index_)\n+804 ++iter_;\n+805 }\n+806\n+_\b8_\b0_\b7 _\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+808 Attribute attribute)\n+809 : iter_(iter), end_(_\be_\bn_\bd), index_(index), attribute_(attribute),\n+hasAttribute(true)\n+810 {\n+811 // Move to the first valid entry or the end\n+812 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n+()!=index_\n+813 || iter_->second.first->localIndexPair().local().attribute()!=attribute))\n+814 ++iter_;\n+815 }\n+_\b8_\b1_\b7 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n+818 : iter_(other.iter_), end_(other.end_), index_(other.index_)\n+819 { }\n+820\n+_\b8_\b2_\b2 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+823 {\n+824 ++iter_;\n+825 // If entry is not valid move on\n+826 while(iter_!=end_ && (iter_->second.first->localIndexPair().global\n+()!=index_ ||\n+827 (hasAttribute &&\n+828 iter_->second.first->localIndexPair().local().attribute()!=attribute_)))\n+829 ++iter_;\n+830 assert(iter_==end_ ||\n+831 (iter_->second.first->localIndexPair().global()==index_));\n+832 assert(iter_==end_ || !hasAttribute ||\n+833 (iter_->second.first->localIndexPair().local().attribute()==attribute_));\n+834 return *this;\n+835 }\n+836\n+_\b8_\b3_\b8 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const\n+839 {\n+840 return *(iter_->second.first);\n+841 }\n+842\n+_\b8_\b4_\b4 int _\bp_\br_\bo_\bc_\be_\bs_\bs() const\n+845 {\n+846 return iter_->first;\n+847 }\n+848\n+_\b8_\b5_\b0 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const\n+851 {\n+852 return iter_->second.first.operator->();\n+853 }\n+854\n+_\b8_\b5_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n+857 {\n+858 return other.iter_==iter_;\n+859 }\n+860\n+_\b8_\b6_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bi_\bt_\be_\br_\ba_\bt_\bo_\br& other) const\n+863 {\n+864 return other.iter_!=iter_;\n+865 }\n+866\n+867 private:\n+868 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br();\n+869\n+870 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter_;\n+871 _\bR_\be_\ba_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n+872 GlobalIndex index_;\n+873 Attribute attribute_;\n+874 bool hasAttribute;\n+875 };\n+876\n+877 iterator _\bb_\be_\bg_\bi_\bn();\n+878\n+879 iterator _\be_\bn_\bd();\n+880\n+881 private:\n+882\n+883 Map map_;\n+884 GlobalIndex index_;\n+885 Attribute attribute_;\n+886 bool noattribute;\n+887 };\n+888\n+889 template\n+_\b8_\b9_\b0 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+891 {\n+892 if(type==MPI_DATATYPE_NULL) {\n+893 int length[2] = {1, 1};\n+894 MPI_Aint base;\n+895 MPI_Aint disp[2];\n+896 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+897 _\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+898 _\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+899 MPI_Get_address(&rep, &base); // lower bound of the datatype\n+900 MPI_Get_address(&(rep.global_), &disp[0]);\n+901 MPI_Get_address(&(rep.local_), &disp[1]);\n+902 for (MPI_Aint& d : disp)\n+903 d -= base;\n+904\n+905 MPI_Datatype tmp;\n+906 MPI_Type_create_struct(2, length, disp, types, &tmp);\n+907\n+908 MPI_Type_create_resized(tmp, 0, sizeof(_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br\n+>), &type);\n+909 MPI_Type_commit(&type);\n+910\n+911 MPI_Type_free(&tmp);\n+912 }\n+913 return type;\n+914 }\n+915\n+916 template\n+917 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+918\n+919 template\n+_\b9_\b2_\b0 _\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+921 : localIndex_(local), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n+(attribute))\n+922 {}\n+923\n+924 template\n+_\b9_\b2_\b5 _\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+926 : localIndex_(0), attribute_(static_cast<_\bs_\bt_\bd::underlying_type_t>\n+(attribute))\n+927 {}\n+928\n+929 template\n+_\b9_\b3_\b0 _\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+931 : localIndex_(0), attribute_()\n+932 {}\n+933 template\n+_\b9_\b3_\b4 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+935 {\n+936 return localIndex_==ri.localIndex_ && attribute_==ri._\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+937 }\n+938\n+939 template\n+_\b9_\b4_\b0 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+941 {\n+942 return localIndex_!=ri.localIndex_ || attribute_!=ri.attribute_;\n+943 }\n+944\n+945 template\n+_\b9_\b4_\b6 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+947 {\n+948 return T2(attribute_);\n+949 }\n+950\n+951 template\n+_\b9_\b5_\b2 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+953 {\n+954 return *localIndex_;\n+955 }\n+956\n+957 template\n+_\b9_\b5_\b8 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+959 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n+960 const MPI_Comm& comm,\n+961 const std::vector& neighbours,\n+962 bool includeSelf_)\n+963 : source_(&source), target_(&destination), comm_(comm),\n+964 sourceSeqNo_(-1), destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n+965 includeSelf(includeSelf_)\n+966 {\n+967 _\bs_\be_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(_\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs);\n+968 }\n+969\n+970 template\n+_\b9_\b7_\b1 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+972 {\n+973 includeSelf=b;\n+974 }\n+975\n+976 template\n+_\b9_\b7_\b7 _\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+978 : source_(0), target_(0), sourceSeqNo_(-1),\n+979 destSeqNo_(-1), publicIgnored(false), firstBuild(true),\n+980 includeSelf(false)\n+981 {}\n+982\n+983 template\n+_\b9_\b8_\b4 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+985 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& destination,\n+986 const MPI_Comm& comm,\n+987 const std::vector& neighbours)\n+988 {\n+989 free();\n+990 source_ = &source;\n+991 target_ = &destination;\n+992 comm_ = comm;\n+993 firstBuild = true;\n+994 setNeighbours(neighbours);\n+995 }\n+996\n+997 template\n+998 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_\b9 _\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+1000 {\n+1001 return *source_;\n+1002 }\n+1003\n+1004\n+1005 template\n+1006 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_\b7 _\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+1008 {\n+1009 return *target_;\n+1010 }\n+1011\n+1012\n+1013 template\n+_\b1_\b0_\b1_\b4 _\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+1015 {\n+1016 free();\n+1017 }\n+1018\n+1019 template\n+1020 template\n+_\b1_\b0_\b2_\b1 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+1022 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indexSet,\n+1023 char* p_out, MPI_Datatype type,\n+1024 int bufferSize,\n+1025 int *position,\n+1026 [[maybe_unused]] int n)\n+1027 {\n+1028 // fill with own indices\n+1029 const auto end = indexSet._\be_\bn_\bd();\n+1030\n+1031 //Now pack the source indices\n+1032 int i=0;\n+1033 for(auto index = indexSet.begin(); index != end; ++index)\n+1034 if(ignorePublic || index->local().isPublic()) {\n+1035\n+1036 MPI_Pack(const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index)), 1,\n+1037 type,\n+1038 p_out, bufferSize, position, comm_);\n+1039 pairs[i++] = const_cast<_\bP_\ba_\bi_\br_\bT_\by_\bp_\be*>(&(*index));\n+1040\n+1041 }\n+1042 assert(i==n);\n+1043 }\n+1044\n+1045 template\n+1046 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+1047 {\n+1048\n+1049 int noPublic=0;\n+1050\n+1051 const auto end=indexSet._\be_\bn_\bd();\n+1052 for(auto index=indexSet._\bb_\be_\bg_\bi_\bn(); index!=end; ++index)\n+1053 if(index->local().isPublic())\n+1054 noPublic++;\n+1055\n+1056 return noPublic;\n+1057\n+1058 }\n+1059\n+1060\n+1061 template\n+1062 inline void RemoteIndices::unpackCreateRemote(char* p_in, PairType**\n+sourcePairs,\n+1063 PairType** destPairs, int remoteProc,\n+1064 int sourcePublish, int destPublish,\n+1065 int bufferSize, bool sendTwo,\n+1066 bool fromOurSelf)\n+1067 {\n+1068\n+1069 // unpack the number of indices we received\n+1070 int noRemoteSource=-1, noRemoteDest=-1;\n+1071 char twoIndexSets=0;\n+1072 int position=0;\n+1073 // Did we receive two index sets?\n+1074 MPI_Unpack(p_in, bufferSize, &position, &twoIndexSets, 1, MPI_CHAR,\n+comm_);\n+1075 // The number of source indices received\n+1076 MPI_Unpack(p_in, bufferSize, &position, &noRemoteSource, 1, MPI_INT,\n+comm_);\n+1077 // The number of destination indices received\n+1078 MPI_Unpack(p_in, bufferSize, &position, &noRemoteDest, 1, MPI_INT, comm_);\n+1079\n+1080\n+1081 // Indices for which we receive\n+1082 RemoteIndexList* receive= new RemoteIndexList();\n+1083 // Indices for which we send\n+1084 RemoteIndexList* send=0;\n+1085\n+1086 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+1087\n+1088 if(!twoIndexSets) {\n+1089 if(sendTwo) {\n+1090 send = new RemoteIndexList();\n+1091 // Create both remote index sets simultaneously\n+1092 unpackIndices(*send, *receive, noRemoteSource, sourcePairs, sourcePublish,\n+1093 destPairs, destPublish, p_in, type, &position, bufferSize);\n+1094 }else{\n+1095 // we only need one list\n+1096 unpackIndices(*receive, noRemoteSource, sourcePairs, sourcePublish,\n+1097 p_in, type, &position, bufferSize, fromOurSelf);\n+1098 send=receive;\n+1099 }\n+1100 }else{\n+1101\n+1102 int oldPos=position;\n+1103 // Two index sets received\n+1104 unpackIndices(*receive, noRemoteSource, destPairs, destPublish,\n+1105 p_in, type, &position, bufferSize, fromOurSelf);\n+1106 if(!sendTwo)\n+1107 //unpack source entries again as destination entries\n+1108 position=oldPos;\n+1109\n+1110 send = new RemoteIndexList();\n+1111 unpackIndices(*send, noRemoteDest, sourcePairs, sourcePublish,\n+1112 p_in, type, &position, bufferSize, fromOurSelf);\n+1113 }\n+1114\n+1115 if(receive->empty() && send->empty()) {\n+1116 if(send==receive) {\n+1117 delete send;\n+1118 }else{\n+1119 delete send;\n+1120 delete receive;\n+1121 }\n+1122 }else{\n+1123 remoteIndices_.insert(std::make_pair(remoteProc,\n+1124 std::make_pair(send,receive)));\n+1125 }\n+1126 }\n+1127\n+1128\n+1129 template\n+1130 template\n+1131 inline void RemoteIndices::buildRemote(bool includeSelf_)\n+1132 {\n+1133 // Processor configuration\n+1134 int rank, procs;\n+1135 MPI_Comm_rank(comm_, &rank);\n+1136 MPI_Comm_size(comm_, &procs);\n+1137\n+1138 // number of local indices to publish\n+1139 // The indices of the destination will be send.\n+1140 int sourcePublish, destPublish;\n+1141\n+1142 // Do we need to send two index sets?\n+1143 char sendTwo = (source_ != target_);\n+1144\n+1145 if(procs==1 && !(sendTwo || includeSelf_))\n+1146 // Nothing to communicate\n+1147 return;\n+1148\n+1149 sourcePublish = (ignorePublic) ? source_->size() : noPublic(*source_);\n+1150\n+1151 if(sendTwo)\n+1152 destPublish = (ignorePublic) ? target_->size() : noPublic(*target_);\n+1153 else\n+1154 // we only need to send one set of indices\n+1155 destPublish = 0;\n+1156\n+1157 int maxPublish, publish=sourcePublish+destPublish;\n+1158\n+1159 // Calculate maximum number of indices send\n+1160 MPI_Allreduce(&publish, &maxPublish, 1, MPI_INT, MPI_MAX, comm_);\n+1161\n+1162 // allocate buffers\n+1163 PairType** destPairs;\n+1164 PairType** sourcePairs = new PairType*[sourcePublish>0 ? sourcePublish :\n+1];\n+1165\n+1166 if(sendTwo)\n+1167 destPairs = new PairType*[destPublish>0 ? destPublish : 1];\n+1168 else\n+1169 destPairs=sourcePairs;\n+1170\n+1171 char** buffer = new char*[2];\n+1172 int bufferSize;\n+1173 int position=0;\n+1174 int intSize;\n+1175 int charSize;\n+1176\n+1177 // calculate buffer size\n+1178 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+1179\n+1180 MPI_Pack_size(maxPublish, type, comm_,\n+1181 &bufferSize);\n+1182 MPI_Pack_size(1, MPI_INT, comm_,\n+1183 &intSize);\n+1184 MPI_Pack_size(1, MPI_CHAR, comm_,\n+1185 &charSize);\n+1186 // Our message will contain the following:\n+1187 // a bool whether two index sets where sent\n+1188 // the size of the source and the dest indexset,\n+1189 // then the source and destination indices\n+1190 bufferSize += 2 * intSize + charSize;\n+1191\n+1192 if(bufferSize<=0) bufferSize=1;\n+1193\n+1194 buffer[0] = new char[bufferSize];\n+1195 buffer[1] = new char[bufferSize];\n+1196\n+1197\n+1198 // pack entries into buffer[0], p_out below!\n+1199 MPI_Pack(&sendTwo, 1, MPI_CHAR, buffer[0], bufferSize, &position,\n+1200 comm_);\n+1201\n+1202 // The number of indices we send for each index set\n+1203 MPI_Pack(&sourcePublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n+1204 comm_);\n+1205 MPI_Pack(&destPublish, 1, MPI_INT, buffer[0], bufferSize, &position,\n+1206 comm_);\n+1207\n+1208 // Now pack the source indices and setup the destination pairs\n+1209 packEntries(sourcePairs, *source_, buffer[0], type,\n+1210 bufferSize, &position, sourcePublish);\n+1211 // If necessary send the dest indices and setup the source pairs\n+1212 if(sendTwo)\n+1213 packEntries(destPairs, *target_, buffer[0], type,\n+1214 bufferSize, &position, destPublish);\n+1215\n+1216\n+1217 // Update remote indices for ourself\n+1218 if(sendTwo|| includeSelf_)\n+1219 unpackCreateRemote(buffer[0], sourcePairs, destPairs, rank, sourcePublish,\n+1220 destPublish, bufferSize, sendTwo, includeSelf_);\n+1221\n+1222 neighbourIds.erase(rank);\n+1223\n+1224 if(neighbourIds.size()==0)\n+1225 {\n+1226 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb<::size_type size_type;\n+1262 size_type noNeighbours=neighbourIds.size();\n+1263\n+1264 // setup sends\n+1265 for(std::set::iterator neighbour=neighbourIds.begin();\n+1266 neighbour!= neighbourIds.end(); ++neighbour) {\n+1267 // Only send the information to the neighbouring processors\n+1268 MPI_Issend(buffer[0], position , MPI_PACKED, *neighbour, commTag_, comm_,\n+req++);\n+1269 }\n+1270\n+1271 //Test for received messages\n+1272\n+1273 for(size_type received=0; received \n+1314 inline void RemoteIndices::unpackIndices(RemoteIndexList& remote,\n+1315 int remoteEntries,\n+1316 PairType** local,\n+1317 int localEntries,\n+1318 char* p_in,\n+1319 MPI_Datatype type,\n+1320 int* position,\n+1321 int bufferSize,\n+1322 bool fromOurSelf)\n+1323 {\n+1324 if(remoteEntries==0)\n+1325 return;\n+1326\n+1327 PairType index;\n+1328 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n+1329 type, comm_);\n+1330 GlobalIndex oldGlobal=index.global();\n+1331 int n_in=0, localIndex=0;\n+1332\n+1333 //Check if we know the global index\n+1334 while(localIndexglobal()==index.global()) {\n+1336 int oldLocalIndex=localIndex;\n+1337\n+1338 while(localIndexglobal()==index.global()) {\n+1340 if(!fromOurSelf || index.local().attribute() !=\n+1341 local[localIndex]->local().attribute())\n+1342 // if index is from us it has to have a different attribute\n+1343 remote.push_back(RemoteIndex(index.local().attribute(),\n+1344 local[localIndex]));\n+1345 localIndex++;\n+1346 }\n+1347\n+1348 // unpack next remote index\n+1349 if((++n_in) < remoteEntries) {\n+1350 MPI_Unpack(p_in, bufferSize, position, &index, 1,\n+1351 type, comm_);\n+1352 if(index.global()==oldGlobal)\n+1353 // Restart comparison for the same global indices\n+1354 localIndex=oldLocalIndex;\n+1355 else\n+1356 oldGlobal=index.global();\n+1357 }else{\n+1358 // No more received indices\n+1359 break;\n+1360 }\n+1361 continue;\n+1362 }\n+1363\n+1364 if (local[localIndex]->global()\n+1387 inline void RemoteIndices::unpackIndices(RemoteIndexList& send,\n+1388 RemoteIndexList& receive,\n+1389 int remoteEntries,\n+1390 PairType** localSource,\n+1391 int localSourceEntries,\n+1392 PairType** localDest,\n+1393 int localDestEntries,\n+1394 char* p_in,\n+1395 MPI_Datatype type,\n+1396 int* position,\n+1397 int bufferSize)\n+1398 {\n+1399 int n_in=0, sourceIndex=0, destIndex=0;\n+1400\n+1401 //Check if we know the global index\n+1402 while(n_in= than the\n+one in the unpacked index\n+1410 while(sourceIndexglobal\n+()global\n+()global\n+()==index.global())\n+1418 send.push_back(RemoteIndex(index.local().attribute(),\n+1419 localSource[sourceIndex]));\n+1420\n+1421 if(destIndex < localDestEntries && localDest[destIndex]->global() ==\n+index.global())\n+1422 receive.push_back(RemoteIndex(index.local().attribute(),\n+1423 localDest[sourceIndex]));\n+1424 }\n+1425\n+1426 }\n+1427\n+1428 template\n+_\b1_\b4_\b2_\b9 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+1430 {\n+1431 auto lend = remoteIndices_.end();\n+1432 for(auto lists=remoteIndices_.begin(); lists != lend; ++lists) {\n+1433 if(lists->second.first==lists->second.second) {\n+1434 // there is only one remote index list.\n+1435 delete lists->second.first;\n+1436 }else{\n+1437 delete lists->second.first;\n+1438 delete lists->second.second;\n+1439 }\n+1440 }\n+1441 remoteIndices_.clear();\n+1442 firstBuild=true;\n+1443 }\n+1444\n+1445 template\n+_\b1_\b4_\b4_\b6 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+1447 {\n+1448 return remoteIndices_.size();\n+1449 }\n+1450\n+1451 template\n+1452 template\n+_\b1_\b4_\b5_\b3 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+1454 {\n+1455 // Test whether a rebuild is Needed.\n+1456 if(firstBuild ||\n+1457 ignorePublic!=publicIgnored || !\n+1458 isSynced()) {\n+1459 free();\n+1460\n+1461 buildRemote(includeSelf);\n+1462\n+1463 sourceSeqNo_ = source_->seqNo();\n+1464 destSeqNo_ = target_->seqNo();\n+1465 firstBuild=false;\n+1466 publicIgnored=ignorePublic;\n+1467 }\n+1468\n+1469\n+1470 }\n+1471\n+1472 template\n+_\b1_\b4_\b7_\b3 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+1474 {\n+1475 return sourceSeqNo_==source_->seqNo() && destSeqNo_ ==target_->seqNo();\n+1476 }\n+1477\n+1478 template\n+1479 template\n+_\b1_\b4_\b8_\b0 _\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+1481 {\n+1482\n+1483 // The user are on their own now!\n+1484 // We assume they know what they are doing and just set the\n+1485 // remote indices to synced status.\n+1486 sourceSeqNo_ = source_->seqNo();\n+1487 destSeqNo_ = target_->seqNo();\n+1488\n+1489 typename RemoteIndexMap::iterator found = remoteIndices_.find(process);\n+1490\n+1491 if(found == remoteIndices_.end())\n+1492 {\n+1493 if(source_ != target_)\n+1494 found = remoteIndices_._\bi_\bn_\bs_\be_\br_\bt(found, std::make_pair(process,\n+1495 std::make_pair(new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt(),\n+1496 new _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bL_\bi_\bs_\bt())));\n+1497 else{\n+1498 _\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+1499 found = remoteIndices_.insert(found,\n+1500 std::make_pair(process,\n+1501 std::make_pair(rlist, rlist)));\n+1502 }\n+1503 }\n+1504\n+1505 firstBuild = false;\n+1506\n+1507 if(send)\n+1508 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+1509 else\n+1510 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+1511 }\n+1512\n+1513 template\n+1514 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_\b5 _\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+1516 {\n+1517 return remoteIndices_.find(proc);\n+1518 }\n+1519\n+1520 template\n+1521 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_\b2 _\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+1523 {\n+1524 return remoteIndices_.begin();\n+1525 }\n+1526\n+1527 template\n+1528 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_\b9 _\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+1530 {\n+1531 return remoteIndices_.end();\n+1532 }\n+1533\n+1534\n+1535 template\n+_\b1_\b5_\b3_\b6 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+1537 {\n+1538 if(neighbours()!=ri._\bn_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs())\n+1539 return false;\n+1540\n+1541 const auto rend = remoteIndices_.end();\n+1542\n+1543 for(auto rindex = remoteIndices_.begin(), rindex1=ri.remoteIndices_.begin\n+(); rindex!=rend; ++rindex, ++rindex1) {\n+1544 if(rindex->first != rindex1->first)\n+1545 return false;\n+1546 if(*(rindex->second.first) != *(rindex1->second.first))\n+1547 return false;\n+1548 if(*(rindex->second.second) != *(rindex1->second.second))\n+1549 return false;\n+1550 }\n+1551 return true;\n+1552 }\n+1553\n+1554 template\n+1555 _\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+1556 RemoteIndexList& rList)\n+1557 : rList_(&rList), indexSet_(&indexSet), iter_(rList.beginModify()), end_\n+(rList.end()), first_(true)\n+1558 {\n+1559 if(MODIFYINDEXSET) {\n+1560 assert(indexSet_);\n+1561 for(ConstIterator iter=iter_; iter != end_; ++iter)\n+1562 glist_.push_back(iter->localIndexPair().global());\n+1563 giter_ = glist_.beginModify();\n+1564 }\n+1565 }\n+1566\n+1567 template\n+_\b1_\b5_\b6_\b8 _\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+1569 : rList_(other.rList_), indexSet_(other.indexSet_),\n+1570 glist_(other.glist_), iter_(other.iter_), giter_(other.giter_), end_\n+(other.end_),\n+1571 first_(other.first_), last_(other.last_)\n+1572 {}\n+1573\n+1574 template\n+_\b1_\b5_\b7_\b5 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+1576 {\n+1577 if(MODIFYINDEXSET) {\n+1578 // repair pointers to local index set.\n+1579#ifdef DUNE_ISTL_WITH_CHECKING\n+1580 if(indexSet_->state()!=_\bG_\bR_\bO_\bU_\bN_\bD)\n+1581 _\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+1582#endif\n+1583 auto giter = glist_.begin();\n+1584 auto index = indexSet_->begin();\n+1585\n+1586 for(auto iter=rList_->begin(); iter != end_; ++iter) {\n+1587 while(index->global()<*giter) {\n+1588 ++index;\n+1589#ifdef DUNE_ISTL_WITH_CHECKING\n+1590 if(index == indexSet_->end())\n+1591 _\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+1592#endif\n+1593 }\n+1594\n+1595#ifdef DUNE_ISTL_WITH_CHECKING\n+1596 if(index->global() != *giter)\n+1597 _\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+1598#endif\n+1599 iter->localIndex_ = &(*index);\n+1600 }\n+1601 }\n+1602 }\n+1603\n+1604 template\n+_\b1_\b6_\b0_\b5 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+1606 {\n+1607 static_assert(!mode,\"Not allowed if the mode indicates that new indices\"\n+1608 \"might be added to the underlying index set. Use \"\n+1609 \"insert(const RemoteIndex&, const GlobalIndex&) instead\");\n+1610\n+1611#ifdef DUNE_ISTL_WITH_CHECKING\n+1612 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+1617 ++iter_;\n+1618 }\n+1619\n+1620 // No duplicate entries allowed\n+1621 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+1622 iter_.insert(index);\n+1623 last_ = index._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx_\bP_\ba_\bi_\br()._\bg_\bl_\bo_\bb_\ba_\bl();\n+1624 first_ = false;\n+1625 }\n+1626\n+1627 template\n+_\b1_\b6_\b2_\b8 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+1629 {\n+1630 static_assert(mode,\"Not allowed if the mode indicates that no new indices\"\n+1631 \"might be added to the underlying index set. Use \"\n+1632 \"insert(const RemoteIndex&) instead\");\n+1633#ifdef DUNE_ISTL_WITH_CHECKING\n+1634 if(!first_ && globallocalIndexPair().global() != global);\n+1645 iter_.insert(index);\n+1646 giter_.insert(global);\n+1647\n+1648 last_ = global;\n+1649 first_ = false;\n+1650 }\n+1651\n+1652 template\n+_\b1_\b6_\b5_\b3 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+1654 {\n+1655#ifdef DUNE_ISTL_WITH_CHECKING\n+1656 if(!first_ && globallocalIndexPair().global() < global)\n+1675 ++iter_;\n+1676\n+1677 if(iter_->localIndexPair().global()==global) {\n+1678 iter_.remove();\n+1679 found = true;\n+1680 }\n+1681 }\n+1682\n+1683 last_ = global;\n+1684 first_ = false;\n+1685 return found;\n+1686 }\n+1687\n+1688 template\n+1689 template\n+_\b1_\b6_\b9_\b0 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+1691 {\n+1692 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+1693 }\n+1694\n+1695 template\n+_\b1_\b6_\b9_\b6 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+1697 {\n+1698 return comm_;\n+1699\n+1700 }\n+1701\n+1702 template\n+_\b1_\b7_\b0_\b3 _\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+1704 {\n+1705\n+1706 const auto end = pmap.end();\n+1707 for(auto process = pmap.begin(); process != end; ++process) {\n+1708 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+1709 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+1710 map_.insert(std::make_pair(process->first,\n+1711 std::pair(list->_\bb_\be_\bg_\bi_\bn(), list->_\be_\bn_\bd())));\n+1712 }\n+1713 }\n+1714\n+1715 template\n+_\b1_\b7_\b1_\b6 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+1717 {\n+1718 const auto end = map_.end();\n+1719\n+1720 for(auto iter = map_.begin(); iter != end;) {\n+1721 // Step the iterator until we are >= index\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 current = iter->second.first;\n+1723 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+1724 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n+1725 if(current != rend)\n+1726 remoteIndex = *current;\n+1727\n+1728 while(iter->second.first!=iter->second.second && iter->second.first-\n+>localIndexPair().global()second.first);\n+1730\n+1731 // erase from the map if there are no more entries.\n+1732 if(iter->second.first == iter->second.second)\n+1733 map_.erase(iter++);\n+1734 else{\n+1735 ++iter;\n+1736 }\n+1737 }\n+1738 index_=index;\n+1739 noattribute=true;\n+1740 }\n+1741\n+1742 template\n+_\b1_\b7_\b4_\b3 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+1744 const Attribute& attribute)\n+1745 {\n+1746 const auto end = map_.end();\n+1747\n+1748 for(auto iter = map_.begin(); iter != end;) {\n+1749 // Step the iterator until we are >= index\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 current = iter->second.first;\n+1751 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+1752 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx remoteIndex;\n+1753 if(current != rend)\n+1754 remoteIndex = *current;\n+1755\n+1756 // Move to global index or bigger\n+1757 while(iter->second.first!=iter->second.second && iter->second.first-\n+>localIndexPair().global()second.first);\n+1759\n+1760 // move to attribute or bigger\n+1761 while(iter->second.first!=iter->second.second\n+1762 && iter->second.first->localIndexPair().global()==index\n+1763 && iter->second.first->localIndexPair().local().attribute()second.first);\n+1765\n+1766 // erase from the map if there are no more entries.\n+1767 if(iter->second.first == iter->second.second)\n+1768 map_.erase(iter++);\n+1769 else{\n+1770 ++iter;\n+1771 }\n+1772 }\n+1773 index_=index;\n+1774 attribute_=attribute;\n+1775 noattribute=false;\n+1776 }\n+1777\n+1778 template\n+_\b1_\b7_\b7_\b9 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+1780 {\n+1781 const auto end = map_._\be_\bn_\bd();\n+1782\n+1783 for(auto iter = map_.begin(); iter != end;) {\n+1784 // Step the iterator until we are >= index\n+1785 auto current = iter->second.first;\n+1786 auto rend = iter->second.second;\n+1787\n+1788 // move all iterators pointing to the current global index to next value\n+1789 if(iter->second.first->localIndexPair().global()==index_ &&\n+1790 (noattribute || iter->second.first->localIndexPair().local().attribute()\n+== attribute_))\n+1791 ++(iter->second.first);\n+1792\n+1793 // erase from the map if there are no more entries.\n+1794 if(iter->second.first == iter->second.second)\n+1795 map_.erase(iter++);\n+1796 else{\n+1797 ++iter;\n+1798 }\n+1799 }\n+1800 return *this;\n+1801 }\n+1802\n+1803 template\n+_\b1_\b8_\b0_\b4 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+1805 {\n+1806 return map_.empty();\n+1807 }\n+1808\n+1809 template\n+1810 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_\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:_\bb_\be_\bg_\bi_\bn()\n+1812 {\n+1813 if(noattribute)\n+1814 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_);\n+1815 else\n+1816 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.begin(), map_.end(), index_,\n+1817 attribute_);\n+1818 }\n+1819\n+1820 template\n+1821 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_\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:_\be_\bn_\bd()\n+1823 {\n+1824 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(map_.end(), map_.end(), index_);\n+1825 }\n+1826\n+1827 template\n+_\b1_\b8_\b2_\b8 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+1829 {\n+1830 os<<\"[global=\"<\n+_\b1_\b8_\b3_\b5 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+1836 {\n+1837 int rank;\n+1838 MPI_Comm_rank(indices.comm_, &rank);\n+1839 const auto rend = indices.remoteIndices_.end();\n+1840\n+1841 for(auto rindex = indices.remoteIndices_.begin(); rindex!=rend; ++rindex)\n+{\n+1842 os<first<<\":\";\n+1843\n+1844 if(!rindex->second.first->empty()) {\n+1845 os<<\" send:\";\n+1846\n+1847 const auto send= rindex->second.first->end();\n+1848\n+1849 for(auto index = rindex->second.first->begin();\n+1850 index != send; ++index)\n+1851 os<<*index<<\" \";\n+1852 os<second.second->empty()) {\n+1855 os<first<<\": \"<<\"receive: \";\n+1856\n+1857 for(const auto& index : *(rindex->second.second))\n+1858 os << index << \" \";\n+1859 }\n+1860 os< 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:556\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 _\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 _\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:_\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:_\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:_\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:_\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:_\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:95\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:_\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-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_\bI_\bn_\bf\n-bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:594\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-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:584\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-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:614\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:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\ba_\bt_\ba\n-K * data() noexcept\n-return pointer to underlying array\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:198\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-constexpr FieldVector()\n-Constructor making default-initialized vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\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-const value_type & const_reference\n-The type used for const references to the vector entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:109\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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 fvector.hh:102\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-FieldVector(const DenseVector< C > &x, typename std::enable_if<\n-IsFieldVectorSizeCorrect< C, SIZE >::value >::type *dummy=0)\n-Copy constructor from a second vector of possibly different type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-FieldVector(const FieldVector< T, N > &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-FieldVector(const K &t)\n-Constructor making vector with identical coordinates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-FieldVector(std::initializer_list< K > const &l)\n-Construct from a std::initializer_list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\ba_\bt_\ba\n-const K * data() const noexcept\n-return pointer to underlying array\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:204\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-static constexpr int dimension\n-The size of this vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-FieldVector(const FieldVector< K1, SIZE > &x)\n-Constructor making vector with identical coordinates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n-static constexpr size_type size()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-value_type & reference\n-The type used for references to the vector entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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 fvector.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const K & operator[](size_type i) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-FieldVector & operator=(const FieldVector< T, N > &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n-FieldVector(const FieldVector &)=default\n-Copy constructor.\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 densevector.hh:250\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:_\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 densevector.hh:259\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_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be\n-std::array< K, SIZE > container_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.hh:46\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-FieldVector< K, SIZE > derived_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:43\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.hh:53\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt\n-TMP to check the size of a DenseVectors statically, if possible.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr bool value\n-True if C is not of type FieldVector or its dimension is not equal SIZE.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:71\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:_\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:_\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:_\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:41\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:35\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:49\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:189\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:307\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:231\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:977\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:_\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:984\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:1429\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:215\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:1453\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:206\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:1696\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:226\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 colletively iterating over the remote indices of all remote\n+processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn remoteindices.hh:1690\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:971\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:1529\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:1536\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:245\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:300\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:1480\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:999\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:1014\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:241\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:1446\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:210\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:1007\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:237\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:1515\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:1473\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:1522\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:221\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:247\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:73\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:946\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:_\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:934\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:90\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:99\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:105\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:952\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:930\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:940\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:551\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:1575\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:602\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:598\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:1605\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:578\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:583\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:612\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:607\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:1653\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:573\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:676\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:588\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:593\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:568\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:708\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:1779\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:1822\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:1703\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:1804\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:1716\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:748\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:1811\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:167\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:558\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:792\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:799\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:817\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:838\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:795\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:822\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:850\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:856\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:844\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:807\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:862\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:794\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/a00257.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00257.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: path.hh File Reference\n+dune-common: mpicollectivecommunication.hh File Reference\n \n \n \n \n \n \n \n@@ -65,61 +65,24 @@\n
    \n \n \n \n \n \n \n
    \n- \n-
    path.hh File Reference
    \n+
    mpicollectivecommunication.hh File Reference
    \n
    \n
    \n-\n-

    Utilities for handling filesystem paths. \n-More...

    \n-
    #include <string>
    \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-\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-
    \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,42 +1,12 @@\n dune-common\u00a02.9.0\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.hh 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+ * _\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-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- 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 ===============================================================================\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/a00257_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: path.hh Source File\n+dune-common: mpicollectivecommunication.hh Source File\n \n \n \n \n \n \n \n@@ -70,58 +70,27 @@\n \n \n \n \n \n \n \n
    \n-
    path.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 (C) 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_PATH_HH
    \n-
    6#define DUNE_COMMON_PATH_HH
    \n-
    7
    \n-
    8#include <string>
    \n-
    9
    \n-
    10namespace Dune {
    \n-
    23
    \n-
    51 std::string concatPaths(const std::string& base, const std::string& p);
    \n-
    52
    \n-
    54
    \n-
    98 std::string processPath(const std::string& p);
    \n-
    99
    \n-
    101
    \n-
    109 bool pathIndicatesDirectory(const std::string& p);
    \n-
    110
    \n-
    112
    \n-
    151 std::string prettyPath(const std::string& p, bool isDirectory);
    \n-
    152
    \n-
    154
    \n-
    160 std::string prettyPath(const std::string& p);
    \n-
    161
    \n-
    163
    \n-
    179 std::string relativePath(const std::string& newbase, const std::string& p);
    \n-
    180
    \n-
    182}
    \n-
    183
    \n-
    184#endif // DUNE_COMMON_PATH_HH
    \n-
    std::string processPath(const std::string &p)
    sanitize a path for further processing
    Definition path.cc:41
    \n-
    bool pathIndicatesDirectory(const std::string &p)
    check whether the given path indicates that it is a directory
    Definition path.cc:115
    \n-
    std::string prettyPath(const std::string &p, bool isDirectory)
    pretty print path
    Definition path.cc:126
    \n-
    std::string relativePath(const std::string &newbase, const std::string &p)
    compute a relative path between two paths
    Definition path.cc:153
    \n-
    std::string concatPaths(const std::string &base, const std::string &p)
    concatenate two paths
    Definition path.cc:32
    \n-
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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,65 +1,21 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-path.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_PATH_HH\n-6#define DUNE_COMMON_PATH_HH\n-7\n-8#include \n-9\n-10namespace _\bD_\bu_\bn_\be {\n-23\n-51 std::string _\bc_\bo_\bn_\bc_\ba_\bt_\bP_\ba_\bt_\bh_\bs(const std::string& base, const std::string& p);\n-52\n-54\n-98 std::string _\bp_\br_\bo_\bc_\be_\bs_\bs_\bP_\ba_\bt_\bh(const std::string& p);\n-99\n-101\n-109 bool _\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-110\n-112\n-151 std::string _\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh(const std::string& p, bool isDirectory);\n-152\n-154\n-160 std::string _\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh(const std::string& p);\n-161\n-163\n-179 std::string _\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bP_\ba_\bt_\bh(const std::string& newbase, const std::string& p);\n-180\n-182}\n-183\n-184#endif // DUNE_COMMON_PATH_HH\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bo_\bc_\be_\bs_\bs_\bP_\ba_\bt_\bh\n-std::string processPath(const std::string &p)\n-sanitize a path for further processing\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:41\n-_\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\n-bool pathIndicatesDirectory(const std::string &p)\n-check whether the given path indicates that it is a directory\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\be_\bt_\bt_\by_\bP_\ba_\bt_\bh\n-std::string prettyPath(const std::string &p, bool isDirectory)\n-pretty print path\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bl_\ba_\bt_\bi_\bv_\be_\bP_\ba_\bt_\bh\n-std::string relativePath(const std::string &newbase, const std::string &p)\n-compute a relative path between two paths\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bc_\ba_\bt_\bP_\ba_\bt_\bh_\bs\n-std::string concatPaths(const std::string &base, const std::string &p)\n-concatenate two paths\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn path.cc:32\n-_\bD_\bu_\bn_\be\n-Dune namespace.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn alignedallocator.hh:13\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/a00260.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00260.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: assertandreturn.hh File Reference\n+dune-common: documentation.hh File Reference\n \n \n \n \n \n \n \n@@ -70,28 +70,46 @@\n
    \n \n
    \n
    \n
    \n
    \n-Macros
    \n-
    assertandreturn.hh File Reference
    \n+Classes |\n+Namespaces |\n+Enumerations
    \n+
    documentation.hh File Reference
    \n \n
    \n-
    #include <cassert>
    \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+\n+

    \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+Classes

    struct  Dune::ImplementationDefined
     Dummy struct used for documentation purposes. More...
     
    \n+\n+\n+\n+\n+

    \n+Namespaces

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

    \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,17 +1,25 @@\n dune-common\u00a02.9.0\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-assertandreturn.hh File Reference\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\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-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+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 \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+\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/a00260_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: assertandreturn.hh Source File\n+dune-common: documentation.hh Source File\n \n \n \n \n \n \n \n@@ -74,36 +74,38 @@\n \n
    \n \n
    \n \n
    \n-
    assertandreturn.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 (C) 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#include <cassert>
    \n-
    9
    \n-
    11
    \n-
    19#ifdef NDEBUG
    \n-
    20 #define DUNE_ASSERT_AND_RETURN(C,X) X
    \n-
    21#else
    \n-
    22 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return 0;}() : 0), X
    \n-
    23#endif
    \n-
    24
    \n-
    25
    \n-
    26
    \n-
    27#endif // DUNE_COMMON_ASSERTANDRETURN_HH
    \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+
    Dune namespace.
    Definition alignedallocator.hh:13
    \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,31 +1,38 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-assertandreturn.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 (C) 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_ASSERTANDRETURN_HH\n-6#define DUNE_COMMON_ASSERTANDRETURN_HH\n-7\n-8#include \n-9\n-11\n-19#ifdef NDEBUG\n-20 #define DUNE_ASSERT_AND_RETURN(C,X) X\n-21#else\n-_\b2_\b2 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return\n-0;}() : 0), X\n-23#endif\n-24\n-25\n-26\n-27#endif // DUNE_COMMON_ASSERTANDRETURN_HH\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+_\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 ===============================================================================\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/a00263.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00263.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.cc File Reference\n \n \n \n \n \n \n \n@@ -69,39 +69,27 @@\n \n
    \n \n
    \n \n
    \n- \n-
    parameterizedobject.hh File Reference
    \n+
    parametertree.cc File Reference
    \n
    \n
    \n-
    #include <functional>
    \n-#include <map>
    \n-#include <memory>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/typeutilities.hh>
    \n-
    \n-

    Go to the source code of this file.

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

    \n-Classes

    class  Dune::ParameterizedObjectFactory< TypeT(Args...), KeyT >
     
    \n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-
    \n+
    #include <cstdlib>
    \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+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,23 +1,19 @@\n dune-common\u00a02.9.0\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-#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 <_\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-_\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-\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+#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/a00266.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00266.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parametertreeparser.hh File Reference\n+dune-common: mallocallocator.hh File Reference\n \n \n \n \n \n \n \n@@ -71,49 +71,56 @@\n \n \n \n
    \n \n-
    parametertreeparser.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    mallocallocator.hh File Reference
    \n \n
    \n \n-

    Various parser methods to get data into a ParameterTree object. \n+

    Allocators that use malloc/free. \n More...

    \n-
    #include <istream>
    \n-#include <string>
    \n-#include <vector>
    \n-#include <dune/common/parametertree.hh>
    \n-#include <dune/common/exceptions.hh>
    \n+
    #include <exception>
    \n+#include <cstdlib>
    \n+#include <new>
    \n+#include <utility>
    \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 Classes

    class  Dune::ParameterTreeParserError
     report parser error while reading ParameterTree More...
    class  Dune::MallocAllocator< T >
     Allocators implementation which simply calls malloc/free. More...
     
    class  Dune::HelpRequest
     exception thrown if the user wants to see help string More...
     
    class  Dune::ParameterTreeParser
     Parsers to set up a ParameterTree from various input sources. More...
    struct  Dune::MallocAllocator< T >::rebind< U >
     
    \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 >
    constexpr bool Dune::operator== (const MallocAllocator< T > &, const MallocAllocator< T > &)
     check whether allocators are equivalent
     
    template<class T >
    constexpr bool Dune::operator!= (const MallocAllocator< T > &, const MallocAllocator< T > &)
     check whether allocators are not equivalent
     
    \n

    Detailed Description

    \n-

    Various parser methods to get data into a ParameterTree object.

    \n+

    Allocators that use malloc/free.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,39 @@\n dune-common\u00a02.9.0\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-parametertreeparser.hh File Reference\n-Various parser methods to get data into a ParameterTree object. _\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/_\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/_\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+mallocallocator.hh File Reference\n+Allocators that use malloc/free. _\bM_\bo_\br_\be_\b._\b._\b.\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:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\bE_\br_\br_\bo_\br\n-\u00a0 report parser error while reading _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 Allocators implementation which simply calls malloc/free. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\be_\bl_\bp_\bR_\be_\bq_\bu_\be_\bs_\bt\n-\u00a0 exception thrown if the user wants to see help string _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br\n-\u00a0 Parsers to set up a _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be from various input sources. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\b _\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+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b= (const _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T > &, const\n+ _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T > &)\n+\u00a0 check whether allocators are equivalent\n+\u00a0\n+template\n+constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b= (const _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T > &, const\n+ _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br< T > &)\n+\u00a0 check whether allocators are not equivalent\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 parser methods to get data into a ParameterTree object.\n+Allocators that use malloc/free.\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/a00266_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parametertreeparser.hh Source File\n+dune-common: mallocallocator.hh Source File\n \n \n \n \n \n \n \n@@ -74,92 +74,162 @@\n \n
    \n \n
    \n
    \n
    \n-
    parametertreeparser.hh
    \n+
    mallocallocator.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 (C) 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_PARAMETER_PARSER_HH
    \n-
    6#define DUNE_PARAMETER_PARSER_HH
    \n+
    5#ifndef DUNE_MALLOC_ALLOCATOR_HH
    \n+
    6#define DUNE_MALLOC_ALLOCATOR_HH
    \n
    7
    \n-
    12#include <istream>
    \n-
    13#include <string>
    \n-
    14#include <vector>
    \n-
    15
    \n-\n-\n-
    18
    \n-
    19namespace Dune {
    \n-
    20
    \n-\n-
    28 class HelpRequest : public Exception {};
    \n-
    29
    \n-
    \n-\n-
    35 {
    \n+
    8#include <exception>
    \n+
    9#include <cstdlib>
    \n+
    10#include <new>
    \n+
    11#include <utility>
    \n+
    12
    \n+
    17namespace Dune
    \n+
    18{
    \n+
    23 template <class T>
    \n+
    \n+\n+
    25 public:
    \n+
    26 typedef std::size_t size_type;
    \n+
    27 typedef std::ptrdiff_t difference_type;
    \n+
    28 typedef T* pointer;
    \n+
    29 typedef const T* const_pointer;
    \n+
    30 typedef T& reference;
    \n+
    31 typedef const T& const_reference;
    \n+
    32 typedef T value_type;
    \n+
    \n+
    33 template <class U> struct rebind {
    \n+\n+
    35 };
    \n+
    \n
    36
    \n-
    37 static std::string ltrim(const std::string& s);
    \n-
    38 static std::string rtrim(const std::string& s);
    \n-
    39
    \n-
    40 public:
    \n-
    41
    \n-
    85
    \n-
    96 static void readINITree(std::istream& in, ParameterTree& pt,
    \n-
    97 bool overwrite);
    \n+
    38 MallocAllocator() noexcept {}
    \n+
    40 template <class U>
    \n+\n+
    43 ~MallocAllocator() noexcept {}
    \n+
    44
    \n+
    \n+\n+
    46 {
    \n+
    47 return &x;
    \n+
    48 }
    \n+
    \n+
    \n+\n+
    50 {
    \n+
    51 return &x;
    \n+
    52 }
    \n+
    \n+
    53
    \n+
    \n+\n+
    56 [[maybe_unused]] const void* hint = 0)
    \n+
    57 {
    \n+
    58 if (n > this->max_size())
    \n+
    59 throw std::bad_alloc();
    \n+
    60
    \n+
    61 pointer ret = static_cast<pointer>(std::malloc(n * sizeof(T)));
    \n+
    62 if (!ret)
    \n+
    63 throw std::bad_alloc();
    \n+
    64 return ret;
    \n+
    65 }
    \n+
    \n+
    66
    \n+
    \n+
    68 void deallocate(pointer p, [[maybe_unused]] size_type n)
    \n+
    69 {
    \n+
    70 std::free(p);
    \n+
    71 }
    \n+
    \n+
    72
    \n+
    \n+
    74 size_type max_size() const noexcept
    \n+
    75 {
    \n+
    76 return size_type(-1) / sizeof(T);
    \n+
    77 }
    \n+
    \n+
    78
    \n+
    \n+
    80 void construct(pointer p, const T& val)
    \n+
    81 {
    \n+
    82 ::new((void*)p)T(val);
    \n+
    83 }
    \n+
    \n+
    84
    \n+
    86 template<typename ... Args>
    \n+
    \n+
    87 void construct(pointer p, Args&&... args)
    \n+
    88 {
    \n+
    89 ::new((void *)p)T(std::forward<Args>(args) ...);
    \n+
    90 }
    \n+
    \n+
    91
    \n+
    \n+\n+
    94 {
    \n+
    95 p->~T();
    \n+
    96 }
    \n+
    \n+
    97 };
    \n+
    \n
    98
    \n-
    105 static Dune::ParameterTree readINITree(std::istream& in);
    \n+
    100 template<class T>
    \n+
    101 constexpr bool
    \n+
    \n+\n+
    103 {
    \n+
    104 return true;
    \n+
    105 }
    \n+
    \n
    106
    \n-
    107
    \n-
    120 static void readINITree(std::istream& in, ParameterTree& pt,
    \n-
    121 const std::string srcname = "stream",
    \n-
    122 bool overwrite = true);
    \n-
    123
    \n-
    124
    \n-
    135 static void readINITree(std::string file, ParameterTree& pt, bool overwrite = true);
    \n-
    136
    \n-
    143 static Dune::ParameterTree readINITree(const std::string& file);
    \n-
    144
    \n-
    146
    \n-
    158 static void readOptions(int argc, char* argv [], ParameterTree& pt);
    \n-
    159
    \n-
    177 static void readNamedOptions(int argc, char* argv[],
    \n-
    178 ParameterTree& pt,
    \n-
    179 std::vector<std::string> keywords,
    \n-
    180 unsigned int required = std::numeric_limits<unsigned int>::max(),
    \n-
    181 bool allow_more = true,
    \n-
    182 bool overwrite = true,
    \n-
    183 std::vector<std::string> help = std::vector<std::string>());
    \n-
    184
    \n-
    185 private:
    \n-
    186 static std::string generateHelpString(std::string progname, std::vector<std::string> keywords, unsigned int required, std::vector<std::string> help);
    \n-
    187 };
    \n-
    \n-
    188
    \n-
    189} // end namespace Dune
    \n-
    190
    \n-
    191#endif // DUNE_PARAMETER_PARSER_HH
    \n-
    A hierarchical structure of string parameters.
    \n-
    A few common exception classes.
    \n+
    108 template<class T>
    \n+
    109 constexpr bool
    \n+
    \n+\n+
    111 {
    \n+
    112 return false;
    \n+
    113 }
    \n+
    \n+
    114}
    \n+
    115
    \n+
    116#endif // DUNE_MALLOC_ALLOCATOR_HH
    \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:237
    \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:259
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Base class for Dune-Exceptions.
    Definition exceptions.hh:96
    \n-
    Default exception class for range errors.
    Definition exceptions.hh:254
    \n-
    Hierarchical structure of string parameters.
    Definition parametertree.hh:37
    \n-
    report parser error while reading ParameterTree
    Definition parametertreeparser.hh:22
    \n-
    exception thrown if the user wants to see help string
    Definition parametertreeparser.hh:28
    \n-
    Parsers to set up a ParameterTree from various input sources.
    Definition parametertreeparser.hh:35
    \n-
    static void readOptions(int argc, char *argv[], ParameterTree &pt)
    parse command line options and build hierarchical ParameterTree structure
    Definition parametertreeparser.cc:159
    \n-
    static void readINITree(std::istream &in, ParameterTree &pt, bool overwrite)
    parse C++ stream
    Definition parametertreeparser.cc:74
    \n-
    static void readNamedOptions(int argc, char *argv[], ParameterTree &pt, std::vector< std::string > keywords, unsigned int required=std::numeric_limits< unsigned int >::max(), bool allow_more=true, bool overwrite=true, std::vector< std::string > help=std::vector< std::string >())
    read [named] command line options and build hierarchical ParameterTree structure
    Definition parametertreeparser.cc:175
    \n+
    Allocators implementation which simply calls malloc/free.
    Definition mallocallocator.hh:24
    \n+
    ~MallocAllocator() noexcept
    cleanup this allocator
    Definition mallocallocator.hh:43
    \n+
    T * pointer
    Definition mallocallocator.hh:28
    \n+
    void construct(pointer p, const T &val)
    copy-construct an object of type T (i.e. make a placement new on p)
    Definition mallocallocator.hh:80
    \n+
    MallocAllocator() noexcept
    create a new MallocAllocator
    Definition mallocallocator.hh:38
    \n+
    MallocAllocator(const MallocAllocator< U > &) noexcept
    copy construct from an other MallocAllocator, possibly for a different result type
    Definition mallocallocator.hh:41
    \n+
    std::size_t size_type
    Definition mallocallocator.hh:26
    \n+
    std::ptrdiff_t difference_type
    Definition mallocallocator.hh:27
    \n+
    void deallocate(pointer p, size_type n)
    deallocate n objects of type T at address p
    Definition mallocallocator.hh:68
    \n+
    T value_type
    Definition mallocallocator.hh:32
    \n+
    const_pointer address(const_reference x) const
    Definition mallocallocator.hh:49
    \n+
    const T & const_reference
    Definition mallocallocator.hh:31
    \n+
    void destroy(pointer p)
    destroy an object of type T (i.e. call the destructor)
    Definition mallocallocator.hh:93
    \n+
    pointer allocate(size_type n, const void *hint=0)
    allocate n objects of type T
    Definition mallocallocator.hh:55
    \n+
    pointer address(reference x) const
    Definition mallocallocator.hh:45
    \n+
    void construct(pointer p, Args &&... args)
    construct an object of type T from variadic parameters
    Definition mallocallocator.hh:87
    \n+
    T & reference
    Definition mallocallocator.hh:30
    \n+
    size_type max_size() const noexcept
    max size for allocate
    Definition mallocallocator.hh:74
    \n+
    const T * const_pointer
    Definition mallocallocator.hh:29
    \n+
    Definition mallocallocator.hh:33
    \n+
    MallocAllocator< U > other
    Definition mallocallocator.hh:34
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,116 +1,195 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-parametertreeparser.hh\n+mallocallocator.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 (C) 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_PARAMETER_PARSER_HH\n-6#define DUNE_PARAMETER_PARSER_HH\n+5#ifndef DUNE_MALLOC_ALLOCATOR_HH\n+6#define DUNE_MALLOC_ALLOCATOR_HH\n 7\n-12#include \n-13#include \n-14#include \n-15\n-16#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-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\n-19namespace _\bD_\bu_\bn_\be {\n-20\n-_\b2_\b2 class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\bE_\br_\br_\bo_\br : public _\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br {};\n-_\b2_\b8 class _\bH_\be_\bl_\bp_\bR_\be_\bq_\bu_\be_\bs_\bt : public _\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn {};\n-29\n-_\b3_\b4 class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br\n-35 {\n+8#include \n+9#include \n+10#include \n+11#include \n+12\n+17namespace _\bD_\bu_\bn_\be\n+18{\n+23 template \n+_\b2_\b4 class _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br {\n+25 public:\n+_\b2_\b6 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b7 typedef std::ptrdiff_t _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b8 typedef T* _\bp_\bo_\bi_\bn_\bt_\be_\br;\n+_\b2_\b9 typedef const T* _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n+_\b3_\b0 typedef T& _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b3_\b1 typedef const T& _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b3_\b2 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b3_\b3 template struct _\br_\be_\bb_\bi_\bn_\bd {\n+_\b3_\b4 typedef _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bU_\b> _\bo_\bt_\bh_\be_\br;\n+35 };\n 36\n-37 static std::string ltrim(const std::string& s);\n-38 static std::string rtrim(const std::string& s);\n-39\n-40 public:\n-41\n-85\n-96 static void _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::istream& in, _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt,\n-97 bool overwrite);\n+_\b3_\b8 _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br() noexcept {}\n+40 template \n+_\b4_\b1 _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br(const _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bU_\b>&) noexcept {}\n+_\b4_\b3 _\b~_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br() noexcept {}\n+44\n+_\b4_\b5 _\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\n+46 {\n+47 return &x;\n+48 }\n+_\b4_\b9 _\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\n+50 {\n+51 return &x;\n+52 }\n+53\n+_\b5_\b5 _\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,\n+56 [[maybe_unused]] const void* hint = 0)\n+57 {\n+58 if (n > this->_\bm_\ba_\bx_\b__\bs_\bi_\bz_\be())\n+59 throw std::bad_alloc();\n+60\n+61 _\bp_\bo_\bi_\bn_\bt_\be_\br ret = static_cast<_\bp_\bo_\bi_\bn_\bt_\be_\br>(std::malloc(n * sizeof(T)));\n+62 if (!ret)\n+63 throw std::bad_alloc();\n+64 return ret;\n+65 }\n+66\n+_\b6_\b8 void _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bp_\bo_\bi_\bn_\bt_\be_\br p, [[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n)\n+69 {\n+70 std::free(p);\n+71 }\n+72\n+_\b7_\b4 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\b__\bs_\bi_\bz_\be() const noexcept\n+75 {\n+76 return _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(-1) / sizeof(T);\n+77 }\n+78\n+_\b8_\b0 void _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bp_\bo_\bi_\bn_\bt_\be_\br p, const T& val)\n+81 {\n+82 ::new((void*)p)T(val);\n+83 }\n+84\n+86 template\n+_\b8_\b7 void _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bp_\bo_\bi_\bn_\bt_\be_\br p, Args&&... args)\n+88 {\n+89 ::new((void *)p)T(std::forward(args) ...);\n+90 }\n+91\n+_\b9_\b3 void _\bd_\be_\bs_\bt_\br_\bo_\by(_\bp_\bo_\bi_\bn_\bt_\be_\br p)\n+94 {\n+95 p->~T();\n+96 }\n+97 };\n 98\n-105 static _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::istream& in);\n+100 template\n+101 constexpr bool\n+_\b1_\b0_\b2 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b> &, const _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b> &)\n+103 {\n+104 return true;\n+105 }\n 106\n-107\n-120 static void _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::istream& in, _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt,\n-121 const std::string srcname = \"stream\",\n-122 bool overwrite = true);\n-123\n-124\n-135 static void _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::string file, _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt, bool overwrite\n-= true);\n-136\n-143 static _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(const std::string& file);\n-144\n-146\n-158 static void _\br_\be_\ba_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs(int argc, char* argv [], _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt);\n-159\n-177 static void _\br_\be_\ba_\bd_\bN_\ba_\bm_\be_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs(int argc, char* argv[],\n-178 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt,\n-179 std::vector keywords,\n-180 unsigned int required = std::numeric_limits::max(),\n-181 bool allow_more = true,\n-182 bool overwrite = true,\n-183 std::vector help = std::vector());\n-184\n-185 private:\n-186 static std::string generateHelpString(std::string progname, std::\n-vector keywords, unsigned int required, std::vector\n-help);\n-187 };\n-188\n-189} // end namespace Dune\n-190\n-191#endif // DUNE_PARAMETER_PARSER_HH\n-_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\b._\bh_\bh\n-A hierarchical structure of string parameters.\n-_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-A few common exception classes.\n+108 template\n+109 constexpr bool\n+_\b1_\b1_\b0 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b> &, const _\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b<_\bT_\b> &)\n+111 {\n+112 return false;\n+113 }\n+114}\n+115\n+116#endif // DUNE_MALLOC_ALLOCATOR_HH\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:237\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:259\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-_\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_\bP_\ba_\br_\bs_\be_\br_\bE_\br_\br_\bo_\br\n-report parser error while reading ParameterTree\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bH_\be_\bl_\bp_\bR_\be_\bq_\bu_\be_\bs_\bt\n-exception thrown if the user wants to see help string\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br\n-Parsers to set up a ParameterTree from various input sources.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\b:_\b:_\br_\be_\ba_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n-static void readOptions(int argc, char *argv[], ParameterTree &pt)\n-parse command line options and build hierarchical ParameterTree structure\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.cc:159\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\b:_\b:_\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be\n-static void readINITree(std::istream &in, ParameterTree &pt, bool overwrite)\n-parse C++ stream\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.cc:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\b:_\b:_\br_\be_\ba_\bd_\bN_\ba_\bm_\be_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n-static void readNamedOptions(int argc, char *argv[], ParameterTree &pt, std::\n-vector< std::string > keywords, unsigned int required=std::numeric_limits<\n-unsigned int >::max(), bool allow_more=true, bool overwrite=true, std::vector<\n-std::string > help=std::vector< std::string >())\n-read [named] command line options and build hierarchical ParameterTree\n-structure\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.cc:175\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:_\b~_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+~MallocAllocator() noexcept\n+cleanup this allocator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:43\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:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+void construct(pointer p, const T &val)\n+copy-construct an object of type T (i.e. make a placement new on p)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:80\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_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+MallocAllocator() noexcept\n+create a new MallocAllocator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:38\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_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+MallocAllocator(const MallocAllocator< U > &) noexcept\n+copy construct from an other MallocAllocator, possibly for a different result\n+type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:41\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:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+std::ptrdiff_t difference_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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, size_type n)\n+deallocate n objects of type T at address p\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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 of type T (i.e. call the destructor)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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 mallocallocator.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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, Args &&... args)\n+construct an object of type T from variadic parameters\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+T & reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:30\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+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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 mallocallocator.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bl_\bl_\bo_\bc_\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+MallocAllocator< U > other\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn mallocallocator.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/a00269.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00269.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: bartonnackmanifcheck.hh File Reference\n+dune-common: ftraits.hh File Reference\n \n \n \n \n \n \n \n@@ -70,75 +70,48 @@\n
    \n \n
    \n
    \n
    \n
    \n-Macros
    \n-
    bartonnackmanifcheck.hh File Reference
    \n+Classes |\n+Namespaces
    \n+
    ftraits.hh File Reference
    \n \n
    \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+

    Type traits to determine the type of reals (when working with complex numbers) \n More...

    \n-
    #include <dune/common/exceptions.hh>
    \n+
    #include <complex>
    \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-Macros

    #define CHECK_INTERFACE_IMPLEMENTATION(dummy)
     
    #define CHECK_AND_CALL_INTERFACE_IMPLEMENTATION(__interface_method_to_call__)    (__interface_method_to_call__)
     

    \n+Classes

    struct  Dune::FieldTraits< T >
     
    struct  Dune::FieldTraits< const T >
     
    struct  Dune::FieldTraits< std::complex< T > >
     
    struct  Dune::FieldTraits< T[N] >
     
    struct  Dune::FieldTraits< std::vector< T > >
     
    \n+\n+\n+\n+\n

    \n+Namespaces

    namespace  Dune
     Dune namespace.
     
    \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+

    Type traits to determine the type of reals (when working with complex numbers)

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,47 +1,32 @@\n dune-common\u00a02.9.0\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-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+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+ftraits.hh File Reference\n+Type traits to determine the type of reals (when working with complex numbers)\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-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+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 _\bT_\b _\b>\n \u00a0\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\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 _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\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 _\bT_\b[_\bN_\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 _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\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 *\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+Type traits to determine the type of reals (when working with complex numbers)\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/a00269_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: bartonnackmanifcheck.hh Source File\n+dune-common: ftraits.hh Source File\n \n \n \n \n \n \n \n@@ -74,62 +74,90 @@\n \n
    \n \n
    \n \n
    \n-
    bartonnackmanifcheck.hh
    \n+
    ftraits.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 (C) DUNE Project contributors, see file LICENSE.md in module root
    \n
    4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \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+
    5#ifndef DUNE_FTRAITS_HH
    \n+
    6#define DUNE_FTRAITS_HH
    \n+
    7
    \n+
    12#include <complex>
    \n+
    13#include <vector>
    \n+
    14
    \n+
    15namespace Dune {
    \n+
    16
    \n+
    24 template<class T>
    \n+
    \n+\n+
    26 {
    \n+
    28 typedef T field_type;
    \n+
    30 typedef T real_type;
    \n+
    31 };
    \n+
    \n+
    32
    \n+
    33 template<class T>
    \n+
    \n+
    34 struct FieldTraits<const T>
    \n+
    35 {
    \n+\n+\n+
    38 };
    \n+
    \n+
    39
    \n+
    40 template<class T>
    \n+
    \n+
    41 struct FieldTraits< std::complex<T> >
    \n+
    42 {
    \n+
    43 typedef std::complex<T> field_type;
    \n+
    44 typedef T real_type;
    \n+
    45 };
    \n+
    \n+
    46
    \n+
    47 template<class T, unsigned int N>
    \n+
    \n+
    48 struct FieldTraits< T[N] >
    \n+
    49 {
    \n+\n+\n+
    52 };
    \n+
    \n+
    53
    \n+
    54 template<class T>
    \n+
    \n+
    55 struct FieldTraits< std::vector<T> >
    \n+
    56 {
    \n+\n+\n+
    59 };
    \n+
    \n+
    60
    \n+
    61} // end namespace Dune
    \n+
    62
    \n+
    63#endif // DUNE_FTRAITS_HH
    \n+
    STL namespace.
    \n+
    Dune namespace.
    Definition alignedallocator.hh:13
    \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+
    FieldTraits< T >::field_type field_type
    Definition ftraits.hh:36
    \n+
    FieldTraits< T >::real_type real_type
    Definition ftraits.hh:37
    \n+
    T real_type
    Definition ftraits.hh:44
    \n+
    std::complex< T > field_type
    Definition ftraits.hh:43
    \n+
    FieldTraits< T >::field_type field_type
    Definition ftraits.hh:50
    \n+
    FieldTraits< T >::real_type real_type
    Definition ftraits.hh:51
    \n+
    FieldTraits< T >::real_type real_type
    Definition ftraits.hh:58
    \n+
    FieldTraits< T >::field_type field_type
    Definition ftraits.hh:57
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,57 +1,100 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-bartonnackmanifcheck.hh\n+ftraits.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 (C) 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-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+5#ifndef DUNE_FTRAITS_HH\n+6#define DUNE_FTRAITS_HH\n+7\n+12#include \n+13#include \n+14\n+15namespace _\bD_\bu_\bn_\be {\n+16\n+24 template\n+_\b2_\b5 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n+26 {\n+_\b2_\b8 typedef T _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b3_\b0 typedef T _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+31 };\n+32\n+33 template\n+_\b3_\b4 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n+35 {\n+_\b3_\b6 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b3_\b7 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+38 };\n+39\n+40 template\n+_\b4_\b1 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bs_\bt_\bd::complex >\n+42 {\n+_\b4_\b3 typedef std::complex _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b4_\b4 typedef T _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+45 };\n+46\n+47 template\n+_\b4_\b8 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< T[N] >\n+49 {\n+_\b5_\b0 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\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_\b1 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+52 };\n+53\n+54 template\n+_\b5_\b5 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bs_\bt_\bd::vector >\n+56 {\n+_\b5_\b7 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\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_\b8 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+59 };\n+60\n+61} // end namespace Dune\n+62\n+63#endif // DUNE_FTRAITS_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:_\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:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< T >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< T >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+T real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+std::complex< T > field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b[_\bN_\b]_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< T >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b[_\bN_\b]_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< T >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< T >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< T >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:57\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/a00272.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00272.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: stdstreams.cc File Reference\n+dune-common: timer.hh File Reference\n \n \n \n \n \n \n \n@@ -70,48 +70,40 @@\n
    \n \n
    \n \n
    \n \n-
    stdstreams.cc File Reference
    \n+Classes |\n+Namespaces
    \n+
    timer.hh File Reference
    \n \n
    \n-
    #include "stdstreams.hh"
    \n-
    \n+\n+

    A simple timing class. \n+More...

    \n+
    #include <chrono>
    \n+
    \n+

    Go to the source code of this file.

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

    \n+Classes

    class  Dune::Timer
     A simple stop watch. 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-Variables

    DVVerbType Dune::dvverb (std::cout)
     stream for very verbose output.
     
    DVerbType Dune::dverb (std::cout)
     Singleton of verbose debug stream.
     
    DInfoType Dune::dinfo (std::cout)
     Stream for informative output.
     
    DWarnType Dune::dwarn (std::cerr)
     Stream for warnings indicating problems.
     
    DGraveType Dune::dgrave (std::cerr)
     Stream for warnings indicating fatal errors.
     
    DErrType Dune::derr (std::cerr)
     Stream for error messages.
     
    \n-
    \n+

    Detailed Description

    \n+

    A simple timing class.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,34 +1,24 @@\n dune-common\u00a02.9.0\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 | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n-stdstreams.cc File Reference\n-#include \"_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\b._\bh_\bh\"\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+timer.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn\n+A simple timing class. _\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:_\bT_\bi_\bm_\be_\br\n+\u00a0 A simple stop watch. _\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-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n-_\bD_\bV_\bV_\be_\br_\bb_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb (std::cout)\n-\u00a0 stream for very verbose output.\n-\u00a0\n- _\bD_\bV_\be_\br_\bb_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb (std::cout)\n-\u00a0 _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn of verbose debug stream.\n-\u00a0\n- _\bD_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bi_\bn_\bf_\bo (std::cout)\n-\u00a0 Stream for informative output.\n-\u00a0\n- _\bD_\bW_\ba_\br_\bn_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bw_\ba_\br_\bn (std::cerr)\n-\u00a0 Stream for warnings indicating problems.\n-\u00a0\n-_\bD_\bG_\br_\ba_\bv_\be_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bg_\br_\ba_\bv_\be (std::cerr)\n-\u00a0 Stream for warnings indicating fatal errors.\n-\u00a0\n- _\bD_\bE_\br_\br_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\br_\br (std::cerr)\n-\u00a0 Stream for error messages.\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 simple timing 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/a00275.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00275.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: reservedvector.hh File Reference\n+dune-common: fmatrixev.hh File Reference\n \n \n \n \n \n \n \n@@ -70,72 +70,66 @@\n
    \n \n
    \n \n
    \n \n-
    reservedvector.hh File Reference
    \n+Functions
    \n+
    fmatrixev.hh File Reference
    \n \n
    \n \n-

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

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

    \n
    #include <algorithm>
    \n-#include <array>
    \n-#include <cassert>
    \n #include <iostream>
    \n-#include <iterator>
    \n-#include <cstddef>
    \n-#include <initializer_list>
    \n-#include <dune/common/hash.hh>
    \n+#include <cmath>
    \n+#include <cassert>
    \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::ReservedVector< T, n >
     A Vector class with statically reserved memory. 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-Macros

    #define CHECKSIZE(X)   {}
     

    \n+Functions

    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-

    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+

    Eigenvalue computations for the FieldMatrix class.

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

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

    \n-
    #include <algorithm>
    \n-#include <iostream>
    \n-#include <cmath>
    \n-#include <cassert>
    \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+
    #include <functional>
    \n+#include <map>
    \n+#include <memory>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/typeutilities.hh>
    \n
    \n

    Go to the source code of this file.

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

    \n+Classes

    class  Dune::ParameterizedObjectFactory< TypeT(Args...), KeyT >
     
    \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-Functions

    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-

    Eigenvalue computations for the FieldMatrix class.

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

    Implements a singly linked list together with the necessary iterators. \n+

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

    \n-
    #include <memory>
    \n-#include <cassert>
    \n-#include "iteratorfacades.hh"
    \n-#include <ostream>
    \n+
    #include <vector>
    \n+#include <bitset>
    \n+#include <iostream>
    \n+#include <algorithm>
    \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+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::SLList< T, A >
     A single linked list. More...
    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::SLListIterator< T, A >
     A mutable iterator for the SLList. More...
    class  Dune::BitSetVectorReference< block_size, Alloc >
     A proxy class that acts as a mutable reference to a single bitset in a BitSetVector. More...
     
    class  Dune::SLListConstIterator< T, A >
     A constant iterator for the SLList. More...
    struct  Dune::const_reference< BitSetVectorReference< block_size, Alloc > >
     
    class  Dune::SLListModifyIterator< T, A >
     A mutable iterator for the SLList. More...
    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-\n-\n-\n-\n

    \n-Functions

    template<typename T , typename A >
    std::ostream & Dune::operator<< (std::ostream &os, const SLList< T, A > &sllist)
     
    \n

    Detailed Description

    \n-

    Implements a singly linked list together with the necessary iterators.

    \n-
    Author
    Markus Blatt
    \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,43 +1,48 @@\n dune-common\u00a02.9.0\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-sllist.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn\n-Implements a singly linked list together with the necessary iterators. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \"_\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\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 <_\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 _\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_\bL_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 A single linked list. _\bM_\bo_\br_\be_\b._\b._\b.\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:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 A mutable iterator for the _\bS_\bL_\bL_\bi_\bs_\bt. _\bM_\bo_\br_\be_\b._\b._\b.\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-class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 A constant iterator for the _\bS_\bL_\bL_\bi_\bs_\bt. _\bM_\bo_\br_\be_\b._\b._\b.\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-class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 A mutable iterator for the _\bS_\bL_\bL_\bi_\bs_\bt. _\bM_\bo_\br_\be_\b._\b._\b.\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-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 _\bS_\bL_\bL_\bi_\bs_\bt< T, A >\n- &sllist)\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 singly linked list together with the necessary iterators.\n- Author\n- Markus Blatt\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/a00281_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: sllist.hh Source File\n+dune-common: bitsetvector.hh Source File\n \n \n \n \n \n \n \n@@ -74,778 +74,787 @@\n \n
    \n \n
    \n
    \n
    \n-
    sllist.hh
    \n+
    bitsetvector.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 (C) 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_SLLIST_HH
    \n-
    6#define DUNE_SLLIST_HH
    \n+
    5#ifndef DUNE_BLOCK_BITFIELD_HH
    \n+
    6#define DUNE_BLOCK_BITFIELD_HH
    \n
    7
    \n-
    8#include <memory>
    \n-
    9#include <cassert>
    \n-
    10#include "iteratorfacades.hh"
    \n-
    11#include <ostream>
    \n-
    12
    \n-
    13namespace Dune
    \n-
    14{
    \n-
    26 template<typename T, class A>
    \n-
    27 class SLListIterator;
    \n-
    28
    \n-
    29 template<typename T, class A>
    \n-
    30 class SLListConstIterator;
    \n-
    31
    \n-
    32 template<typename T, class A>
    \n-
    33 class SLListModifyIterator;
    \n-
    34
    \n-
    42 template<typename T, class A=std::allocator<T> >
    \n-
    \n-
    43 class SLList
    \n-
    44 {
    \n-
    45 struct Element;
    \n-
    46 friend class SLListIterator<T,A>;
    \n-
    47 friend class SLListConstIterator<T,A>;
    \n-
    48
    \n-
    49 public:
    \n+
    12#include <vector>
    \n+
    13#include <bitset>
    \n+
    14#include <iostream>
    \n+
    15#include <algorithm>
    \n+
    16
    \n+\n+\n+\n+
    20
    \n+
    21namespace Dune {
    \n+
    22
    \n+
    23 template <int block_size, class Alloc> class BitSetVector;
    \n+
    24 template <int block_size, class Alloc> class BitSetVectorReference;
    \n+
    25
    \n+
    36 template <int block_size, class Alloc>
    \n+
    \n+\n+
    38 {
    \n+
    39 protected:
    \n+
    40
    \n+\n+
    42 friend class Dune::BitSetVector<block_size, Alloc>;
    \n+
    43
    \n+
    \n+
    44 BitSetVectorConstReference(const BitSetVector& blockBitField_, int block_number_) :
    \n+
    45 blockBitField(blockBitField_),
    \n+
    46 block_number(block_number_)
    \n+
    47 {
    \n+
    48 DUNE_ASSERT_BOUNDS(blockBitField_.size() > static_cast<size_t>(block_number_));
    \n+
    49 }
    \n+
    \n
    50
    \n-
    54 typedef typename A::size_type size_type;
    \n+\n+
    53
    \n+
    54 public:
    \n
    55
    \n-
    59 typedef T MemberType;
    \n-
    60
    \n-
    64 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<Element>;
    \n-
    65
    \n-\n+
    56 typedef std::bitset<block_size> bitset;
    \n+
    57
    \n+
    58 // bitset interface typedefs
    \n+
    59 typedef typename std::vector<bool, Alloc>::const_reference reference;
    \n+
    60 typedef typename std::vector<bool, Alloc>::const_reference const_reference;
    \n+
    61 typedef size_t size_type;
    \n+
    62
    \n+
    \n+\n+
    65 {
    \n+
    66 bitset b = *this;
    \n+
    67 b <<= n;
    \n+
    68 return b;
    \n+
    69 }
    \n+
    \n
    70
    \n-\n-
    75
    \n-
    \n-\n-
    80
    \n-
    84 template<typename T1, typename A1>
    \n-
    \n-
    85 SLList(const SLList<T1,A1>& other);
    \n+
    \n+\n+
    73 {
    \n+
    74 bitset b = *this;
    \n+
    75 b >>= n;
    \n+
    76 return b;
    \n+
    77 }
    \n+
    \n+
    78
    \n+
    \n+\n+
    81 {
    \n+
    82 bitset b = *this;
    \n+
    83 b.flip();
    \n+
    84 return b;
    \n+
    85 }
    \n+
    \n
    86
    \n-
    \n-
    90 SLList(const SLList<T,A>& other);
    \n-
    91
    \n-
    \n-\n-
    98
    \n-\n-
    104
    \n-
    \n-\n-
    109
    \n-
    110
    \n+
    \n+\n+
    89 {
    \n+
    90 return block_size;
    \n+
    91 }
    \n+
    \n+
    92
    \n+
    \n+\n+
    95 {
    \n+
    96 size_type n = 0;
    \n+
    97 for(size_type i=0; i<block_size; ++i)
    \n+
    98 n += getBit(i);
    \n+
    99 return n;
    \n+
    100 }
    \n+
    \n+
    101
    \n+
    \n+
    103 bool any() const
    \n+
    104 {
    \n+
    105 return count();
    \n+
    106 }
    \n+
    \n+
    107
    \n+
    \n+
    109 bool none() const
    \n+
    110 {
    \n+
    111 return ! any();
    \n+
    112 }
    \n+
    \n+
    113
    \n
    \n-
    115 inline void push_back(const MemberType& item);
    \n-
    116
    \n-
    \n-
    121 inline void push_front(const MemberType& item);
    \n+
    115 bool all() const
    \n+
    116 {
    \n+
    117 for(size_type i=0; i<block_size; ++i)
    \n+
    118 if(not test(i))
    \n+
    119 return false;
    \n+
    120 return true;
    \n+
    121 }
    \n+
    \n
    122
    \n-
    \n-
    126 inline void pop_front();
    \n-
    127
    \n-
    \n-
    129 inline void clear();
    \n-
    130
    \n-
    \n-
    138 inline iterator begin();
    \n-
    139
    \n-
    \n-
    147 inline const_iterator begin() const;
    \n-
    148
    \n-
    \n-\n-
    157
    \n-
    \n-\n-
    166
    \n-
    \n-
    173 inline iterator end();
    \n-
    174
    \n-
    \n-
    181 inline const_iterator end() const;
    \n-
    182
    \n-
    \n-
    188 inline bool empty() const;
    \n-
    189
    \n-
    \n-
    194 inline int size() const;
    \n-
    195
    \n-
    \n-
    196 bool operator==(const SLList& sl) const;
    \n+
    \n+
    124 bool test(size_type n) const
    \n+
    125 {
    \n+
    126 return getBit(n);
    \n+
    127 }
    \n+
    \n+
    128
    \n+
    \n+\n+
    131 {
    \n+
    132 return getBit(i);
    \n+
    133 }
    \n+
    \n+
    134
    \n+
    \n+
    136 operator bitset() const
    \n+
    137 {
    \n+
    138 return blockBitField.getRepr(block_number);
    \n+
    139 }
    \n+
    \n+
    140
    \n+
    \n+
    142 bool operator== (const bitset& bs) const
    \n+
    143 {
    \n+
    144 return equals(bs);
    \n+
    145 }
    \n+
    \n+
    146
    \n+
    \n+\n+
    149 {
    \n+
    150 return equals(bs);
    \n+
    151 }
    \n+
    \n+
    152
    \n+
    \n+
    154 bool operator!= (const bitset& bs) const
    \n+
    155 {
    \n+
    156 return ! equals(bs);
    \n+
    157 }
    \n+
    \n+
    158
    \n+
    \n+\n+
    161 {
    \n+
    162 return ! equals(bs);
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    \n+
    171 friend std::ostream& operator<< (std::ostream& s, const BitSetVectorConstReference& v)
    \n+
    172 {
    \n+
    173 s << "(";
    \n+
    174 for(int i=0; i<block_size; ++i)
    \n+
    175 s << v[i];
    \n+
    176 s << ")";
    \n+
    177 return s;
    \n+
    178 }
    \n+
    \n+
    179
    \n+
    180 protected:
    \n+\n+\n+
    183
    \n+
    \n+\n+
    185 {
    \n+
    186 return blockBitField.getBit(block_number,i);
    \n+
    187 }
    \n+
    \n+
    188
    \n+
    189 template<class BS>
    \n+
    \n+
    190 bool equals(const BS & bs) const
    \n+
    191 {
    \n+
    192 bool eq = true;
    \n+
    193 for(int i=0; i<block_size; ++i)
    \n+
    194 eq &= (getBit(i) == bs[i]);
    \n+
    195 return eq;
    \n+
    196 }
    \n+
    \n
    197
    \n-
    198
    \n-
    \n-
    199 bool operator!=(const SLList& sl) const;
    \n-
    200
    \n-
    201 private:
    \n-
    203 struct Element
    \n-
    204 {
    \n-\n-\n-
    213
    \n-
    \n-
    214 Element(const MemberType& item, Element* next_=0);
    \n-
    215
    \n-
    \n-\n-
    217
    \n-\n-
    219 };
    \n-
    220
    \n-
    225 void deleteNext(Element* current);
    \n-
    226
    \n-
    231 void copyElements(const SLList<T,A>& other);
    \n-
    232
    \n-
    240 template<bool watchForTail>
    \n-
    241 void deleteNext(Element* current);
    \n-
    247 void insertAfter(Element* current, const T& item);
    \n+
    198 private:
    \n+
    203 void operator & () = delete;
    \n+
    204
    \n+
    205 friend class BitSetVectorReference<block_size, Alloc>;
    \n+
    206 };
    \n+
    \n+
    207
    \n+
    220 template <int block_size, class Alloc>
    \n+
    \n+
    221 class BitSetVectorReference : public BitSetVectorConstReference<block_size,Alloc>
    \n+
    222 {
    \n+
    223 protected:
    \n+
    224
    \n+\n+
    226 friend class Dune::BitSetVector<block_size, Alloc>;
    \n+
    227
    \n+\n+
    229
    \n+
    \n+
    230 BitSetVectorReference(BitSetVector& blockBitField_, int block_number_) :
    \n+
    231 BitSetVectorConstReference(blockBitField_, block_number_),
    \n+
    232 blockBitField(blockBitField_)
    \n+
    233 {}
    \n+
    \n+
    234
    \n+
    235 public:
    \n+
    236 typedef std::bitset<block_size> bitset;
    \n+
    237
    \n+
    241 typedef typename std::vector<bool, Alloc>::reference reference;
    \n+
    243 typedef typename std::vector<bool, Alloc>::const_reference const_reference;
    \n+
    245
    \n+
    247 typedef size_t size_type;
    \n
    248
    \n-
    250 Element beforeHead_;
    \n-
    251
    \n-
    257 Element* tail_;
    \n-
    258
    \n-
    260 Allocator allocator_;
    \n-
    261
    \n-
    263 int size_;
    \n-
    264 };
    \n-
    265
    \n-
    269 template<typename T, class A>
    \n-
    \n-
    270 class SLListIterator : public Dune::ForwardIteratorFacade<SLListIterator<T,A>, T, T&, std::size_t>
    \n-
    271 {
    \n-
    272 friend class SLListConstIterator<T,A>;
    \n-
    273 friend class SLListModifyIterator<T,A>;
    \n-
    274 friend class SLList<T,A>;
    \n-
    275
    \n-
    276 public:
    \n-
    \n-\n-
    278 SLList<T,A>* sllist)
    \n-
    279 : current_(item), list_(sllist)
    \n-
    280 {}
    \n+
    \n+\n+
    251 {
    \n+
    252 for(int i=0; i<block_size; ++i)
    \n+
    253 getBit(i) = b;
    \n+
    254 return (*this);
    \n+
    255 }
    \n+
    \n+
    256
    \n+
    \n+\n+
    259 {
    \n+
    260 for(int i=0; i<block_size; ++i)
    \n+
    261 getBit(i) = b.test(i);
    \n+
    262 return (*this);
    \n+
    263 }
    \n+
    \n+
    264
    \n+
    \n+\n+
    267 {
    \n+
    268 for(int i=0; i<block_size; ++i)
    \n+
    269 getBit(i) = b.test(i);
    \n+
    270 return (*this);
    \n+
    271 }
    \n+
    \n+
    272
    \n+
    \n+\n+
    275 {
    \n+
    276 for(int i=0; i<block_size; ++i)
    \n+
    277 getBit(i) = b.test(i);
    \n+
    278 return (*this);
    \n+
    279 }
    \n
    \n-
    281
    \n+
    280
    \n
    \n-\n-
    283 : current_(0), list_(0)
    \n-
    284 {}
    \n-
    \n-
    285
    \n-
    \n-\n-
    287 : current_(other.iterator_.current_), list_(other.iterator_.list_)
    \n-
    288 {}
    \n-
    \n-
    289
    \n-
    \n-
    294 inline T& dereference() const
    \n-
    295 {
    \n-
    296 return current_->item_;
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    \n-
    304 inline bool equals(const SLListConstIterator<T,A>& other) const
    \n-
    305 {
    \n-
    306 return current_==other.current_;
    \n-
    307 }
    \n+\n+
    283 {
    \n+
    284 for (size_type i=0; i<block_size; i++)
    \n+
    285 getBit(i) = (test(i) & x.test(i));
    \n+
    286 return *this;
    \n+
    287 }
    \n+
    \n+
    288
    \n+
    \n+\n+
    291 {
    \n+
    292 for (size_type i=0; i<block_size; i++)
    \n+
    293 getBit(i) = (test(i) & x.test(i));
    \n+
    294 return *this;
    \n+
    295 }
    \n+
    \n+
    296
    \n+
    \n+\n+
    299 {
    \n+
    300 for (size_type i=0; i<block_size; i++)
    \n+
    301 getBit(i) = (test(i) | x.test(i));
    \n+
    302 return *this;
    \n+
    303 }
    \n+
    \n+
    304
    \n+
    \n+\n+
    307 {
    \n+
    308 for (size_type i=0; i<block_size; i++)
    \n+
    309 getBit(i) = (test(i) | x.test(i));
    \n+
    310 return *this;
    \n+
    311 }
    \n
    \n-
    308
    \n+
    312
    \n
    \n-
    314 inline bool equals(const SLListIterator<T,A>& other) const
    \n-
    315 {
    \n-
    316 return current_==other.current_;
    \n-
    317 }
    \n-
    \n-
    318
    \n-
    \n-
    324 inline bool equals(const SLListModifyIterator<T,A>& other) const
    \n-
    325 {
    \n-
    326 return current_==other.iterator_.current_;
    \n-
    327 }
    \n-
    \n-
    328
    \n-
    \n-
    332 inline void increment()
    \n-
    333 {
    \n-
    334 current_ = current_->next_;
    \n-
    335 }
    \n-
    \n+\n+
    315 {
    \n+
    316 for (size_type i=0; i<block_size; i++)
    \n+
    317 getBit(i) = (test(i) ^ x.test(i));
    \n+
    318 return *this;
    \n+
    319 }
    \n+
    \n+
    320
    \n+
    321 private:
    \n+
    322
    \n+
    323 // For some reason, the following variant of operator^= triggers an ICE or a hanging
    \n+
    324 // compiler on Debian 9 with GCC 6.3 and full optimizations enabled (-O3).
    \n+
    325 // The only way to reliably avoid the issue is by making sure that the compiler does not
    \n+
    326 // see the XOR in the context of the function, so here is a little helper that will normally
    \n+
    327 // be inlined, but not on the broken compiler. This incurs a substantial overhead (a function
    \n+
    328 // call), but until someone else has a better idea, it's the only way to make it work reliably.
    \n+
    329
    \n+
    330 static bool xor_helper(bool a, bool b)
    \n+
    331#if defined(__GNUC__) && ! defined(__clang__) && __GNUC__ == 6 && __GNUC_MINOR__ == 3 && __cplusplus \\
    \n+
    332 == 201402L
    \n+
    333 __attribute__((noinline))
    \n+
    334#endif
    \n+
    335 ;
    \n
    336
    \n-
    \n-
    342 inline void insertAfter(const T& v) const
    \n-
    343 {
    \n-
    344 assert(list_ );
    \n-
    345 list_->insertAfter(current_, v);
    \n-
    346 }
    \n-
    \n-
    347
    \n-
    \n-
    353 inline void deleteNext() const
    \n-
    354 {
    \n-
    355 assert(list_);
    \n-
    356 list_->deleteNext(current_);
    \n-
    357 }
    \n-
    \n-
    358
    \n-
    359 private:
    \n-
    361 typename SLList<T,A>::Element* current_;
    \n-\n-
    364 };
    \n-
    \n-
    365
    \n-
    369 template<class T, class A>
    \n-
    \n-
    370 class SLListConstIterator : public Dune::ForwardIteratorFacade<SLListConstIterator<T,A>, const T, const T&, std::size_t>
    \n-
    371 {
    \n-
    372 friend class SLListIterator<T,A>;
    \n-
    373 friend class SLList<T,A>;
    \n-
    374
    \n-
    375 public:
    \n-
    \n-\n-
    377 : current_(0)
    \n-
    378 {}
    \n-
    \n-
    379
    \n-
    \n-\n-
    381 : current_(item)
    \n-
    382 {}
    \n-
    \n-
    383
    \n-
    \n-\n-
    385 : current_(other.current_)
    \n-
    386 {}
    \n+
    337 public:
    \n+
    338
    \n+
    \n+\n+
    341 {
    \n+
    342 // This uses the helper from above to hoist the actual XOR computation out of the function for
    \n+
    343 // the buggy version of GCC.
    \n+
    344 for (size_type i=0; i<block_size; i++)
    \n+
    345 getBit(i) = xor_helper(test(i),x.test(i));
    \n+
    346 return *this;
    \n+
    347 }
    \n+
    \n+
    348
    \n+
    \n+\n+
    351 {
    \n+
    352 for (size_type i=0; i<block_size-n; i++)
    \n+
    353 getBit(i) = test(i+n);
    \n+
    354 return *this;
    \n+
    355 }
    \n+
    \n+
    356
    \n+
    \n+\n+
    359 {
    \n+
    360 for (size_type i=0; i<block_size-n; i++)
    \n+
    361 getBit(i+n) = test(i);
    \n+
    362 return *this;
    \n+
    363 }
    \n+
    \n+
    364
    \n+
    \n+\n+
    367 {
    \n+
    368 for (size_type i=0; i<block_size; i++)
    \n+
    369 set(i);
    \n+
    370 return *this;
    \n+
    371 }
    \n+
    \n+
    372
    \n+
    \n+\n+
    375 {
    \n+
    376 for (size_type i=0; i<block_size; i++)
    \n+
    377 flip(i);
    \n+
    378 return *this;
    \n+
    379 }
    \n+
    \n+
    380
    \n+
    \n+\n+
    383 {
    \n+
    384 *this = false;
    \n+
    385 return *this;
    \n+
    386 }
    \n
    \n
    387
    \n-
    \n-\n-
    389 : current_(other.iterator_.current_)
    \n-
    390 {}
    \n+
    \n+\n+
    390 {
    \n+
    391 getBit(n) = val;
    \n+
    392 return *this;
    \n+
    393 }
    \n
    \n-
    391
    \n+
    394
    \n
    \n-
    396 inline const T& dereference() const
    \n-
    397 {
    \n-
    398 return current_->item_;
    \n-
    399 }
    \n-
    \n-
    400
    \n-
    \n-
    406 inline bool equals(const SLListConstIterator<T,A>& other) const
    \n-
    407 {
    \n-
    408 return current_==other.current_;
    \n-
    409 }
    \n-
    \n-
    410
    \n-
    \n-
    414 inline void increment()
    \n-
    415 {
    \n-
    416 current_ = current_->next_;
    \n-
    417 }
    \n-
    \n-
    418
    \n-
    419 private:
    \n-
    421 typename SLList<T,A>::Element* current_;
    \n-
    422 };
    \n-
    \n-
    423
    \n-
    427 template<typename T, class A>
    \n-
    \n-
    428 class SLListModifyIterator : public Dune::ForwardIteratorFacade<SLListModifyIterator<T,A>, T, T&, std::size_t>
    \n-
    429 {
    \n-
    430 friend class SLListConstIterator<T,A>;
    \n-
    431 friend class SLListIterator<T,A>;
    \n-
    432 public:
    \n-
    \n-\n-
    434 SLListIterator<T,A> _iterator)
    \n-
    435 : beforeIterator_(beforeIterator), iterator_(_iterator)
    \n-
    436 {}
    \n-
    \n-
    437
    \n-
    \n-\n-
    439 : beforeIterator_(), iterator_()
    \n-
    440 {}
    \n-
    \n-
    441
    \n-
    \n-
    446 inline T& dereference() const
    \n-
    447 {
    \n-
    448 return *iterator_;
    \n-
    449 }
    \n-
    \n-
    450
    \n-
    \n-
    456 inline bool equals(const SLListConstIterator<T,A>& other) const
    \n-
    457 {
    \n-
    458 return iterator_== other;
    \n-
    459 }
    \n-
    \n-
    460
    \n-
    461
    \n-
    \n-
    467 inline bool equals(const SLListIterator<T,A>& other) const
    \n-
    468 {
    \n-
    469 return iterator_== other;
    \n-
    470 }
    \n-
    \n-
    471
    \n+\n+
    397 {
    \n+
    398 set(n, false);
    \n+
    399 return *this;
    \n+
    400 }
    \n+
    \n+
    401
    \n+
    \n+\n+
    404 {
    \n+
    405 getBit(n).flip();
    \n+
    406 return *this;
    \n+
    407 }
    \n+
    \n+
    408
    \n+\n+
    410 using BitSetVectorConstReference::operator[];
    \n+
    411
    \n+
    \n+\n+
    414 {
    \n+
    415 return getBit(i);
    \n+
    416 }
    \n+
    \n+
    417
    \n+
    418 protected:
    \n+\n+
    420
    \n+\n+
    422
    \n+
    \n+\n+
    424 {
    \n+
    425 return blockBitField.getBit(this->block_number,i);
    \n+
    426 }
    \n+
    \n+
    427 };
    \n+
    \n+
    428
    \n+
    429 // implementation of helper - I put it into the template to avoid having
    \n+
    430 // to compile it in a dedicated compilation unit
    \n+
    431 template<int block_size, class Alloc>
    \n+
    432 bool BitSetVectorReference<block_size,Alloc>::xor_helper(bool a, bool b)
    \n+
    433 {
    \n+
    434 return a ^ b;
    \n+
    435 }
    \n+
    436
    \n+
    440 template<int block_size, class Alloc>
    \n+
    \n+
    441 struct const_reference< BitSetVectorReference<block_size,Alloc> >
    \n+
    442 {
    \n+\n+
    444 };
    \n+
    \n+
    445
    \n+
    446 template<int block_size, class Alloc>
    \n+
    \n+
    447 struct const_reference< BitSetVectorConstReference<block_size,Alloc> >
    \n+
    448 {
    \n+\n+
    450 };
    \n+
    \n+
    451
    \n+
    452 template<int block_size, class Alloc>
    \n+
    \n+
    453 struct mutable_reference< BitSetVectorReference<block_size,Alloc> >
    \n+
    454 {
    \n+\n+
    456 };
    \n+
    \n+
    457
    \n+
    458 template<int block_size, class Alloc>
    \n+
    \n+\n+
    460 {
    \n+\n+
    462 };
    \n+
    \n+
    463
    \n+
    467 template <int block_size, class Allocator=std::allocator<bool> >
    \n+
    \n+
    468 class BitSetVector : private std::vector<bool, Allocator>
    \n+
    469 {
    \n+
    471 typedef std::vector<bool, Allocator> BlocklessBaseClass;
    \n
    472
    \n-
    \n-
    478 inline bool equals(const SLListModifyIterator<T,A>& other) const
    \n-
    479 {
    \n-
    480 return iterator_== other.iterator_;
    \n-
    481 }
    \n-
    \n+
    473 public:
    \n+
    476
    \n+
    478 typedef std::bitset<block_size> value_type;
    \n+
    479
    \n+\n
    482
    \n-
    \n-
    486 inline void increment()
    \n-
    487 {
    \n-
    488 ++iterator_;
    \n-
    489 ++beforeIterator_;
    \n-
    490 }
    \n-
    \n+\n+
    485
    \n+\n+
    488
    \n+\n
    491
    \n-
    \n-
    505 inline void insert(const T& v)
    \n-
    506 {
    \n-
    507 beforeIterator_.insertAfter(v);
    \n-
    508 ++beforeIterator_;
    \n-
    509 }
    \n-
    \n-
    510
    \n-
    \n-
    518 inline void remove()
    \n-
    519 {
    \n-
    520 ++iterator_;
    \n-
    521 beforeIterator_.deleteNext();
    \n-
    522 }
    \n-
    \n-
    523
    \n-
    524 private:
    \n-
    526 SLListIterator<T,A> beforeIterator_;
    \n-
    528 SLListIterator<T,A> iterator_;
    \n-
    529 };
    \n-
    \n-
    530
    \n-
    531 template<typename T, typename A>
    \n-
    \n-
    532 std::ostream& operator<<(std::ostream& os, const SLList<T,A>& sllist)
    \n-
    533 {
    \n-
    534 typedef typename SLList<T,A>::const_iterator Iterator;
    \n-
    535 Iterator end = sllist.end();
    \n-
    536 Iterator current= sllist.begin();
    \n+
    493 typedef typename std::vector<bool, Allocator>::size_type size_type;
    \n+
    494
    \n+
    496 typedef Allocator allocator_type;
    \n+
    498
    \n+\n+\n+
    504
    \n+
    \n+\n+
    507 return iterator(*this, 0);
    \n+
    508 }
    \n+
    \n+
    509
    \n+
    \n+\n+
    512 return const_iterator(*this, 0);
    \n+
    513 }
    \n+
    \n+
    514
    \n+
    \n+\n+
    517 return iterator(*this, size());
    \n+
    518 }
    \n+
    \n+
    519
    \n+
    \n+\n+
    522 return const_iterator(*this, size());
    \n+
    523 }
    \n+
    \n+
    524
    \n+
    \n+\n+
    527 BlocklessBaseClass()
    \n+
    528 {}
    \n+
    \n+
    529
    \n+
    \n+
    531 BitSetVector(const BlocklessBaseClass& blocklessBitField) :
    \n+
    532 BlocklessBaseClass(blocklessBitField)
    \n+
    533 {
    \n+
    534 if (blocklessBitField.size()%block_size != 0)
    \n+
    535 DUNE_THROW(RangeError, "Vector size is not a multiple of the block size!");
    \n+
    536 }
    \n+
    \n
    537
    \n-
    538 os << "{ ";
    \n-
    539
    \n-
    540 if(current!=end) {
    \n-
    541 os<<*current<<" ("<<static_cast<const void*>(&(*current))<<")";
    \n-
    542 ++current;
    \n-
    543
    \n-
    544 for(; current != end; ++current)
    \n-
    545 os<<", "<<*current<<" ("<<static_cast<const void*>(&(*current))<<")";
    \n-
    546 }
    \n-
    547 os<<"} ";
    \n-
    548 return os;
    \n-
    549 }
    \n-
    \n-
    550
    \n-
    551 template<typename T, class A>
    \n-
    \n-
    552 SLList<T,A>::Element::Element(const MemberType& item, Element* next)
    \n-
    553 : next_(next), item_(item)
    \n-
    554 {}
    \n+
    \n+
    541 explicit BitSetVector(int n) :
    \n+
    542 BlocklessBaseClass(n*block_size)
    \n+
    543 {}
    \n+
    \n+
    544
    \n+
    \n+
    546 BitSetVector(int n, bool v) :
    \n+
    547 BlocklessBaseClass(n*block_size,v)
    \n+
    548 {}
    \n+
    \n+
    549
    \n+
    \n+
    551 void clear()
    \n+
    552 {
    \n+
    553 BlocklessBaseClass::clear();
    \n+
    554 }
    \n
    \n
    555
    \n-
    556 template<typename T, class A>
    \n
    \n-\n-
    558 : next_(0), item_()
    \n-
    559 {}
    \n-
    \n-
    \n-
    560
    \n-
    561 template<typename T, class A>
    \n-
    \n-\n-
    563 {
    \n-
    564 next_=0;
    \n-
    565 }
    \n-
    \n-
    566
    \n-
    567 template<typename T, class A>
    \n-
    \n-\n-
    569 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
    \n-
    570 {
    \n-
    571 beforeHead_.next_=0;
    \n-
    572 assert(&beforeHead_==tail_);
    \n-
    573 assert(tail_->next_==0);
    \n-
    574 }
    \n-
    \n-
    575
    \n-
    576 template<typename T, class A>
    \n-
    \n-\n-
    578 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
    \n-
    579 {
    \n-
    580 copyElements(other);
    \n-
    581 }
    \n-
    \n-
    582
    \n-
    583 template<typename T, class A>
    \n-
    584 template<typename T1, class A1>
    \n+
    557 void resize(int n, bool v = bool())
    \n+
    558 {
    \n+
    559 BlocklessBaseClass::resize(n*block_size, v);
    \n+
    560 }
    \n+
    \n+
    561
    \n+
    \n+\n+
    564 {
    \n+
    565 return BlocklessBaseClass::size()/block_size;
    \n+
    566 }
    \n+
    \n+
    567
    \n+
    \n+
    569 void setAll() {
    \n+
    570 this->assign(BlocklessBaseClass::size(), true);
    \n+
    571 }
    \n+
    \n+
    572
    \n+
    \n+
    574 void unsetAll() {
    \n+
    575 this->assign(BlocklessBaseClass::size(), false);
    \n+
    576 }
    \n+
    \n+
    577
    \n+
    \n+\n+
    580 {
    \n+
    581 return reference(*this, i);
    \n+
    582 }
    \n+
    \n+
    583
    \n
    \n-\n-
    586 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
    \n-
    587 {
    \n-
    588 copyElements(other);
    \n-
    589 }
    \n-
    \n-
    590
    \n-
    591 template<typename T, typename A>
    \n-
    592 void SLList<T,A>::copyElements(const SLList<T,A>& other)
    \n-
    593 {
    \n-
    594 assert(tail_==&beforeHead_);
    \n-
    595 assert(size_==0);
    \n-
    596 typedef typename SLList<T,A>::const_iterator Iterator;
    \n-
    597 Iterator iend = other.end();
    \n-
    598 for(Iterator element=other.begin(); element != iend; ++element)
    \n-
    599 push_back(*element);
    \n-
    600
    \n-
    601 assert(other.size()==size());
    \n-
    602 }
    \n-
    603
    \n-
    604 template<typename T, class A>
    \n-
    \n-\n-
    606 {
    \n-
    607 clear();
    \n-
    608 }
    \n-
    \n-
    609
    \n-
    610 template<typename T, class A>
    \n-
    \n-
    611 bool SLList<T,A>::operator==(const SLList& other) const
    \n-
    612 {
    \n-
    613 if(size()!=other.size())
    \n-
    614 return false;
    \n-
    615 for(const_iterator iter=begin(), oiter=other.begin();
    \n-
    616 iter != end(); ++iter, ++oiter)
    \n-
    617 if(*iter!=*oiter)
    \n-
    618 return false;
    \n-
    619 return true;
    \n-
    620 }
    \n-
    \n-
    621
    \n-
    622 template<typename T, class A>
    \n-
    \n-
    623 bool SLList<T,A>::operator!=(const SLList& other) const
    \n-
    624 {
    \n-
    625 if(size()==other.size()) {
    \n-
    626 for(const_iterator iter=begin(), oiter=other.begin();
    \n-
    627 iter != end(); ++iter, ++oiter)
    \n-
    628 if(*iter!=*oiter)
    \n-
    629 return true;
    \n-
    630 return false;
    \n-
    631 }else
    \n-
    632 return true;
    \n-
    633 }
    \n-
    \n-
    634 template<typename T, class A>
    \n-
    \n-\n-
    636 {
    \n-
    637 clear();
    \n-
    638 copyElements(other);
    \n-
    639 return *this;
    \n-
    640 }
    \n-
    \n-
    641
    \n-
    642 template<typename T, class A>
    \n-
    \n-
    643 inline void SLList<T,A>::push_back(const MemberType& item)
    \n-
    644 {
    \n-
    645 assert(size_>0 || tail_==&beforeHead_);
    \n-
    646 tail_->next_ = allocator_.allocate(1);
    \n-
    647 assert(size_>0 || tail_==&beforeHead_);
    \n-
    648 tail_ = tail_->next_;
    \n-
    649 ::new (static_cast<void*>(&(tail_->item_)))T(item);
    \n-
    650 tail_->next_=0;
    \n-
    651 assert(tail_->next_==0);
    \n-
    652 ++size_;
    \n-
    653 }
    \n+\n+
    586 {
    \n+
    587 return const_reference(*this, i);
    \n+
    588 }
    \n+
    \n+
    589
    \n+
    \n+\n+
    592 {
    \n+
    593 return reference(*this, size()-1);
    \n+
    594 }
    \n+
    \n+
    595
    \n+
    \n+\n+
    598 {
    \n+
    599 return const_reference(*this, size()-1);
    \n+
    600 }
    \n+
    \n+
    601
    \n+
    \n+\n+
    604 {
    \n+
    605 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), true);
    \n+
    606 }
    \n+
    \n+
    607
    \n+
    \n+\n+
    610 {
    \n+
    611 size_type n = 0;
    \n+
    612 size_type blocks = size();
    \n+
    613 for(size_type i=0; i<blocks; ++i)
    \n+
    614 n += getBit(i,j);
    \n+
    615 return n;
    \n+
    616 }
    \n+
    \n+
    617
    \n+
    \n+
    619 friend std::ostream& operator<< (std::ostream& s, const BitSetVector& v)
    \n+
    620 {
    \n+
    621 for (size_t i=0; i<v.size(); i++)
    \n+
    622 s << v[i] << " ";
    \n+
    623 return s;
    \n+
    624 }
    \n+
    \n+
    625
    \n+
    626 private:
    \n+
    627
    \n+
    629 value_type getRepr(int i) const
    \n+
    630 {
    \n+
    631 value_type bits;
    \n+
    632 for(int j=0; j<block_size; ++j)
    \n+
    633 bits.set(j, getBit(i,j));
    \n+
    634 return bits;
    \n+
    635 }
    \n+
    636
    \n+
    637 typename std::vector<bool>::reference getBit(size_type i, size_type j) {
    \n+
    638 DUNE_ASSERT_BOUNDS(j < block_size);
    \n+\n+
    640 return BlocklessBaseClass::operator[](i*block_size+j);
    \n+
    641 }
    \n+
    642
    \n+
    643 typename std::vector<bool>::const_reference getBit(size_type i, size_type j) const {
    \n+
    644 DUNE_ASSERT_BOUNDS(j < block_size);
    \n+\n+
    646 return BlocklessBaseClass::operator[](i*block_size+j);
    \n+
    647 }
    \n+
    648
    \n+
    649 friend class BitSetVectorReference<block_size,Allocator>;
    \n+
    650 friend class BitSetVectorConstReference<block_size,Allocator>;
    \n+
    651 };
    \n
    \n+
    652
    \n+
    653} // namespace Dune
    \n
    654
    \n-
    655 template<typename T, class A>
    \n-
    656 inline void SLList<T,A>::insertAfter(Element* current, const T& item)
    \n-
    657 {
    \n-
    658 assert(current);
    \n-
    659
    \n-
    660#ifndef NDEBUG
    \n-
    661 bool changeTail = (current == tail_);
    \n-
    662#endif
    \n-
    663
    \n-
    664 // Save old next element
    \n-
    665 Element* tmp = current->next_;
    \n-
    666
    \n-
    667 assert(!changeTail || !tmp);
    \n-
    668
    \n-
    669 // Allocate space
    \n-
    670 current->next_ = allocator_.allocate(1);
    \n-
    671
    \n-
    672 // Use copy constructor to initialize memory
    \n-
    673 std::allocator_traits<Allocator>::construct(allocator_, current->next_, Element(item,tmp));
    \n-
    674
    \n-
    675 //::new(static_cast<void*>(&(current->next_->item_))) T(item);
    \n-
    676
    \n-
    677 if(!current->next_->next_) {
    \n-
    678 // Update tail
    \n-
    679 assert(changeTail);
    \n-
    680 tail_ = current->next_;
    \n-
    681 }
    \n-
    682 ++size_;
    \n-
    683 assert(!tail_->next_);
    \n-
    684 }
    \n-
    685
    \n-
    686 template<typename T, class A>
    \n-
    \n-
    687 inline void SLList<T,A>::push_front(const MemberType& item)
    \n-
    688 {
    \n-
    689 if(tail_ == &beforeHead_) {
    \n-
    690 // list was empty
    \n-
    691 beforeHead_.next_ = tail_ = allocator_.allocate(1, 0);
    \n-
    692 ::new(static_cast<void*>(&beforeHead_.next_->item_))T(item);
    \n-
    693 beforeHead_.next_->next_=0;
    \n-
    694 }else{
    \n-
    695 Element* added = allocator_.allocate(1, 0);
    \n-
    696 ::new(static_cast<void*>(&added->item_))T(item);
    \n-
    697 added->next_=beforeHead_.next_;
    \n-
    698 beforeHead_.next_=added;
    \n-
    699 }
    \n-
    700 assert(tail_->next_==0);
    \n-
    701 ++size_;
    \n-
    702 }
    \n-
    \n-
    703
    \n-
    704
    \n-
    705 template<typename T, class A>
    \n-
    706 inline void SLList<T,A>::deleteNext(Element* current)
    \n-
    707 {
    \n-
    708 this->template deleteNext<true>(current);
    \n-
    709 }
    \n-
    710
    \n-
    711 template<typename T, class A>
    \n-
    712 template<bool watchForTail>
    \n-
    713 inline void SLList<T,A>::deleteNext(Element* current)
    \n-
    714 {
    \n-
    715 assert(current->next_);
    \n-
    716 Element* next = current->next_;
    \n-
    717
    \n-
    718 if(watchForTail)
    \n-
    719 if(next == tail_) {
    \n-
    720 // deleting last element changes tail!
    \n-
    721 tail_ = current;
    \n-
    722 }
    \n-
    723
    \n-
    724 current->next_ = next->next_;
    \n-
    725 std::allocator_traits<Allocator>::destroy(allocator_, next);
    \n-
    726 allocator_.deallocate(next, 1);
    \n-
    727 --size_;
    \n-
    728 assert(!watchForTail || &beforeHead_ != tail_ || size_==0);
    \n-
    729 }
    \n-
    730
    \n-
    731 template<typename T, class A>
    \n-
    \n-\n-
    733 {
    \n-
    734 deleteNext(&beforeHead_);
    \n-
    735 }
    \n-
    \n-
    736
    \n-
    737 template<typename T, class A>
    \n-
    \n-
    738 inline void SLList<T,A>::clear()
    \n-
    739 {
    \n-
    740 while(beforeHead_.next_ ) {
    \n-
    741 this->template deleteNext<false>(&beforeHead_);
    \n-
    742 }
    \n-
    743
    \n-
    744 assert(size_==0);
    \n-
    745 // update the tail!
    \n-
    746 tail_ = &beforeHead_;
    \n-
    747 }
    \n-
    \n-
    748
    \n-
    749 template<typename T, class A>
    \n-
    \n-
    750 inline bool SLList<T,A>::empty() const
    \n-
    751 {
    \n-
    752 return (&beforeHead_ == tail_);
    \n-
    753 }
    \n-
    \n-
    754
    \n-
    755 template<typename T, class A>
    \n-
    \n-
    756 inline int SLList<T,A>::size() const
    \n-
    757 {
    \n-
    758 return size_;
    \n-
    759 }
    \n-
    \n-
    760
    \n-
    761 template<typename T, class A>
    \n-
    \n-\n-
    763 {
    \n-
    764 return iterator(beforeHead_.next_, this);
    \n-
    765 }
    \n-
    \n-
    766
    \n-
    767 template<typename T, class A>
    \n-
    \n-\n-
    769 {
    \n-
    770 return const_iterator(beforeHead_.next_);
    \n-
    771 }
    \n-
    \n-
    772
    \n-
    773 template<typename T, class A>
    \n-
    \n-\n-
    775 {
    \n-
    776 return iterator();
    \n-
    777 }
    \n-
    \n-
    778
    \n-
    779 template<typename T, class A>
    \n-
    \n-\n-
    781 {
    \n-
    782 return SLListModifyIterator<T,A>(iterator(tail_, this),iterator());
    \n-
    783 }
    \n-
    \n-
    784
    \n-
    785
    \n-
    786 template<typename T, class A>
    \n-
    \n-\n-
    788 {
    \n-
    789 return SLListModifyIterator<T,A>(iterator(&beforeHead_, this),
    \n-
    790 iterator(beforeHead_.next_, this));
    \n-
    791 }
    \n-
    \n-
    792
    \n-
    793 template<typename T, class A>
    \n-
    \n-\n-
    795 {
    \n-
    796 return const_iterator();
    \n-
    797 }
    \n-
    \n-
    798
    \n-
    800}
    \n-
    801#endif
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    This file implements iterator facade classes for writing stl conformant iterators.
    \n-
    void push_front(const MemberType &item)
    Add a new entry to the beginning of the list.
    Definition sllist.hh:687
    \n-
    bool equals(const SLListConstIterator< T, A > &other) const
    Equality test for the iterator facade.
    Definition sllist.hh:406
    \n-
    void push_back(const MemberType &item)
    Add a new entry to the end of the list.
    Definition sllist.hh:643
    \n-
    ModifyIterator endModify()
    Get an iterator capable of deleting and inserting elements.
    Definition sllist.hh:780
    \n-
    SLListModifyIterator()
    Definition sllist.hh:438
    \n-
    Element()
    Definition sllist.hh:557
    \n-
    T & dereference() const
    Dereferencing function for the iterator facade.
    Definition sllist.hh:294
    \n-
    bool operator!=(const SLList &sl) const
    Definition sllist.hh:623
    \n-
    MemberType item_
    The element we hold.
    Definition sllist.hh:212
    \n-
    SLListConstIterator(typename SLList< T, A >::Element *item)
    Definition sllist.hh:380
    \n-
    typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator
    The allocator to use.
    Definition sllist.hh:64
    \n-
    void insertAfter(const T &v) const
    Insert an element in the underlying list after the current position.
    Definition sllist.hh:342
    \n-
    SLListIterator< T, A > iterator
    The mutable iterator of the list.
    Definition sllist.hh:69
    \n-
    SLListConstIterator(const SLListModifyIterator< T, A > &other)
    Definition sllist.hh:388
    \n-
    SLListIterator()
    Definition sllist.hh:282
    \n-
    ~Element()
    Definition sllist.hh:562
    \n-
    bool operator==(const SLList &sl) const
    Definition sllist.hh:611
    \n-
    void deleteNext() const
    Delete the entry after the current position.
    Definition sllist.hh:353
    \n-
    SLList(const SLList< T, A > &other)
    Copy constructor.
    Definition sllist.hh:577
    \n-
    bool equals(const SLListModifyIterator< T, A > &other) const
    Equality test for the iterator facade.
    Definition sllist.hh:324
    \n-
    T & dereference() const
    Dereferencing function for the iterator facade.
    Definition sllist.hh:446
    \n-
    int size() const
    Get the number of elements the list contains.
    Definition sllist.hh:756
    \n-
    const_iterator begin() const
    Get an iterator pointing to the first element in the list.
    Definition sllist.hh:768
    \n-
    iterator end()
    Get an iterator pointing to the end of the list.
    Definition sllist.hh:774
    \n-
    void clear()
    Remove all elements from the list.
    Definition sllist.hh:738
    \n-
    SLList(const SLList< T1, A1 > &other)
    Copy constructor with type conversion.
    Definition sllist.hh:585
    \n-
    T MemberType
    The type we store.
    Definition sllist.hh:59
    \n-
    bool equals(const SLListModifyIterator< T, A > &other) const
    Test whether another iterator is equal.
    Definition sllist.hh:478
    \n-
    ModifyIterator beginModify()
    Get an iterator capable of deleting and inserting elements.
    Definition sllist.hh:787
    \n-
    SLList< T, A > & operator=(const SLList< T, A > &other)
    Assignment operator.
    Definition sllist.hh:635
    \n-
    SLListConstIterator(const SLListIterator< T, A > &other)
    Definition sllist.hh:384
    \n-
    SLListConstIterator< T, A > const_iterator
    The constant iterator of the list.
    Definition sllist.hh:74
    \n-
    bool empty() const
    Check whether the list is empty.
    Definition sllist.hh:750
    \n-
    SLListConstIterator()
    Definition sllist.hh:376
    \n-
    bool equals(const SLListConstIterator< T, A > &other) const
    Equality test for the iterator facade.
    Definition sllist.hh:304
    \n-
    bool equals(const SLListConstIterator< T, A > &other) const
    Test whether another iterator is equal.
    Definition sllist.hh:456
    \n-
    SLListModifyIterator< T, A > ModifyIterator
    The type of the iterator capable of deletion and insertion.
    Definition sllist.hh:103
    \n-
    const_iterator end() const
    Get an iterator pointing to the end of the list.
    Definition sllist.hh:794
    \n-
    SLList()
    Constructor.
    Definition sllist.hh:568
    \n-
    void insert(const T &v)
    Insert an element at the current position.
    Definition sllist.hh:505
    \n-
    SLListIterator(typename SLList< T, A >::Element *item, SLList< T, A > *sllist)
    Definition sllist.hh:277
    \n-
    SLListModifyIterator(SLListIterator< T, A > beforeIterator, SLListIterator< T, A > _iterator)
    Definition sllist.hh:433
    \n-
    void pop_front()
    Remove the first item in the list.
    Definition sllist.hh:732
    \n-
    void increment()
    Increment function for the iterator facade.
    Definition sllist.hh:332
    \n-
    SLListIterator(const SLListModifyIterator< T, A > &other)
    Definition sllist.hh:286
    \n-
    A::size_type size_type
    The size type.
    Definition sllist.hh:54
    \n-
    void remove()
    Delete the entry at the current position.
    Definition sllist.hh:518
    \n-
    const T & dereference() const
    Dereferencing function for the facade.
    Definition sllist.hh:396
    \n-
    Element * next_
    The next element in the list.
    Definition sllist.hh:208
    \n-
    void increment()
    Increment function for the iterator facade.
    Definition sllist.hh:486
    \n-
    void increment()
    Increment function for the iterator facade.
    Definition sllist.hh:414
    \n-
    ~SLList()
    Destructor.
    Definition sllist.hh:605
    \n-
    bool equals(const SLListIterator< T, A > &other) const
    Test whether another iterator is equal.
    Definition sllist.hh:467
    \n-
    iterator begin()
    Get an iterator pointing to the first element in the list.
    Definition sllist.hh:762
    \n-
    bool equals(const SLListIterator< T, A > &other) const
    Equality test for the iterator facade.
    Definition sllist.hh:314
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n+
    655#endif
    \n+
    Macro for wrapping boundary checks.
    \n+
    Implements a generic iterator class for writing stl conformant iterators.
    \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+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    void assign(T &dst, const T &src, bool mask)
    masked Simd assignment (scalar version)
    Definition simd.hh:447
    \n+
    A dynamic array of blocks of booleans.
    Definition bitsetvector.hh:469
    \n+
    const_reference operator[](int i) const
    Return const reference to i-th block.
    Definition bitsetvector.hh:585
    \n+
    iterator begin()
    Returns a iterator pointing to the beginning of the vector.
    Definition bitsetvector.hh:506
    \n+
    BitSetVectorConstReference< block_size, Allocator > * const_pointer
    Const pointer to a small block of bits.
    Definition bitsetvector.hh:490
    \n+
    const_iterator end() const
    Returns a const_iterator pointing to the end of the vector.
    Definition bitsetvector.hh:521
    \n+
    BitSetVectorReference< block_size, Allocator > reference
    Reference to a small block of bits.
    Definition bitsetvector.hh:481
    \n+
    size_type countmasked(int j) const
    Returns the number of set bits, while each block is masked with 1<<i.
    Definition bitsetvector.hh:609
    \n+
    BitSetVectorConstReference< block_size, Allocator > const_reference
    Const reference to a small block of bits.
    Definition bitsetvector.hh:484
    \n+
    iterator end()
    Returns an iterator pointing to the end of the vector.
    Definition bitsetvector.hh:516
    \n+
    size_type count() const
    Returns the number of bits that are set.
    Definition bitsetvector.hh:603
    \n+
    BitSetVector()
    Default constructor.
    Definition bitsetvector.hh:526
    \n+
    void setAll()
    Sets all entries to true
    Definition bitsetvector.hh:569
    \n+
    Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade > const_iterator
    Definition bitsetvector.hh:502
    \n+
    std::bitset< block_size > value_type
    Type of the values stored by the container.
    Definition bitsetvector.hh:478
    \n+
    reference back()
    Return reference to last block.
    Definition bitsetvector.hh:591
    \n+
    BitSetVector(const BlocklessBaseClass &blocklessBitField)
    Construction from an unblocked bitfield.
    Definition bitsetvector.hh:531
    \n+
    friend std::ostream & operator<<(std::ostream &s, const BitSetVector &v)
    Send bitfield to an output stream.
    Definition bitsetvector.hh:619
    \n+
    const_reference back() const
    Return const reference to last block.
    Definition bitsetvector.hh:597
    \n+
    void clear()
    Erases all of the elements.
    Definition bitsetvector.hh:551
    \n+
    BitSetVectorReference< block_size, Allocator > * pointer
    Pointer to a small block of bits.
    Definition bitsetvector.hh:487
    \n+
    reference operator[](int i)
    Return reference to i-th block.
    Definition bitsetvector.hh:579
    \n+
    size_type size() const
    Return the number of blocks.
    Definition bitsetvector.hh:563
    \n+
    std::vector< bool, Allocator >::size_type size_type
    size type
    Definition bitsetvector.hh:493
    \n+
    BitSetVector(int n, bool v)
    Constructor which initializes the field with true or false.
    Definition bitsetvector.hh:546
    \n+
    const_iterator begin() const
    Returns a const_iterator pointing to the beginning of the vector.
    Definition bitsetvector.hh:511
    \n+
    Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type, reference, std::ptrdiff_t, ForwardIteratorFacade > iterator
    Definition bitsetvector.hh:501
    \n+
    void resize(int n, bool v=bool())
    Resize field.
    Definition bitsetvector.hh:557
    \n+
    Allocator allocator_type
    The type of the allocator.
    Definition bitsetvector.hh:496
    \n+
    BitSetVector(int n)
    Definition bitsetvector.hh:541
    \n+
    void unsetAll()
    Sets all entries to false
    Definition bitsetvector.hh:574
    \n+
    A proxy class that acts as a mutable reference to a single bitset in a BitSetVector.
    Definition bitsetvector.hh:222
    \n+
    bool test(size_type n) const
    Returns true if bit n is set.
    Definition bitsetvector.hh:124
    \n+
    BitSetVectorReference & operator=(const BitSetVectorConstReference &b)
    Assignment from BitSetVectorConstReference.
    Definition bitsetvector.hh:266
    \n+
    reference operator[](size_type i)
    Return reference to the i-th bit.
    Definition bitsetvector.hh:413
    \n+
    BitSetVectorReference & reset(size_type n)
    Clears bit n.
    Definition bitsetvector.hh:396
    \n+
    BitSetVectorReference & operator<<=(size_type n)
    Left shift.
    Definition bitsetvector.hh:350
    \n+
    Dune::BitSetVector< block_size, Alloc > BitSetVector
    Definition bitsetvector.hh:225
    \n+
    std::vector< bool, Alloc >::const_reference const_reference
    A proxy class that acts as a const reference to a single bit.
    Definition bitsetvector.hh:243
    \n+
    BitSetVectorReference & operator=(const BitSetVectorReference &b)
    Assignment from BitSetVectorReference.
    Definition bitsetvector.hh:274
    \n+
    reference getBit(size_type i)
    Definition bitsetvector.hh:423
    \n+
    BitSetVectorReference & operator&=(const BitSetVectorConstReference &x)
    Bitwise and (for BitSetVectorConstReference and BitSetVectorReference)
    Definition bitsetvector.hh:290
    \n+
    BitSetVectorReference(BitSetVector &blockBitField_, int block_number_)
    Definition bitsetvector.hh:230
    \n+
    size_t size_type
    size_type typedef (an unsigned integral type)
    Definition bitsetvector.hh:247
    \n+
    BitSetVectorReference & operator=(const bitset &b)
    Assignment from bitset.
    Definition bitsetvector.hh:258
    \n+
    Dune::BitSetVectorConstReference< block_size, Alloc > BitSetVectorConstReference
    Definition bitsetvector.hh:228
    \n+
    BitSetVectorReference & reset()
    Clears every bit.
    Definition bitsetvector.hh:382
    \n+
    BitSetVector & blockBitField
    Definition bitsetvector.hh:419
    \n+
    BitSetVectorReference & operator|=(const BitSetVectorConstReference &x)
    Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference)
    Definition bitsetvector.hh:306
    \n+
    BitSetVectorReference & set(size_type n, int val=1)
    Sets bit n if val is nonzero, and clears bit n if val is zero.
    Definition bitsetvector.hh:389
    \n+
    std::bitset< block_size > bitset
    Definition bitsetvector.hh:236
    \n+
    BitSetVectorReference & operator^=(const bitset &x)
    Bitwise exclusive or (for bitset).
    Definition bitsetvector.hh:314
    \n+
    std::vector< bool, Alloc >::reference reference
    Definition bitsetvector.hh:241
    \n+
    BitSetVectorReference & operator|=(const bitset &x)
    Bitwise inclusive or (for bitset)
    Definition bitsetvector.hh:298
    \n+
    BitSetVectorReference & operator>>=(size_type n)
    Right shift.
    Definition bitsetvector.hh:358
    \n+
    BitSetVectorReference & operator^=(const BitSetVectorConstReference &x)
    Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference)
    Definition bitsetvector.hh:340
    \n+
    BitSetVectorReference & flip(size_type n)
    Flips bit n.
    Definition bitsetvector.hh:403
    \n+
    BitSetVectorReference & flip()
    Flips the value of every bit.
    Definition bitsetvector.hh:374
    \n+
    BitSetVectorReference & set()
    Sets every bit.
    Definition bitsetvector.hh:366
    \n+
    BitSetVectorReference & operator&=(const bitset &x)
    Bitwise and (for bitset).
    Definition bitsetvector.hh:282
    \n+
    BitSetVectorReference & operator=(bool b)
    Assignment from bool, sets each bit in the bitset to b.
    Definition bitsetvector.hh:250
    \n+
    A proxy class that acts as a const reference to a single bitset in a BitSetVector.
    Definition bitsetvector.hh:38
    \n+
    bool operator==(const bitset &bs) const
    Equality of reference and std::bitset.
    Definition bitsetvector.hh:142
    \n+
    bool test(size_type n) const
    Returns true if bit n is set.
    Definition bitsetvector.hh:124
    \n+
    const_reference operator[](size_type i) const
    Return reference to the i-th bit.
    Definition bitsetvector.hh:130
    \n+
    bitset operator<<(size_type n) const
    Returns a copy of *this shifted left by n bits.
    Definition bitsetvector.hh:64
    \n+
    BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b)
    hide assignment operator
    \n+
    BitSetVectorConstReference(const BitSetVector &blockBitField_, int block_number_)
    Definition bitsetvector.hh:44
    \n+
    const BitSetVector & blockBitField
    Definition bitsetvector.hh:181
    \n+
    bitset operator>>(size_type n) const
    Returns a copy of *this shifted right by n bits.
    Definition bitsetvector.hh:72
    \n+
    const_reference getBit(size_type i) const
    Definition bitsetvector.hh:184
    \n+
    bool operator!=(const bitset &bs) const
    Inequality of reference and std::bitset.
    Definition bitsetvector.hh:154
    \n+
    bool equals(const BS &bs) const
    Definition bitsetvector.hh:190
    \n+
    Dune::BitSetVector< block_size, Alloc > BitSetVector
    Definition bitsetvector.hh:41
    \n+
    std::bitset< block_size > bitset
    Definition bitsetvector.hh:56
    \n+
    bool all() const
    Returns true if all bits are set.
    Definition bitsetvector.hh:115
    \n+
    size_t size_type
    Definition bitsetvector.hh:61
    \n+
    bitset operator~() const
    Returns a copy of *this with all of its bits flipped.
    Definition bitsetvector.hh:80
    \n+
    std::vector< bool, Alloc >::const_reference reference
    Definition bitsetvector.hh:59
    \n+
    size_type size() const
    Returns block_size.
    Definition bitsetvector.hh:88
    \n+
    size_type count() const
    Returns the number of bits that are set.
    Definition bitsetvector.hh:94
    \n+
    bool none() const
    Returns true if no bits are set.
    Definition bitsetvector.hh:109
    \n+
    bool any() const
    Returns true if any bits are set.
    Definition bitsetvector.hh:103
    \n+
    int block_number
    Definition bitsetvector.hh:182
    \n+
    std::vector< bool, Alloc >::const_reference const_reference
    Definition bitsetvector.hh:60
    \n+
    friend std::ostream & operator<<(std::ostream &s, const BitSetVectorConstReference &v)
    Definition bitsetvector.hh:171
    \n+
    BitSetVectorConstReference< block_size, Alloc > type
    Definition bitsetvector.hh:443
    \n+
    BitSetVectorConstReference< block_size, Alloc > type
    Definition bitsetvector.hh:449
    \n+
    BitSetVectorReference< block_size, Alloc > type
    Definition bitsetvector.hh:455
    \n+
    BitSetVectorReference< block_size, Alloc > type
    Definition bitsetvector.hh:461
    \n+
    Default exception class for range errors.
    Definition exceptions.hh:254
    \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+
    Generic class for stl-conforming iterators for container classes with operator[].
    Definition genericiterator.hh:153
    \n
    Base class for stl conformant forward iterators.
    Definition iteratorfacades.hh:141
    \n-
    A mutable iterator for the SLList.
    Definition sllist.hh:271
    \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,798 +1,936 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-sllist.hh\n+bitsetvector.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 (C) 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_SLLIST_HH\n-6#define DUNE_SLLIST_HH\n+5#ifndef DUNE_BLOCK_BITFIELD_HH\n+6#define DUNE_BLOCK_BITFIELD_HH\n 7\n-8#include \n-9#include \n-10#include \"_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh\"\n-11#include \n-12\n-13namespace _\bD_\bu_\bn_\be\n-14{\n-26 template\n-27 class SLListIterator;\n-28\n-29 template\n-30 class SLListConstIterator;\n-31\n-32 template\n-33 class SLListModifyIterator;\n-34\n-42 template >\n-_\b4_\b3 class _\bS_\bL_\bL_\bi_\bs_\bt\n-44 {\n-45 struct Element;\n-46 friend class _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-47 friend class _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-48\n-49 public:\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/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\n+18#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+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\n+21namespace _\bD_\bu_\bn_\be {\n+22\n+23 template class BitSetVector;\n+24 template class BitSetVectorReference;\n+25\n+36 template \n+_\b3_\b7 class _\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\n+38 {\n+39 protected:\n+40\n+_\b4_\b1 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b> _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n+42 friend class _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n+43\n+_\b4_\b4 _\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(const _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br& blockBitField_, int\n+block_number_) :\n+45 _\bb_\bl_\bo_\bc_\bk_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd(blockBitField_),\n+46 _\bb_\bl_\bo_\bc_\bk_\b__\bn_\bu_\bm_\bb_\be_\br(block_number_)\n+47 {\n+48 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(blockBitField_._\bs_\bi_\bz_\be() > static_cast\n+(block_number_));\n+49 }\n 50\n-_\b5_\b4 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b5_\b2 _\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& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\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);\n+53\n+54 public:\n 55\n-_\b5_\b9 typedef T _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n-60\n-_\b6_\b4 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n-rebind_alloc;\n-65\n-_\b6_\b9 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b5_\b6 typedef std::bitset _\bb_\bi_\bt_\bs_\be_\bt;\n+57\n+58 // bitset interface typedefs\n+_\b5_\b9 typedef typename std::vector::const_reference _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b6_\b0 typedef typename std::vector::const_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b6_\b1 typedef size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+62\n+_\b6_\b4 _\bb_\bi_\bt_\bs_\be_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n) const\n+65 {\n+66 _\bb_\bi_\bt_\bs_\be_\bt b = *this;\n+67 b <<= n;\n+68 return b;\n+69 }\n 70\n-_\b7_\b4 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-75\n-_\b7_\b9 _\bS_\bL_\bL_\bi_\bs_\bt();\n-80\n-84 template\n-_\b8_\b5 _\bS_\bL_\bL_\bi_\bs_\bt(const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b1_\b,_\bA_\b1_\b>& other);\n+_\b7_\b2 _\bb_\bi_\bt_\bs_\be_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n) const\n+73 {\n+74 _\bb_\bi_\bt_\bs_\be_\bt b = *this;\n+75 b >>= n;\n+76 return b;\n+77 }\n+78\n+_\b8_\b0 _\bb_\bi_\bt_\bs_\be_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~() const\n+81 {\n+82 _\bb_\bi_\bt_\bs_\be_\bt b = *this;\n+83 b.flip();\n+84 return b;\n+85 }\n 86\n-_\b9_\b0 _\bS_\bL_\bL_\bi_\bs_\bt(const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& other);\n-91\n-_\b9_\b7 _\b~_\bS_\bL_\bL_\bi_\bs_\bt();\n-98\n-_\b1_\b0_\b3 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-104\n-_\b1_\b0_\b8 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& other);\n-109\n-110\n-_\b1_\b1_\b5 inline void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(const _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be& item);\n-116\n-_\b1_\b2_\b1 inline void _\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt(const _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be& item);\n+_\b8_\b8 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n+89 {\n+90 return block_size;\n+91 }\n+92\n+_\b9_\b4 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bu_\bn_\bt() const\n+95 {\n+96 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n = 0;\n+97 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b1_\b9_\b0 bool _\be_\bq_\bu_\ba_\bl_\bs(const BS & bs) const\n+191 {\n+192 bool eq = true;\n+193 for(int i=0; i& other);\n-232\n-240 template\n-241 void deleteNext(Element* current);\n-247 void insertAfter(Element* current, const T& item);\n+198 private:\n+_\b2_\b0_\b3 void operator & () = delete;\n+204\n+205 friend class _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+206 };\n+207\n+220 template \n+_\b2_\b2_\b1 class _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be : public\n+_\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\n+222 {\n+223 protected:\n+224\n+_\b2_\b2_\b5 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b> _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n+226 friend class _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br;\n+227\n+_\b2_\b2_\b8 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b>\n+_\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;\n+229\n+_\b2_\b3_\b0 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be(_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br& blockBitField_, int block_number_) :\n+231 _\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(blockBitField_, block_number_),\n+232 _\bb_\bl_\bo_\bc_\bk_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd(blockBitField_)\n+233 {}\n+234\n+235 public:\n+_\b2_\b3_\b6 typedef std::bitset _\bb_\bi_\bt_\bs_\be_\bt;\n+237\n+_\b2_\b4_\b1 typedef typename std::vector::reference _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b2_\b4_\b3 typedef typename std::vector::const_reference _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+245\n+_\b2_\b4_\b7 typedef size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n 248\n-250 Element beforeHead_;\n-251\n-257 Element* tail_;\n-258\n-260 _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br allocator_;\n-261\n-263 int size_;\n-264 };\n-265\n-269 template\n-_\b2_\b7_\b0 class _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public _\bD_\bu_\bn_\be_\b:_\b:\n-_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be, T, T&, std::size_t>\n-271 {\n-272 friend class _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-273 friend class _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-274 friend class _\bS_\bL_\bL_\bi_\bs_\bt;\n-275\n-276 public:\n-_\b2_\b7_\b7 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt* item,\n-278 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>* sllist)\n-279 : current_(item), list_(sllist)\n-280 {}\n-281\n-_\b2_\b8_\b2 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br()\n-283 : current_(0), list_(0)\n-284 {}\n-285\n-_\b2_\b8_\b6 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other)\n-287 : current_(other.iterator_.current_), list_(other.iterator_.list_)\n-288 {}\n-289\n-_\b2_\b9_\b4 inline T& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n-295 {\n-296 return current_->item_;\n-297 }\n-298\n-_\b3_\b0_\b4 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other) const\n-305 {\n-306 return current_==other.current_;\n-307 }\n-308\n-_\b3_\b1_\b4 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other) const\n+_\b2_\b5_\b0 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(bool b)\n+251 {\n+252 for(int i=0; i& other) const\n-325 {\n-326 return current_==other.iterator_.current_;\n-327 }\n-328\n-_\b3_\b3_\b2 inline void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n-333 {\n-334 current_ = current_->next_;\n-335 }\n+316 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; iinsertAfter(current_, v);\n-346 }\n-347\n-_\b3_\b5_\b3 inline void _\bd_\be_\bl_\be_\bt_\be_\bN_\be_\bx_\bt() const\n-354 {\n-355 assert(list_);\n-356 list_->deleteNext(current_);\n-357 }\n-358\n-359 private:\n-361 typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt* current_;\n-_\b3_\b6_\b3 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>* list_;\n-364 };\n-365\n-369 template\n-_\b3_\b7_\b0 class _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public _\bD_\bu_\bn_\be_\b:_\b:\n-_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be, const T, const T&, std::size_t>\n-371 {\n-372 friend class _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-373 friend class _\bS_\bL_\bL_\bi_\bs_\bt;\n-374\n-375 public:\n-_\b3_\b7_\b6 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br()\n-377 : current_(0)\n-378 {}\n-379\n-_\b3_\b8_\b0 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt* item)\n-381 : current_(item)\n-382 {}\n-383\n-_\b3_\b8_\b4 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other)\n-385 : current_(other.current_)\n-386 {}\n+337 public:\n+338\n+_\b3_\b4_\b0 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=(const _\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& x)\n+341 {\n+342 // This uses the helper from above to hoist the actual XOR computation out\n+of the function for\n+343 // the buggy version of GCC.\n+344 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\b>_\b=(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n)\n+359 {\n+360 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i& other)\n-389 : current_(other.iterator_.current_)\n-390 {}\n-391\n-_\b3_\b9_\b6 inline const T& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n+_\b3_\b8_\b9 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be& _\bs_\be_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n, int val = 1)\n+390 {\n+391 _\bg_\be_\bt_\bB_\bi_\bt(n) = val;\n+392 return *this;\n+393 }\n+394\n+_\b3_\b9_\b6 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be& _\br_\be_\bs_\be_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n)\n 397 {\n-398 return current_->item_;\n-399 }\n-400\n-_\b4_\b0_\b6 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other) const\n-407 {\n-408 return current_==other.current_;\n-409 }\n-410\n-_\b4_\b1_\b4 inline void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n-415 {\n-416 current_ = current_->next_;\n-417 }\n-418\n-419 private:\n-_\b4_\b2_\b1 typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt* current_;\n-422 };\n-423\n-427 template\n-_\b4_\b2_\b8 class _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public _\bD_\bu_\bn_\be_\b:_\b:\n-_\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be, T, T&, std::size_t>\n-429 {\n-430 friend class _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-431 friend class _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-432 public:\n-_\b4_\b3_\b3 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> beforeIterator,\n-434 _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _iterator)\n-435 : beforeIterator_(beforeIterator), iterator_(_iterator)\n-436 {}\n-437\n-_\b4_\b3_\b8 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br()\n-439 : beforeIterator_(), iterator_()\n-440 {}\n-441\n-_\b4_\b4_\b6 inline T& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n-447 {\n-448 return *iterator_;\n-449 }\n-450\n-_\b4_\b5_\b6 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other) const\n-457 {\n-458 return iterator_== other;\n-459 }\n-460\n-461\n-_\b4_\b6_\b7 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other) const\n-468 {\n-469 return iterator_== other;\n-470 }\n-471\n+398 _\bs_\be_\bt(n, false);\n+399 return *this;\n+400 }\n+401\n+_\b4_\b0_\b3 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be& _\bf_\bl_\bi_\bp(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n)\n+404 {\n+405 _\bg_\be_\bt_\bB_\bi_\bt(n)._\bf_\bl_\bi_\bp();\n+406 return *this;\n+407 }\n+408\n+409 using _\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:_\bt_\be_\bs_\bt;\n+410 using BitSetVectorConstReference::operator[];\n+411\n+_\b4_\b1_\b3 _\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)\n+414 {\n+415 return _\bg_\be_\bt_\bB_\bi_\bt(i);\n+416 }\n+417\n+418 protected:\n+_\b4_\b1_\b9 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br& _\bb_\bl_\bo_\bc_\bk_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd;\n+420\n+421 using _\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:_\bg_\be_\bt_\bB_\bi_\bt;\n+422\n+_\b4_\b2_\b3 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bg_\be_\bt_\bB_\bi_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+424 {\n+425 return _\bb_\bl_\bo_\bc_\bk_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd.getBit(this->_\bb_\bl_\bo_\bc_\bk_\b__\bn_\bu_\bm_\bb_\be_\br,i);\n+426 }\n+427 };\n+428\n+429 // implementation of helper - I put it into the template to avoid having\n+430 // to compile it in a dedicated compilation unit\n+431 template\n+432 bool BitSetVectorReference::xor_helper(bool a, bool b)\n+433 {\n+434 return a ^ b;\n+435 }\n+436\n+440 template\n+_\b4_\b4_\b1 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be >\n+442 {\n+_\b4_\b4_\b3 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n+444 };\n+445\n+446 template\n+_\b4_\b4_\b7 struct _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\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 >\n+448 {\n+_\b4_\b4_\b9 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n+450 };\n+451\n+452 template\n+_\b4_\b5_\b3 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be >\n+454 {\n+_\b4_\b5_\b5 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n+456 };\n+457\n+458 template\n+_\b4_\b5_\b9 struct _\bm_\bu_\bt_\ba_\bb_\bl_\be_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be< _\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 >\n+460 {\n+_\b4_\b6_\b1 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\b> _\bt_\by_\bp_\be;\n+462 };\n+463\n+467 template >\n+_\b4_\b6_\b8 class _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br : private std::vector\n+469 {\n+471 typedef std::vector BlocklessBaseClass;\n 472\n-_\b4_\b7_\b8 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& other) const\n-479 {\n-480 return iterator_== other.iterator_;\n-481 }\n+473 public:\n+476\n+_\b4_\b7_\b8 typedef std::bitset _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+479\n+_\b4_\b8_\b1 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n 482\n-_\b4_\b8_\b6 inline void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n-487 {\n-488 ++iterator_;\n-489 ++beforeIterator_;\n-490 }\n+_\b4_\b8_\b4 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b> _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+485\n+_\b4_\b8_\b7 typedef _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>* _\bp_\bo_\bi_\bn_\bt_\be_\br;\n+488\n+_\b4_\b9_\b0 typedef _\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<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>* _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n 491\n-_\b5_\b0_\b5 inline void _\bi_\bn_\bs_\be_\br_\bt(const T& v)\n-506 {\n-507 beforeIterator_.insertAfter(v);\n-508 ++beforeIterator_;\n-509 }\n-510\n-_\b5_\b1_\b8 inline void _\br_\be_\bm_\bo_\bv_\be()\n-519 {\n-520 ++iterator_;\n-521 beforeIterator_.deleteNext();\n-522 }\n-523\n-524 private:\n-526 _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> beforeIterator_;\n-528 _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> iterator_;\n-529 };\n-530\n-531 template\n-_\b5_\b3_\b2 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& sllist)\n+_\b4_\b9_\b3 typedef typename std::vector::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+494\n+_\b4_\b9_\b6 typedef Allocator _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n+498\n+_\b5_\b0_\b1 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>,\n+_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be, _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be, std::ptrdiff_t, _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b5_\b0_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\bi_\bc_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>,\n+const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be, _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be, std::ptrdiff_t, _\bF_\bo_\br_\bw_\ba_\br_\bd_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bF_\ba_\bc_\ba_\bd_\be>\n+_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+504\n+_\b5_\b0_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(){\n+507 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0);\n+508 }\n+509\n+_\b5_\b1_\b1 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const {\n+512 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0);\n+513 }\n+514\n+_\b5_\b1_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(){\n+517 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, _\bs_\bi_\bz_\be());\n+518 }\n+519\n+_\b5_\b2_\b1 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const {\n+522 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(*this, _\bs_\bi_\bz_\be());\n+523 }\n+524\n+_\b5_\b2_\b6 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br() :\n+527 BlocklessBaseClass()\n+528 {}\n+529\n+_\b5_\b3_\b1 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br(const BlocklessBaseClass& blocklessBitField) :\n+532 BlocklessBaseClass(blocklessBitField)\n 533 {\n-534 typedef typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-535 Iterator end = sllist._\be_\bn_\bd();\n-536 Iterator current= sllist._\bb_\be_\bg_\bi_\bn();\n+534 if (blocklessBitField.size()%block_size != 0)\n+535 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br, \"Vector size is not a multiple of the block size!\");\n+536 }\n 537\n-538 os << \"{ \";\n-539\n-540 if(current!=end) {\n-541 os<<*current<<\" (\"<(&(*current))<<\")\";\n-542 ++current;\n-543\n-544 for(; current != end; ++current)\n-545 os<<\", \"<<*current<<\" (\"<(&(*current))<<\")\";\n-546 }\n-547 os<<\"} \";\n-548 return os;\n-549 }\n-550\n-551 template\n-_\b5_\b5_\b2 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt(const _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be& item, Element* next)\n-553 : next_(next), item_(item)\n-554 {}\n+_\b5_\b4_\b1 explicit _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br(int n) :\n+542 BlocklessBaseClass(n*block_size)\n+543 {}\n+544\n+_\b5_\b4_\b6 _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br(int n, bool v) :\n+547 BlocklessBaseClass(n*block_size,v)\n+548 {}\n+549\n+_\b5_\b5_\b1 void _\bc_\bl_\be_\ba_\br()\n+552 {\n+553 BlocklessBaseClass::clear();\n+554 }\n 555\n-556 template\n-_\b5_\b5_\b7 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt()\n-558 : next_(0), item_()\n-559 {}\n-560\n-561 template\n-_\b5_\b6_\b2 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\b~_\bE_\bl_\be_\bm_\be_\bn_\bt()\n-563 {\n-564 next_=0;\n-565 }\n-566\n-567 template\n-_\b5_\b6_\b8 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt()\n-569 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)\n-570 {\n-571 beforeHead_.next_=0;\n-572 assert(&beforeHead_==tail_);\n-573 assert(tail_->next_==0);\n-574 }\n-575\n-576 template\n-_\b5_\b7_\b7 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt(const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& other)\n-578 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)\n-579 {\n-580 copyElements(other);\n-581 }\n-582\n-583 template\n-584 template\n-_\b5_\b8_\b5 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt(const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b1_\b,_\bA_\b1_\b>& other)\n-586 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)\n-587 {\n-588 copyElements(other);\n-589 }\n-590\n-591 template\n-592 void _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bp_\by_\bE_\bl_\be_\bm_\be_\bn_\bt_\bs(const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& other)\n-593 {\n-594 assert(tail_==&beforeHead_);\n-595 assert(size_==0);\n-596 typedef typename _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-597 Iterator iend = other._\be_\bn_\bd();\n-598 for(Iterator element=other._\bb_\be_\bg_\bi_\bn(); element != iend; ++element)\n-599 push_back(*element);\n-600\n-601 assert(other._\bs_\bi_\bz_\be()==size());\n-602 }\n-603\n-604 template\n-_\b6_\b0_\b5 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\b~_\bS_\bL_\bL_\bi_\bs_\bt()\n-606 {\n-607 clear();\n-608 }\n-609\n-610 template\n-_\b6_\b1_\b1 bool _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bS_\bL_\bL_\bi_\bs_\bt& other) const\n-612 {\n-613 if(size()!=other._\bs_\bi_\bz_\be())\n-614 return false;\n-615 for(_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br iter=begin(), oiter=other._\bb_\be_\bg_\bi_\bn();\n-616 iter != end(); ++iter, ++oiter)\n-617 if(*iter!=*oiter)\n-618 return false;\n-619 return true;\n-620 }\n-621\n-622 template\n-_\b6_\b2_\b3 bool _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bS_\bL_\bL_\bi_\bs_\bt& other) const\n-624 {\n-625 if(size()==other._\bs_\bi_\bz_\be()) {\n-626 for(_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br iter=begin(), oiter=other._\bb_\be_\bg_\bi_\bn();\n-627 iter != end(); ++iter, ++oiter)\n-628 if(*iter!=*oiter)\n-629 return true;\n-630 return false;\n-631 }else\n-632 return true;\n-633 }\n-634 template\n-_\b6_\b3_\b5 _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>& other)\n-636 {\n-637 clear();\n-638 copyElements(other);\n-639 return *this;\n-640 }\n-641\n-642 template\n-_\b6_\b4_\b3 inline void _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(const _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be& item)\n-644 {\n-645 assert(size_>0 || tail_==&beforeHead_);\n-646 tail_->next_ = allocator_.allocate(1);\n-647 assert(size_>0 || tail_==&beforeHead_);\n-648 tail_ = tail_->next_;\n-649 ::new (static_cast(&(tail_->item_)))T(item);\n-650 tail_->next_=0;\n-651 assert(tail_->next_==0);\n-652 ++size_;\n-653 }\n+_\b5_\b5_\b7 void _\br_\be_\bs_\bi_\bz_\be(int n, bool v = bool())\n+558 {\n+559 BlocklessBaseClass::resize(n*block_size, v);\n+560 }\n+561\n+_\b5_\b6_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n+564 {\n+565 return BlocklessBaseClass::size()/block_size;\n+566 }\n+567\n+_\b5_\b6_\b9 void _\bs_\be_\bt_\bA_\bl_\bl() {\n+570 this->_\ba_\bs_\bs_\bi_\bg_\bn(BlocklessBaseClass::size(), true);\n+571 }\n+572\n+_\b5_\b7_\b4 void _\bu_\bn_\bs_\be_\bt_\bA_\bl_\bl() {\n+575 this->_\ba_\bs_\bs_\bi_\bg_\bn(BlocklessBaseClass::size(), false);\n+576 }\n+577\n+_\b5_\b7_\b9 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](int i)\n+580 {\n+581 return _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, i);\n+582 }\n+583\n+_\b5_\b8_\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](int i) const\n+586 {\n+587 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, i);\n+588 }\n+589\n+_\b5_\b9_\b1 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk()\n+592 {\n+593 return _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, _\bs_\bi_\bz_\be()-1);\n+594 }\n+595\n+_\b5_\b9_\b7 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bb_\ba_\bc_\bk() const\n+598 {\n+599 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(*this, _\bs_\bi_\bz_\be()-1);\n+600 }\n+601\n+_\b6_\b0_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bu_\bn_\bt() const\n+604 {\n+605 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(),\n+true);\n+606 }\n+607\n+_\b6_\b0_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bu_\bn_\bt_\bm_\ba_\bs_\bk_\be_\bd(int j) const\n+610 {\n+611 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n = 0;\n+612 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be blocks = _\bs_\bi_\bz_\be();\n+613 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i::reference getBit(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j) {\n+638 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(j < block_size);\n+639 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _\bs_\bi_\bz_\be());\n+640 return BlocklessBaseClass::operator[](i*block_size+j);\n+641 }\n+642\n+_\b6_\b4_\b3 typename std::vector::const_reference getBit(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+j) const {\n+644 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(j < block_size);\n+645 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < _\bs_\bi_\bz_\be());\n+646 return BlocklessBaseClass::operator[](i*block_size+j);\n+647 }\n+648\n+649 friend class _\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+650 friend class _\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;\n+651 };\n+652\n+653} // namespace Dune\n 654\n-655 template\n-656 inline void _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\bA_\bf_\bt_\be_\br(Element* current, const T& item)\n-657 {\n-658 assert(current);\n-659\n-660#ifndef NDEBUG\n-661 bool changeTail = (current == tail_);\n-662#endif\n-663\n-664 // Save old next element\n-665 Element* tmp = current->next_;\n-666\n-667 assert(!changeTail || !tmp);\n-668\n-669 // Allocate space\n-670 current->next_ = allocator_.allocate(1);\n-671\n-672 // Use copy constructor to initialize memory\n-673 std::allocator_traits::construct(allocator_, current->next_,\n-Element(item,tmp));\n-674\n-675 //::new(static_cast(&(current->next_->item_))) T(item);\n-676\n-677 if(!current->next_->next_) {\n-678 // Update tail\n-679 assert(changeTail);\n-680 tail_ = current->next_;\n-681 }\n-682 ++size_;\n-683 assert(!tail_->next_);\n-684 }\n-685\n-686 template\n-_\b6_\b8_\b7 inline void _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt(const _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be& item)\n-688 {\n-689 if(tail_ == &beforeHead_) {\n-690 // list was empty\n-691 beforeHead_.next_ = tail_ = allocator_.allocate(1, 0);\n-692 ::new(static_cast(&beforeHead_.next_->item_))T(item);\n-693 beforeHead_.next_->next_=0;\n-694 }else{\n-695 Element* added = allocator_.allocate(1, 0);\n-696 ::new(static_cast(&added->item_))T(item);\n-697 added->next_=beforeHead_.next_;\n-698 beforeHead_.next_=added;\n-699 }\n-700 assert(tail_->next_==0);\n-701 ++size_;\n-702 }\n-703\n-704\n-705 template\n-706 inline void _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bd_\be_\bl_\be_\bt_\be_\bN_\be_\bx_\bt(Element* current)\n-707 {\n-708 this->template deleteNext(current);\n-709 }\n-710\n-711 template\n-712 template\n-713 inline void SLList::deleteNext(Element* current)\n-714 {\n-715 assert(current->next_);\n-716 Element* next = current->next_;\n-717\n-718 if(watchForTail)\n-719 if(next == tail_) {\n-720 // deleting last element changes tail!\n-721 tail_ = current;\n-722 }\n-723\n-724 current->next_ = next->next_;\n-725 std::allocator_traits::destroy(allocator_, next);\n-726 allocator_.deallocate(next, 1);\n-727 --size_;\n-728 assert(!watchForTail || &beforeHead_ != tail_ || size_==0);\n-729 }\n-730\n-731 template\n-_\b7_\b3_\b2 inline void _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt()\n-733 {\n-734 deleteNext(&beforeHead_);\n-735 }\n-736\n-737 template\n-_\b7_\b3_\b8 inline void _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bl_\be_\ba_\br()\n-739 {\n-740 while(beforeHead_.next_ ) {\n-741 this->template deleteNext(&beforeHead_);\n-742 }\n-743\n-744 assert(size_==0);\n-745 // update the tail!\n-746 tail_ = &beforeHead_;\n-747 }\n-748\n-749 template\n-_\b7_\b5_\b0 inline bool _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bm_\bp_\bt_\by() const\n-751 {\n-752 return (&beforeHead_ == tail_);\n-753 }\n-754\n-755 template\n-_\b7_\b5_\b6 inline int _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bs_\bi_\bz_\be() const\n-757 {\n-758 return size_;\n-759 }\n-760\n-761 template\n-_\b7_\b6_\b2 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n-763 {\n-764 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(beforeHead_.next_, this);\n-765 }\n-766\n-767 template\n-_\b7_\b6_\b8 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-769 {\n-770 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(beforeHead_.next_);\n-771 }\n-772\n-773 template\n-_\b7_\b7_\b4 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd()\n-775 {\n-776 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br();\n-777 }\n-778\n-779 template\n-_\b7_\b8_\b0 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bM_\bo_\bd_\bi_\bf_\by()\n-781 {\n-782 return _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>(_\bi_\bt_\be_\br_\ba_\bt_\bo_\br(tail_, this),_\bi_\bt_\be_\br_\ba_\bt_\bo_\br());\n-783 }\n-784\n-785\n-786 template\n-_\b7_\b8_\b7 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bM_\bo_\bd_\bi_\bf_\by()\n-788 {\n-789 return _\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>(_\bi_\bt_\be_\br_\ba_\bt_\bo_\br(&beforeHead_, this),\n-790 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(beforeHead_.next_, this));\n-791 }\n-792\n-793 template\n-_\b7_\b9_\b4 inline _\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd() const\n-795 {\n-796 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br();\n-797 }\n-798\n-800}\n-801#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-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bf_\br_\bo_\bn_\bt\n-void push_front(const MemberType &item)\n-Add a new entry to the beginning of the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:687\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_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const SLListConstIterator< T, A > &other) const\n-Equality test for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:406\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:_\be_\bn_\bd_\bM_\bo_\bd_\bi_\bf_\by\n-ModifyIterator endModify()\n-Get an iterator capable of deleting and inserting elements.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:780\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_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListModifyIterator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:438\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt\n-Element()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:557\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-T & dereference() const\n-Dereferencing function for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:294\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const SLList &sl) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:623\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bi_\bt_\be_\bm_\b_\n-MemberType item_\n-The element we hold.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:212\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_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListConstIterator(typename SLList< T, A >::Element *item)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:380\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator\n-The allocator to use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt_\bA_\bf_\bt_\be_\br\n-void insertAfter(const T &v) const\n-Insert an element in the underlying list after the current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:342\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_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListConstIterator(const SLListModifyIterator< T, A > &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:388\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListIterator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\b~_\bE_\bl_\be_\bm_\be_\bn_\bt\n-~Element()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:562\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const SLList &sl) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:611\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bl_\be_\bt_\be_\bN_\be_\bx_\bt\n-void deleteNext() const\n-Delete the entry after the current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:353\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt\n-SLList(const SLList< T, A > &other)\n-Copy constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const SLListModifyIterator< T, A > &other) const\n-Equality test for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:324\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_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-T & dereference() const\n-Dereferencing function for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:446\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bs_\bi_\bz_\be\n-int size() const\n-Get the number of elements the list contains.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:756\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\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:768\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:_\bc_\bl_\be_\ba_\br\n-void clear()\n-Remove all elements from the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:738\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt\n-SLList(const SLList< T1, A1 > &other)\n-Copy constructor with type conversion.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:585\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n-T MemberType\n-The type we store.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:59\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_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const SLListModifyIterator< T, A > &other) const\n-Test whether another iterator is equal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:478\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-SLList< T, A > & operator=(const SLList< T, A > &other)\n-Assignment operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:635\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_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListConstIterator(const SLListIterator< T, A > &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:384\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListConstIterator< T, A > 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:_\be_\bm_\bp_\bt_\by\n-bool empty() const\n-Check whether the list is empty.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:750\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_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListConstIterator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:376\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const SLListConstIterator< T, A > &other) const\n-Equality test for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:304\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_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const SLListConstIterator< T, A > &other) const\n-Test whether another iterator is equal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:456\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:_\be_\bn_\bd\n-const_iterator end() const\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:794\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt\n-SLList()\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:568\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_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-void insert(const T &v)\n-Insert an element at the current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:505\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListIterator(typename SLList< T, A >::Element *item, SLList< T, A > *sllist)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:277\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_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bM_\bo_\bd_\bi_\bf_\by_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListModifyIterator(SLListIterator< T, A > beforeIterator, SLListIterator< T,\n-A > _iterator)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:433\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bo_\bp_\b__\bf_\br_\bo_\bn_\bt\n-void pop_front()\n-Remove the first item in the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:732\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-Increment function for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:332\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-SLListIterator(const SLListModifyIterator< T, A > &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:286\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The size type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:54\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_\b:_\b:_\br_\be_\bm_\bo_\bv_\be\n-void remove()\n-Delete the entry at the current position.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:518\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_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const T & dereference() const\n-Dereferencing function for the facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:396\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\bE_\bl_\be_\bm_\be_\bn_\bt_\b:_\b:_\bn_\be_\bx_\bt_\b_\n-Element * next_\n-The next element in the list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:208\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_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-Increment function for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:486\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_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-Increment function for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:414\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\b:_\b:_\b~_\bS_\bL_\bL_\bi_\bs_\bt\n-~SLList()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:605\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_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const SLListIterator< T, A > &other) const\n-Test whether another iterator is equal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:467\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:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const SLListIterator< T, A > &other) const\n-Equality test for the iterator facade.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn sllist.hh:314\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+655#endif\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+_\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__\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:_\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:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n+A dynamic array of blocks of booleans.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:469\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const_reference operator[](int i) const\n+Return const reference to i-th block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:585\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+Returns a iterator pointing to the beginning of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n+BitSetVectorConstReference< block_size, Allocator > * const_pointer\n+Const pointer to a small block of bits.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:490\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+Returns a const_iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:521\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+BitSetVectorReference< block_size, Allocator > reference\n+Reference to a small block of bits.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:481\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bm_\ba_\bs_\bk_\be_\bd\n+size_type countmasked(int j) const\n+Returns the number of set bits, while each block is masked with 1< const_reference\n+Const reference to a small block of bits.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:484\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+iterator end()\n+Returns an iterator pointing to the end of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:516\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bu_\bn_\bt\n+size_type count() const\n+Returns the number of bits that are set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:603\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n+BitSetVector()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\be_\bt_\bA_\bl_\bl\n+void setAll()\n+Sets all entries to true\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:569\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const\n+value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade >\n+const_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:502\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+std::bitset< block_size > value_type\n+Type of the values stored by the container.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:478\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n+reference back()\n+Return reference to last block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:591\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n+BitSetVector(const BlocklessBaseClass &blocklessBitField)\n+Construction from an unblocked bitfield.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:531\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\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 BitSetVector &v)\n+Send bitfield to an output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:619\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\ba_\bc_\bk\n+const_reference back() const\n+Return const reference to last block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:597\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bl_\be_\ba_\br\n+void clear()\n+Erases all of the elements.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:551\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+BitSetVectorReference< block_size, Allocator > * pointer\n+Pointer to a small block of bits.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:487\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+reference operator[](int i)\n+Return reference to i-th block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:579\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+size_type size() const\n+Return the number of blocks.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::vector< bool, Allocator >::size_type size_type\n+size type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:493\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n+BitSetVector(int n, bool v)\n+Constructor which initializes the field with true or false.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:546\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+Returns a const_iterator pointing to the beginning of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:511\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type,\n+reference, std::ptrdiff_t, ForwardIteratorFacade > iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:501\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(int n, bool v=bool())\n+Resize field.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:557\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+Allocator allocator_type\n+The type of the allocator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n+BitSetVector(int n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:541\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bu_\bn_\bs_\be_\bt_\bA_\bl_\bl\n+void unsetAll()\n+Sets all entries to false\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:574\n+_\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\n+A proxy class that acts as a mutable reference to a single bitset in a\n+BitSetVector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:222\n+_\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:_\bt_\be_\bs_\bt\n+bool test(size_type n) const\n+Returns true if bit n is set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:124\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BitSetVectorReference & operator=(const BitSetVectorConstReference &b)\n+Assignment from BitSetVectorConstReference.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:266\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+reference operator[](size_type i)\n+Return reference to the i-th bit.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:413\n+_\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:_\br_\be_\bs_\be_\bt\n+BitSetVectorReference & reset(size_type n)\n+Clears bit n.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:396\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b=\n+BitSetVectorReference & operator<<=(size_type n)\n+Left shift.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:350\n+_\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_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n+Dune::BitSetVector< block_size, Alloc > BitSetVector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:225\n+_\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:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+std::vector< bool, Alloc >::const_reference const_reference\n+A proxy class that acts as a const reference to a single bit.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:243\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BitSetVectorReference & operator=(const BitSetVectorReference &b)\n+Assignment from BitSetVectorReference.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:274\n+_\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:_\bg_\be_\bt_\bB_\bi_\bt\n+reference getBit(size_type i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:423\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=\n+BitSetVectorReference & operator&=(const BitSetVectorConstReference &x)\n+Bitwise and (for BitSetVectorConstReference and BitSetVectorReference)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:290\n+_\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_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+BitSetVectorReference(BitSetVector &blockBitField_, int block_number_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:230\n+_\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:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+size_t size_type\n+size_type typedef (an unsigned integral type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:247\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BitSetVectorReference & operator=(const bitset &b)\n+Assignment from bitset.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:258\n+_\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_\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\n+Dune::BitSetVectorConstReference< block_size, Alloc >\n+BitSetVectorConstReference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:228\n+_\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:_\br_\be_\bs_\be_\bt\n+BitSetVectorReference & reset()\n+Clears every bit.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:382\n+_\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_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd\n+BitSetVector & blockBitField\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:419\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=\n+BitSetVectorReference & operator|=(const BitSetVectorConstReference &x)\n+Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:306\n+_\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:_\bs_\be_\bt\n+BitSetVectorReference & set(size_type n, int val=1)\n+Sets bit n if val is nonzero, and clears bit n if val is zero.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:389\n+_\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_\bi_\bt_\bs_\be_\bt\n+std::bitset< block_size > bitset\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:236\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=\n+BitSetVectorReference & operator^=(const bitset &x)\n+Bitwise exclusive or (for bitset).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:314\n+_\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:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+std::vector< bool, Alloc >::reference reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:241\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=\n+BitSetVectorReference & operator|=(const bitset &x)\n+Bitwise inclusive or (for bitset)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:298\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>_\b=\n+BitSetVectorReference & operator>>=(size_type n)\n+Right shift.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:358\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=\n+BitSetVectorReference & operator^=(const BitSetVectorConstReference &x)\n+Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:340\n+_\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:_\bf_\bl_\bi_\bp\n+BitSetVectorReference & flip(size_type n)\n+Flips bit n.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:403\n+_\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:_\bf_\bl_\bi_\bp\n+BitSetVectorReference & flip()\n+Flips the value of every bit.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:374\n+_\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:_\bs_\be_\bt\n+BitSetVectorReference & set()\n+Sets every bit.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:366\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=\n+BitSetVectorReference & operator&=(const bitset &x)\n+Bitwise and (for bitset).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:282\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BitSetVectorReference & operator=(bool b)\n+Assignment from bool, sets each bit in the bitset to b.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:250\n+_\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\n+A proxy class that acts as a const reference to a single bitset in a\n+BitSetVector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:38\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const bitset &bs) const\n+Equality of reference and std::bitset.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:142\n+_\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:_\bt_\be_\bs_\bt\n+bool test(size_type n) const\n+Returns true if bit n is set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:124\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const_reference operator[](size_type i) const\n+Return reference to the i-th bit.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:130\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+bitset operator<<(size_type n) const\n+Returns a copy of *this shifted left by n bits.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:64\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b)\n+hide assignment operator\n+_\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_\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\n+BitSetVectorConstReference(const BitSetVector &blockBitField_, int\n+block_number_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:44\n+_\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_\bB_\bi_\bt_\bF_\bi_\be_\bl_\bd\n+const BitSetVector & blockBitField\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:181\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+bitset operator>>(size_type n) const\n+Returns a copy of *this shifted right by n bits.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:72\n+_\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:_\bg_\be_\bt_\bB_\bi_\bt\n+const_reference getBit(size_type i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:184\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const bitset &bs) const\n+Inequality of reference and std::bitset.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:154\n+_\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:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const BS &bs) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:190\n+_\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_\bi_\bt_\bS_\be_\bt_\bV_\be_\bc_\bt_\bo_\br\n+Dune::BitSetVector< block_size, Alloc > BitSetVector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:41\n+_\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_\bi_\bt_\bs_\be_\bt\n+std::bitset< block_size > bitset\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:56\n+_\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:_\ba_\bl_\bl\n+bool all() const\n+Returns true if all bits are set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:115\n+_\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:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+size_t size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:61\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~\n+bitset operator~() const\n+Returns a copy of *this with all of its bits flipped.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:80\n+_\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:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+std::vector< bool, Alloc >::const_reference reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:59\n+_\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:_\bs_\bi_\bz_\be\n+size_type size() const\n+Returns block_size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:88\n+_\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:_\bc_\bo_\bu_\bn_\bt\n+size_type count() const\n+Returns the number of bits that are set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:94\n+_\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:_\bn_\bo_\bn_\be\n+bool none() const\n+Returns true if no bits are set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:109\n+_\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:_\ba_\bn_\by\n+bool any() const\n+Returns true if any bits are set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:103\n+_\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__\bn_\bu_\bm_\bb_\be_\br\n+int block_number\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:182\n+_\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:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+std::vector< bool, Alloc >::const_reference const_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:60\n+_\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:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend std::ostream & operator<<(std::ostream &s, const\n+BitSetVectorConstReference &v)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:171\n+_\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>_\b:_\b:_\bt_\by_\bp_\be\n+BitSetVectorConstReference< block_size, Alloc > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:443\n+_\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>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+BitSetVectorConstReference< block_size, Alloc > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:449\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 _\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>_\b:_\b:_\bt_\by_\bp_\be\n+BitSetVectorReference< block_size, Alloc > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:455\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 _\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>_\b _\b>_\b:_\b:\n+_\bt_\by_\bp_\be\n+BitSetVectorReference< block_size, Alloc > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bitsetvector.hh:461\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:_\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:_\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:_\bF_\bo_\br_\bw_\ba_\br_\bd_\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:141\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_\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/a00284.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00284.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: keywords.hh File Reference\n+dune-common: fmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -70,63 +70,106 @@\n \n
    \n
    \n
    \n-Macros
    \n-
    keywords.hh File Reference
    \n+Classes |\n+Namespaces |\n+Functions
    \n+ \n \n
    \n \n-

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

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

    \n-\n+
    #include <cmath>
    \n+#include <cstddef>
    \n+#include <iostream>
    \n+#include <algorithm>
    \n+#include <initializer_list>
    \n+#include <dune/common/boundschecking.hh>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/densematrix.hh>
    \n+#include <dune/common/precision.hh>
    \n+#include <dune/common/promotiontraits.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/matrixconcepts.hh>
    \n+#include "fmatrixev.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-Macros

    #define DUNE_INLINE_VARIABLE   inline
     
    #define DUNE_GENERALIZED_CONSTEXPR   constexpr
     

    \n+Classes

    struct  Dune::DenseMatVecTraits< FieldMatrix< K, ROWS, COLS > >
     
    struct  Dune::FieldTraits< FieldMatrix< K, ROWS, COLS > >
     
    class  Dune::FieldMatrix< K, ROWS, COLS >
     A dense n x m matrix. 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+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
     invert scalar without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
     invert scalar without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
     invert 2x2 Matrix without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
     invert 3x3 Matrix without changing the original matrix
     
    template<typename K >
    static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
     invert 3x3 Matrix without changing the original matrix
     
    template<class K , int m, int n, int p>
    static void Dune::FMatrixHelp::multMatrix (const FieldMatrix< K, m, n > &A, const FieldMatrix< K, n, p > &B, FieldMatrix< K, m, p > &ret)
     calculates ret = A * B
     
    template<typename K , int rows, int cols>
    static void Dune::FMatrixHelp::multTransposedMatrix (const FieldMatrix< K, rows, cols > &matrix, FieldMatrix< K, cols, cols > &ret)
     calculates ret= A_t*A
     
    template<typename K , int rows, int cols>
    static void Dune::FMatrixHelp::multAssignTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)
     calculates ret = matrix^T * x
     
    template<typename K , int rows, int cols>
    static FieldVector< K, rows > Dune::FMatrixHelp::mult (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, cols > &x)
     calculates ret = matrix * x
     
    template<typename K , int rows, int cols>
    static FieldVector< K, cols > Dune::FMatrixHelp::multTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x)
     calculates ret = matrix^T * x
     
    \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-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_GENERALIZED_CONSTEXPR

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_GENERALIZED_CONSTEXPR   constexpr
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_INLINE_VARIABLE

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_INLINE_VARIABLE   inline
    \n-
    \n-\n-
    \n-
    \n-
    \n+

    Implements a matrix constructed from a given type representing a field and 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,29 +1,117 @@\n dune-common\u00a02.9.0\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 | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+fmatrix.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\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 <_\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/_\bf_\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/_\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/_\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+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b._\bh_\bh>\n+#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\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__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE\u00a0\u00a0\u00a0inline\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\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\u00a0\u00a0\u00a0constexpr\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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:_\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+template\n+ static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 > &matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n+ 1, 1 > &inverse)\n+\u00a0 invert scalar without changing the original\n+ matrix\n+\u00a0\n+template\n+ static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+ (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 > &matrix,\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 > &inverse)\n+\u00a0 invert scalar without changing the original\n+ matrix\n+\u00a0\n+template\n+ static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 2, 2 > &matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n+ 2, 2 > &inverse)\n+\u00a0 invert 2x2 Matrix without changing the original\n+ matrix\n+\u00a0\n+template\n+ static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+ (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 2, 2 > &matrix,\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 2, 2 > &inverse)\n+\u00a0\n+template\n+ static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 3, 3 > &matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n+ 3, 3 > &inverse)\n+\u00a0 invert 3x3 Matrix without changing the original\n+ matrix\n+\u00a0\n+template\n+ static K\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+ (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 3, 3 > &matrix,\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 3, 3 > &inverse)\n+\u00a0 invert 3x3 Matrix without changing the original\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:_\bm_\bu_\bl_\bt_\bM_\ba_\bt_\br_\bi_\bx (const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &A, const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n+ n, p > &B, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, p > &ret)\n+\u00a0 calculates ret = A * B\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:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\br_\bi_\bx (const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, rows, cols > &matrix,\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, cols, cols > &ret)\n+\u00a0 calculates ret= A_t*A\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:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, rows, cols > &matrix, const\n+ _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, rows > &x, _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, cols\n+ > &ret)\n+\u00a0 calculates ret = matrix^T * x\n+\u00a0\n+template\n+static _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, rows >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K,\n+ rows, cols > &matrix, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, cols\n+ > &x)\n+\u00a0 calculates ret = matrix * x\n+\u00a0\n+template\n+static _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, cols >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, rows, cols > &matrix, const\n+ _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, rows > &x)\n+\u00a0 calculates ret = matrix^T * x\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-*\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_G\bGE\bEN\bNE\bER\bRA\bAL\bLI\bIZ\bZE\bED\bD_\b_C\bCO\bON\bNS\bST\bTE\bEX\bXP\bPR\bR *\b**\b**\b**\b**\b*\n-#define DUNE_GENERALIZED_CONSTEXPR\u00a0\u00a0\u00a0constexpr\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_I\bIN\bNL\bLI\bIN\bNE\bE_\b_V\bVA\bAR\bRI\bIA\bAB\bBL\bLE\bE *\b**\b**\b**\b**\b*\n-#define DUNE_INLINE_VARIABLE\u00a0\u00a0\u00a0inline\n+Implements a matrix constructed from a given type representing a field and\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/a00284_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html", "has_internal_linenos": true, "unified_diff": "@@ -22,403 +22,10431 @@\n 00000150: 656e 743d 2244 6f78 7967 656e 2031 2e39 ent=\"Doxygen 1.9\n 00000160: 2e38 222f 3e0a 3c6d 6574 6120 6e61 6d65 .8\"/>..dune-common: \n-000001c0: 6b65 7977 6f72 6473 2e68 6820 536f 7572 keywords.hh Sour\n-000001d0: 6365 2046 696c 653c 2f74 6974 6c65 3e0a ce File.\n-000001e0: 3c6c 696e 6b20 6872 6566 3d22 7461 6273 ...\n-00000290: 3c6c 696e 6b20 6872 6566 3d22 7365 6172 ...../*\n-00000690: 2040 6c69 6365 6e73 6520 6d61 676e 6574 @license magnet\n-000006a0: 3a3f 7874 3d75 726e 3a62 7469 683a 6433 :?xt=urn:btih:d3\n-000006b0: 6439 6139 6136 3539 3535 3231 6639 3636 d9a9a6595521f966\n-000006c0: 3661 3565 3934 6363 3833 3064 6162 3833 6a5e94cc830dab83\n-000006d0: 6236 3536 3939 2661 6d70 3b64 6e3d 6578 b65699&dn=ex\n-000006e0: 7061 742e 7478 7420 4d49 5420 2a2f 0a24 pat.txt MIT */.$\n-000006f0: 2866 756e 6374 696f 6e28 2920 7b0a 2020 (function() {. \n-00000700: 696e 6974 4d65 6e75 2827 272c 7472 7565 initMenu('',true\n-00000710: 2c66 616c 7365 2c27 7365 6172 6368 2e70 ,false,'search.p\n-00000720: 6870 272c 2753 6561 7263 6827 293b 0a20 hp','Search');. \n-00000730: 2024 2864 6f63 756d 656e 7429 2e72 6561 $(document).rea\n-00000740: 6479 2866 756e 6374 696f 6e28 2920 7b20 dy(function() { \n-00000750: 696e 6974 5f73 6561 7263 6828 293b 207d init_search(); }\n-00000760: 293b 0a7d 293b 0a2f 2a20 406c 6963 656e );.});./* @licen\n-00000770: 7365 2d65 6e64 202a 2f0a 3c2f 7363 7269 se-end */..
    ../*\n-000007c0: 2040 6c69 6365 6e73 6520 6d61 676e 6574 @license magnet\n-000007d0: 3a3f 7874 3d75 726e 3a62 7469 683a 6433 :?xt=urn:btih:d3\n-000007e0: 6439 6139 6136 3539 3535 3231 6639 3636 d9a9a6595521f966\n-000007f0: 3661 3565 3934 6363 3833 3064 6162 3833 6a5e94cc830dab83\n-00000800: 6236 3536 3939 2661 6d70 3b64 6e3d 6578 b65699&dn=ex\n-00000810: 7061 742e 7478 7420 4d49 5420 2a2f 0a24 pat.txt MIT */.$\n-00000820: 2864 6f63 756d 656e 7429 2e72 6561 6479 (document).ready\n-00000830: 2866 756e 6374 696f 6e28 2920 7b20 696e (function() { in\n-00000840: 6974 5f63 6f64 6566 6f6c 6428 3029 3b20 it_codefold(0); \n-00000850: 7d29 3b0a 2f2a 2040 6c69 6365 6e73 652d });./* @license-\n-00000860: 656e 6420 2a2f 0a3c 2f73 6372 6970 743e end */.\n-00000870: 0a3c 212d 2d20 7769 6e64 6f77 2073 686f .....<\n-00000970: 212d 2d20 6966 7261 6d65 2073 686f 7769 !-- iframe showi\n-00000980: 6e67 2074 6865 2073 6561 7263 6820 7265 ng the search re\n-00000990: 7375 6c74 7320 2863 6c6f 7365 6420 6279 sults (closed by\n-000009a0: 2064 6566 6175 6c74 2920 2d2d 3e0a 3c64 default) -->...
    ..\n-00000a10: 3c64 6976 2069 643d 2253 5252 6573 756c
    .
    Lo\n-00000a50: 6164 696e 672e 2e2e 3c2f 6469 763e 0a3c ading...
    .<\n-00000a60: 6469 7620 636c 6173 733d 2253 5253 7461 div class=\"SRSta\n-00000a70: 7475 7322 2069 643d 2253 6561 7263 6869 tus\" id=\"Searchi\n-00000a80: 6e67 223e 5365 6172 6368 696e 672e 2e2e ng\">Searching...\n-00000a90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    No M\n-00000ac0: 6174 6368 6573 3c2f 6469 763e 0a3c 2f64 atches
    ......
    . \n-00000b10: 3c75 6c3e 0a3c 6c69 2063 6c61 7373 3d22
      .
    • dune\n-00000b70: 3c2f 6c69 3e3c 6c69 2063 6c61 7373 3d22
    • common
    .<\n-00000be0: 2f64 6976 3e0a 3c2f 6469 763e 3c21 2d2d /div>.
    .
    . \n-00000c10: 3c64 6976 2063 6c61 7373 3d22 6865 6164
    keyw\n-00000c40: 6f72 6473 2e68 683c 2f64 6976 3e3c 2f64 ords.hh
    .
    .
    .<\n-00000c80: 6120 6872 6566 3d22 6130 3032 3834 2e68 a href=\"a00284.h\n-00000c90: 746d 6c22 3e47 6f20 746f 2074 6865 2064 tml\">Go to the d\n-00000ca0: 6f63 756d 656e 7461 7469 6f6e 206f 6620 ocumentation of \n-00000cb0: 7468 6973 2066 696c 652e 3c2f 613e 3c64 this file.
    \n-00000d20: 313c 2f73 7061 6e3e 3c73 7061 6e20 636c 1//\n-00000d40: 2053 5044 582d 4669 6c65 436f 7079 7269 SPDX-FileCopyri\n-00000d50: 6768 7449 6e66 6f3a 2043 6f70 7972 6967 ghtInfo: Copyrig\n-00000d60: 6874 2028 4329 2044 554e 4520 5072 6f6a ht (C) DUNE Proj\n-00000d70: 6563 7420 636f 6e74 7269 6275 746f 7273 ect contributors\n-00000d80: 2c20 7365 6520 6669 6c65 204c 4943 454e , see file LICEN\n-00000d90: 5345 2e6d 6420 696e 206d 6f64 756c 6520 SE.md in module \n-00000da0: 726f 6f74 3c2f 7370 616e 3e3c 2f64 6976 root.
    2<\n-00000e00: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>// S\n-00000e20: 5044 582d 4c69 6365 6e73 652d 4964 656e PDX-License-Iden\n-00000e30: 7469 6669 6572 3a20 4c69 6365 6e73 6552 tifier: LicenseR\n-00000e40: 6566 2d47 504c 2d32 2e30 2d6f 6e6c 792d ef-GPL-2.0-only-\n-00000e50: 7769 7468 2d44 554e 452d 6578 6365 7074 with-DUNE-except\n-00000e60: 696f 6e3c 2f73 7061 6e3e 3c2f 6469 763e ion
    \n-00000e70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00000ea0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 3\n-00000ee0: 2369 666e 6465 6620 4455 4e45 5f43 4f4d #ifndef DUNE_COM\n-00000ef0: 4d4f 4e5f 4b45 5957 4f52 4453 5f48 483c MON_KEYWORDS_HH<\n-00000f00: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
    .<\n-00000f20: 6120 6964 3d22 6c30 3030 3034 2220 6e61 a id=\"l00004\" na\n-00000f30: 6d65 3d22 6c30 3030 3034 223e 3c2f 613e me=\"l00004\">\n-00000f40: 3c73 7061 6e20 636c 6173 733d 226c 696e 4#def\n-00000f80: 696e 6520 4455 4e45 5f43 4f4d 4d4f 4e5f ine DUNE_COMMON_\n-00000f90: 4b45 5957 4f52 4453 5f48 483c 2f73 7061 KEYWORDS_HH
    .
    5 .
    \n-00001050: 3138 3c2f 7370 616e 3e3c 7370 616e 2063 18#if __cpp_in\n-00001080: 6c69 6e65 5f76 6172 6961 626c 6573 2026 line_variables &\n-00001090: 6774 3b3d 2032 3031 3630 363c 2f73 7061 gt;= 201606
    .
    19<\n-00001140: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#define DUNE_IN\n-00001170: 4c49 4e45 5f56 4152 4941 424c 4520 696e LINE_VARIABLE in\n-00001180: 6c69 6e65 3c2f 7370 616e 3e3c 2f64 6976 line.
    20<\n-000011e0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#else.
    2\n-00001260: 323c 2f73 7061 6e3e 203c 2f64 6976 3e0a 2
    .\n-00001270: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    26#endif
    .<\n-000013c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-000013d0: 6e6f 223e 2020 2032 373c 2f73 7061 6e3e no\"> 27
    \n-000013e0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-00001430: 2020 2032 383c 2f73 7061 6e3e 203c 2f64 28 .
    2\n-00001490: 393c 2f73 7061 6e3e 3c73 7061 6e20 636c 9#if __cpp_con\n-000014c0: 7374 6578 7072 2026 6774 3b3d 2032 3031 stexpr >= 201\n-000014d0: 3330 343c 2f73 7061 6e3e 3c2f 6469 763e 304
    \n-000014e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00001510: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n-00001570: 2033 303c 2f61 3e3c 2f73 7061 6e3e 3c73 30#define\n-000015a0: 2044 554e 455f 4745 4e45 5241 4c49 5a45 DUNE_GENERALIZE\n-000015b0: 445f 434f 4e53 5445 5850 5220 636f 6e73 D_CONSTEXPR cons\n-000015c0: 7465 7870 723c 2f73 7061 6e3e 3c2f 6469 texpr.
    31\n-00001620: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #else.
    \n-000016a0: 3333 3c2f 7370 616e 3e20 3c2f 6469 763e 33
    \n-000016b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-000016e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 36\n-00001720: 2364 6566 696e 6520 4455 4e45 5f47 454e #define DUNE_GEN\n-00001730: 4552 414c 495a 4544 5f43 4f4e 5354 4558 ERALIZED_CONSTEX\n-00001740: 5052 3c2f 7370 616e 3e3c 2f64 6976 3e0a PR
    .\n-00001750: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-00001780: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 37#\n-000017c0: 656e 6469 663c 2f73 7061 6e3e 3c2f 6469 endif.
    38\n-00001820: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-00001830: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00001840: 3e3c 6120 6964 3d22 6c30 3030 3339 2220 > 39
    .
    40<\n-000018e0: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class=\"prep\n-000018f0: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor\">#endif\n-00001900: 203c 2f73 7061 6e3e 3c73 7061 6e20 636c //\n-00001920: 2044 554e 455f 434f 4d4d 4f4e 5f4b 4559 DUNE_COMMON_KEY\n-00001930: 574f 5244 535f 4848 3c2f 7370 616e 3e3c WORDS_HH<\n-00001940: 2f64 6976 3e0a 3c2f 6469 763e 3c21 2d2d /div>.
    ..\n-00001990: 3c68 7220 636c 6173 733d 2266 6f6f 7465
    .Generated by\n-000019d0: 2623 3136 303b 3c61 2068 7265 663d 2268  \"doxygen\"/\n-00001a50: 3c2f 613e 2031 2e39 2e38 0a3c 2f73 6d61 1.9.8.
    ...\n+000001c0: 666d 6174 7269 782e 6868 2053 6f75 7263 fmatrix.hh Sourc\n+000001d0: 6520 4669 6c65 3c2f 7469 746c 653e 0a3c e File.<\n+000001e0: 6c69 6e6b 2068 7265 663d 2274 6162 732e link href=\"tabs.\n+000001f0: 6373 7322 2072 656c 3d22 7374 796c 6573 css\" rel=\"styles\n+00000200: 6865 6574 2220 7479 7065 3d22 7465 7874 heet\" type=\"text\n+00000210: 2f63 7373 222f 3e0a 3c73 6372 6970 7420 /css\"/>.\n+00000250: 0a3c 7363 7269 7074 2074 7970 653d 2274 ..<\n+00000290: 6c69 6e6b 2068 7265 663d 2273 6561 7263 link href=\"searc\n+000002a0: 682f 7365 6172 6368 2e63 7373 2220 7265 h/search.css\" re\n+000002b0: 6c3d 2273 7479 6c65 7368 6565 7422 2074 l=\"stylesheet\" t\n+000002c0: 7970 653d 2274 6578 742f 6373 7322 2f3e ype=\"text/css\"/>\n+000002d0: 0a3c 7363 7269 7074 2074 7970 653d 2274 ...../* \n+00000690: 406c 6963 656e 7365 206d 6167 6e65 743a @license magnet:\n+000006a0: 3f78 743d 7572 6e3a 6274 6968 3a64 3364 ?xt=urn:btih:d3d\n+000006b0: 3961 3961 3635 3935 3532 3166 3936 3636 9a9a6595521f9666\n+000006c0: 6135 6539 3463 6338 3330 6461 6238 3362 a5e94cc830dab83b\n+000006d0: 3635 3639 3926 616d 703b 646e 3d65 7870 65699&dn=exp\n+000006e0: 6174 2e74 7874 204d 4954 202a 2f0a 2428 at.txt MIT */.$(\n+000006f0: 6675 6e63 7469 6f6e 2829 207b 0a20 2069 function() {. i\n+00000700: 6e69 744d 656e 7528 2727 2c74 7275 652c nitMenu('',true,\n+00000710: 6661 6c73 652c 2773 6561 7263 682e 7068 false,'search.ph\n+00000720: 7027 2c27 5365 6172 6368 2729 3b0a 2020 p','Search');. \n+00000730: 2428 646f 6375 6d65 6e74 292e 7265 6164 $(document).read\n+00000740: 7928 6675 6e63 7469 6f6e 2829 207b 2069 y(function() { i\n+00000750: 6e69 745f 7365 6172 6368 2829 3b20 7d29 nit_search(); })\n+00000760: 3b0a 7d29 3b0a 2f2a 2040 6c69 6365 6e73 ;.});./* @licens\n+00000770: 652d 656e 6420 2a2f 0a3c 2f73 6372 6970 e-end */..
    ../* \n+000007c0: 406c 6963 656e 7365 206d 6167 6e65 743a @license magnet:\n+000007d0: 3f78 743d 7572 6e3a 6274 6968 3a64 3364 ?xt=urn:btih:d3d\n+000007e0: 3961 3961 3635 3935 3532 3166 3936 3636 9a9a6595521f9666\n+000007f0: 6135 6539 3463 6338 3330 6461 6238 3362 a5e94cc830dab83b\n+00000800: 3635 3639 3926 616d 703b 646e 3d65 7870 65699&dn=exp\n+00000810: 6174 2e74 7874 204d 4954 202a 2f0a 2428 at.txt MIT */.$(\n+00000820: 646f 6375 6d65 6e74 292e 7265 6164 7928 document).ready(\n+00000830: 6675 6e63 7469 6f6e 2829 207b 2069 6e69 function() { ini\n+00000840: 745f 636f 6465 666f 6c64 2830 293b 207d t_codefold(0); }\n+00000850: 293b 0a2f 2a20 406c 6963 656e 7365 2d65 );./* @license-e\n+00000860: 6e64 202a 2f0a 3c2f 7363 7269 7074 3e0a nd */..\n+00000870: 3c21 2d2d 2077 696e 646f 7720 7368 6f77 .
    .
    .....
    ..<\n+00000a10: 6469 7620 6964 3d22 5352 5265 7375 6c74 div id=\"SRResult\n+00000a20: 7322 3e3c 2f64 6976 3e0a 3c64 6976 2063 s\">
    .
    Loa\n+00000a50: 6469 6e67 2e2e 2e3c 2f64 6976 3e0a 3c64 ding...
    .Searching...<\n+00000a90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    No Ma\n+00000ac0: 7463 6865 733c 2f64 6976 3e0a 3c2f 6469 tches
    ..
    .
    \n+00000ae0: 0a3c 2f64 6976 3e0a 0a3c 6469 7620 6964 .
    ..
    . <\n+00000b10: 756c 3e0a 3c6c 6920 636c 6173 733d 226e ul>.
  • dune<\n+00000b70: 2f6c 693e 3c6c 6920 636c 6173 733d 226e /li>
  • common
  • ..
    .
    . <\n+00000c10: 6469 7620 636c 6173 733d 2268 6561 6465 div class=\"heade\n+00000c20: 7274 6974 6c65 223e 3c64 6976 2063 6c61 rtitle\">
    fmatr\n+00000c40: 6978 2e68 683c 2f64 6976 3e3c 2f64 6976 ix.hh
    .
    .
    .Go to the doc\n+00000ca0: 756d 656e 7461 7469 6f6e 206f 6620 7468 umentation of th\n+00000cb0: 6973 2066 696c 652e 3c2f 613e 3c64 6976 is file.
    1<\n+00000d20: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>// -\n+00000d40: 2a2d 2074 6162 2d77 6964 7468 3a20 343b *- tab-width: 4;\n+00000d50: 2069 6e64 656e 742d 7461 6273 2d6d 6f64 indent-tabs-mod\n+00000d60: 653a 206e 696c 3b20 632d 6261 7369 632d e: nil; c-basic-\n+00000d70: 6f66 6673 6574 3a20 3220 2d2a 2d3c 2f73 offset: 2 -*-
    .
    2<\n+00000de0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class=\"comm\n+00000df0: 656e 7422 3e2f 2f20 7669 3a20 7365 7420 ent\">// vi: set \n+00000e00: 6574 2074 733d 3420 7377 3d32 2073 7473 et ts=4 sw=2 sts\n+00000e10: 3d32 3a3c 2f73 7061 6e3e 3c2f 6469 763e =2:
    \n+00000e20: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00000e50: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 3// SP\n+00000e90: 4458 2d46 696c 6543 6f70 7972 6967 6874 DX-FileCopyright\n+00000ea0: 496e 666f 3a20 436f 7079 7269 6768 7420 Info: Copyright \n+00000eb0: 2843 2920 4455 4e45 2050 726f 6a65 6374 (C) DUNE Project\n+00000ec0: 2063 6f6e 7472 6962 7574 6f72 732c 2073 contributors, s\n+00000ed0: 6565 2066 696c 6520 4c49 4345 4e53 452e ee file LICENSE.\n+00000ee0: 6d64 2069 6e20 6d6f 6475 6c65 2072 6f6f md in module roo\n+00000ef0: 743c 2f73 7061 6e3e 3c2f 6469 763e 0a3c t
    .<\n+00000f00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00000f10: 3e3c 6120 6964 3d22 6c30 3030 3034 2220 > 4// SPDX\n+00000f70: 2d4c 6963 656e 7365 2d49 6465 6e74 6966 -License-Identif\n+00000f80: 6965 723a 204c 6963 656e 7365 5265 662d ier: LicenseRef-\n+00000f90: 4750 4c2d 322e 302d 6f6e 6c79 2d77 6974 GPL-2.0-only-wit\n+00000fa0: 682d 4455 4e45 2d65 7863 6570 7469 6f6e h-DUNE-exception\n+00000fb0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
    .\n+00000fd0: 3c61 2069 643d 226c 3030 3030 3522 206e 5#if\n+00001030: 6e64 6566 2044 554e 455f 464d 4154 5249 ndef DUNE_FMATRI\n+00001040: 585f 4848 3c2f 7370 616e 3e3c 2f64 6976 X_HH.
    6<\n+000010a0: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#define DUNE_FM\n+000010d0: 4154 5249 585f 4848 3c2f 7370 616e 3e3c ATRIX_HH<\n+000010e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00001130: 2020 373c 2f73 7061 6e3e 203c 2f64 6976 7 .
    8<\n+00001190: 2f73 7061 6e3e 3c73 7061 6e20 636c 6173 /span>#include <cm\n+000011c0: 6174 6826 6774 3b3c 2f73 7061 6e3e 3c2f ath>.
    \n+00001220: 2039 3c2f 7370 616e 3e3c 7370 616e 2063 9#include <\n+00001250: 3b63 7374 6464 6566 2667 743b 3c2f 7370 ;cstddef>
    .
    10#includ\n+000012e0: 6520 266c 743b 696f 7374 7265 616d 2667 e <iostream&g\n+000012f0: 743b 3c2f 7370 616e 3e3c 2f64 6976 3e0a t;
    .\n+00001300: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n+000013e0: 2020 3132 3c2f 7370 616e 3e3c 7370 616e 12#include &\n+00001410: 6c74 3b69 6e69 7469 616c 697a 6572 5f6c lt;initializer_l\n+00001420: 6973 7426 6774 3b3c 2f73 7061 6e3e 3c2f ist>.
    \n+00001480: 3133 3c2f 7370 616e 3e20 3c2f 6469 763e 13
    \n+00001490: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+000014c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 14\n+00001500: 2369 6e63 6c75 6465 2026 6c74 3b3c 6120 #include <\n+00001530: 6475 6e65 2f63 6f6d 6d6f 6e2f 626f 756e dune/common/boun\n+00001540: 6473 6368 6563 6b69 6e67 2e68 683c 2f61 dschecking.hh>.
    15\n+000015b0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 #include <<\n+000015e0: 6120 636c 6173 733d 2263 6f64 6522 2068 a class=\"code\" h\n+000015f0: 7265 663d 2261 3030 3337 312e 6874 6d6c ref=\"a00371.html\n+00001600: 223e 6475 6e65 2f63 6f6d 6d6f 6e2f 6578 \">dune/common/ex\n+00001610: 6365 7074 696f 6e73 2e68 683c 2f61 3e26 ceptions.hh&\n+00001620: 6774 3b3c 2f73 7061 6e3e 3c2f 6469 763e gt;
    \n+00001630: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00001730: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00001740: 6e6f 223e 2020 2031 373c 2f73 7061 6e3e no\"> 17
    \n+00001750: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl\n+00001770: 7564 6520 266c 743b 3c61 2063 6c61 7373 ude <dune/\n+000017a0: 636f 6d6d 6f6e 2f64 656e 7365 6d61 7472 common/densematr\n+000017b0: 6978 2e68 683c 2f61 3e26 6774 3b3c 2f73 ix.hh>
    .
    18<\n+00001820: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class=\"prep\n+00001830: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor\">#inclu\n+00001840: 6465 2026 6c74 3b3c 6120 636c 6173 733d de <dune/c\n+00001870: 6f6d 6d6f 6e2f 7072 6563 6973 696f 6e2e ommon/precision.\n+00001880: 6868 3c2f 613e 2667 743b 3c2f 7370 616e hh>
    .
    \n+000018e0: 2020 2031 393c 2f73 7061 6e3e 3c73 7061 19#include \n+00001910: 266c 743b 3c61 2063 6c61 7373 3d22 636f <dune/comm\n+00001940: 6f6e 2f70 726f 6d6f 7469 6f6e 7472 6169 on/promotiontrai\n+00001950: 7473 2e68 683c 2f61 3e26 6774 3b3c 2f73 ts.hh>
    .
    20<\n+000019c0: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class=\"prep\n+000019d0: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor\">#inclu\n+000019e0: 6465 2026 6c74 3b3c 6120 636c 6173 733d de <dune/c\n+00001a10: 6f6d 6d6f 6e2f 7479 7065 7472 6169 7473 ommon/typetraits\n+00001a20: 2e68 683c 2f61 3e26 6774 3b3c 2f73 7061 .hh>
    ..
    22 \n+00001b60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00001bb0: 2020 3233 3c2f 7370 616e 3e3c 7370 616e 23namespace Dune
    \n+00001c20: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00001c90: 6120 6964 3d22 6c30 3030 3235 2220 6e61 a id=\"l00025\" na\n+00001ca0: 6d65 3d22 6c30 3030 3235 223e 3c2f 613e me=\"l00025\">\n+00001cb0: 3c73 7061 6e20 636c 6173 733d 226c 696e 25
    .
    26 <\n+00001d30: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00001d40: 6f72 6422 3e6e 616d 6573 7061 6365 203c ord\">namespace <\n+00001d50: 2f73 7061 6e3e 496d 706c 3c2f 6469 763e /span>Impl
    \n+00001d60: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00001dc0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00001dd0: 3e3c 6120 6964 3d22 6c30 3030 3238 2220 > 28
    .
    29 \n+00001e70: 2020 203c 7370 616e 2063 6c61 7373 3d22 templat\n+00001e90: 653c 2f73 7061 6e3e 266c 743b 3c73 7061 e<class M\n+00001ec0: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    30 \n+00001f20: 2020 203c 7370 616e 2063 6c61 7373 3d22 class <\n+00001f40: 2f73 7061 6e3e 436f 6c75 6d6e 5665 6374 /span>ColumnVect\n+00001f50: 6f72 5669 6577 3c2f 6469 763e 0a3c 6469 orView
    .<\n+00001f70: 6120 6964 3d22 6c30 3030 3331 2220 6e61 a id=\"l00031\" na\n+00001f80: 6d65 3d22 6c30 3030 3331 223e 3c2f 613e me=\"l00031\">\n+00001f90: 3c73 7061 6e20 636c 6173 733d 226c 696e 31 {
    .<\n+00001fd0: 6120 6964 3d22 6c30 3030 3332 2220 6e61 a id=\"l00032\" na\n+00001fe0: 6d65 3d22 6c30 3030 3332 223e 3c2f 613e me=\"l00032\">\n+00001ff0: 3c73 7061 6e20 636c 6173 733d 226c 696e 32 publi\n+00002030: 633c 2f73 7061 6e3e 3a3c 2f64 6976 3e0a c:
    .\n+00002040: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+000020d0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000020e0: 6e6f 223e 2020 2033 343c 2f73 7061 6e3e no\"> 34\n+000020f0: 2020 2020 2020 3c73 7061 6e20 636c 6173 usin\n+00002110: 6720 3c2f 7370 616e 3e76 616c 7565 5f74 g value_t\n+00002120: 7970 6520 3d20 3c73 7061 6e20 636c 6173 ype = type\n+00002140: 6e61 6d65 3c2f 7370 616e 3e20 4d3a 3a76 name M::v\n+00002150: 616c 7565 5f74 7970 653b 3c2f 6469 763e alue_type;
    \n+00002160: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00002190: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 35 using si\n+000021e0: 7a65 5f74 7970 6520 3d20 3c73 7061 6e20 ze_type = \n+00002200: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n+00002210: 4d3a 3a73 697a 655f 7479 7065 3b3c 2f64 M::size_type;.
    3\n+00002270: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
    .\n+00002280: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n+00002380: 2020 2033 383c 2f73 7061 6e3e 2020 2020 38 \n+00002390: 2020 2020 6d61 7472 6978 5f28 6d61 7472 matrix_(matr\n+000023a0: 6978 292c 3c2f 6469 763e 0a3c 6469 7620 ix),
    .
    39 \n+00002400: 2020 2020 2020 2063 6f6c 5f28 636f 6c29 col_(col)\n+00002410: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00002460: 2020 3430 3c2f 7370 616e 3e20 2020 2020 40 \n+00002470: 207b 7d3c 2f64 6976 3e0a 3c64 6976 2063 {}
    .
    41 <\n+000024d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00002520: 2034 323c 2f73 7061 6e3e 2020 2020 2020 42 \n+00002530: 3c73 7061 6e20 636c 6173 733d 226b 6579 constexpr<\n+00002550: 2f73 7061 6e3e 2073 697a 655f 7479 7065 /span> size_type\n+00002560: 204e 2028 293c 7370 616e 2063 6c61 7373 N () cons\n+00002580: 7420 3c2f 7370 616e 3e7b 3c2f 6469 763e t {
    \n+00002590: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+000025c0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 43 return matrix_.N()\n+00002620: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+00002670: 2020 2034 343c 2f73 7061 6e3e 2020 2020 44 \n+00002680: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    45 <\n+000026e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00002730: 2034 363c 2f73 7061 6e3e 2020 2020 2020 46 \n+00002740: 3c73 7061 6e20 636c 6173 733d 226b 6579 template<c\n+00002780: 6c61 7373 203c 2f73 7061 6e3e 4d5f 203d lass M_ =\n+00002790: 204d 2c3c 2f64 6976 3e0a 3c64 6976 2063 M,
    .
    47 \n+000027f0: 2020 2020 2020 7374 643a 3a65 6e61 626c std::enabl\n+00002800: 655f 6966 5f74 266c 743b 7374 643a 3a69 e_if_t<std::i\n+00002810: 735f 7361 6d65 5f76 266c 743b 4d5f 2c4d s_same_v<M_,M\n+00002820: 2667 743b 2061 6e64 206e 6f74 2073 7464 > and not std\n+00002830: 3a3a 6973 5f63 6f6e 7374 5f76 266c 743b ::is_const_v<\n+00002840: 4d5f 2667 743b 2c20 3c73 7061 6e20 636c M_>, int>\n+00002870: 203d 2030 2667 743b 3c2f 6469 763e 0a3c = 0>
    .<\n+00002880: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00002890: 3e3c 6120 6964 3d22 6c30 3030 3438 2220 > 48 c\n+000028f0: 6f6e 7374 6578 7072 3c2f 7370 616e 3e20 onstexpr \n+00002900: 7661 6c75 655f 7479 7065 2661 6d70 3b20 value_type& \n+00002910: 6f70 6572 6174 6f72 5b5d 2028 7369 7a65 operator[] (size\n+00002920: 5f74 7970 6520 726f 7729 207b 3c2f 6469 _type row) {.
    49\n+00002980: 3c2f 7370 616e 3e20 2020 2020 2020 203c <\n+00002990: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+000029a0: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n+000029b0: 2f73 7061 6e3e 206d 6174 7269 785f 5b72 /span> matrix_[r\n+000029c0: 6f77 5d5b 636f 6c5f 5d3b 3c2f 6469 763e ow][col_];
    \n+000029d0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..
    53 \n+00002be0: 2020 2020 203c 7370 616e 2063 6c61 7373 r\n+00002c00: 6574 7572 6e3c 2f73 7061 6e3e 206d 6174 eturn mat\n+00002c10: 7269 785f 5b72 6f77 5d5b 636f 6c5f 5d3b rix_[row][col_];\n+00002c20: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00002c70: 2020 3534 3c2f 7370 616e 3e20 2020 2020 54 \n+00002c80: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
    .
    55 .
    \n+00002d30: 3536 3c2f 7370 616e 3e20 2020 203c 7370 56 protected:
    .
    57 \n+00002dc0: 2020 2020 204d 2661 6d70 3b20 6d61 7472 M& matr\n+00002dd0: 6978 5f3b 3c2f 6469 763e 0a3c 6469 7620 ix_;
    .
    58 \n+00002e30: 2020 2020 203c 7370 616e 2063 6c61 7373 const\n+00002e50: 3c2f 7370 616e 3e20 7369 7a65 5f74 7970 size_typ\n+00002e60: 6520 636f 6c5f 3b3c 2f64 6976 3e0a 3c64 e col_;
    .\n+00002e80: 3c61 2069 643d 226c 3030 3035 3922 206e 59 };
    .<\n+00002ed0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00002ee0: 3e3c 6120 6964 3d22 6c30 3030 3630 2220 > 60
    .
    61 \n+00002f80: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
    .
    62 .
    \n+00003030: 3633 3c2f 7370 616e 3e20 203c 7370 616e 63 template\n+00003060: 266c 743b 3c73 7061 6e20 636c 6173 733d <typena\n+00003080: 6d65 3c2f 7370 616e 3e20 4d26 6774 3b3c me M><\n+00003090: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+000030e0: 2036 343c 2f73 7061 6e3e 2020 3c73 7061 64 struct \n+00003110: 4669 656c 6454 7261 6974 7326 6c74 3b20 FieldTraits< \n+00003120: 496d 706c 3a3a 436f 6c75 6d6e 5665 6374 Impl::ColumnVect\n+00003130: 6f72 5669 6577 266c 743b 4d26 6774 3b20 orView<M> \n+00003140: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    65 \n+000031a0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    ..
    \n+00003370: 2020 3637 3c2f 7370 616e 3e20 2020 203c 67 <\n+00003380: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00003390: 6f72 6422 3e75 7369 6e67 203c 2f73 7061 ord\">using real_type \n+00003400: 3d20 3c73 7061 6e20 636c 6173 733d 226b = typename\n+00003420: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 FieldTra\n+00003480: 6974 7326 6c74 3b4d 2667 743b 3a3a 7265 its<M>::re\n+00003490: 616c 5f74 7970 653c 2f61 3e3b 3c2f 6469 al_type;..
    82 \n+000036f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00003740: 2020 3833 3c2f 7370 616e 3e20 3c2f 6469 83 .
    84\n+000037a0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 t\n+000037c0: 656d 706c 6174 653c 2f73 7061 6e3e 266c emplate&l\n+000037d0: 743b 203c 7370 616e 2063 6c61 7373 3d22 t; class K, int RO\n+00003820: 5753 2c20 3c73 7061 6e20 636c 6173 733d WS, in\n+00003840: 743c 2f73 7061 6e3e 2043 4f4c 5320 2667 t COLS &g\n+00003850: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    .
    .\n+000038a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    89 \n+00003c70: 203c 7370 616e 2063 6c61 7373 3d22 636f // each r\n+00003c90: 6f77 2069 7320 696d 706c 656d 656e 7465 ow is implemente\n+00003ca0: 6420 6279 2061 2066 6965 6c64 2076 6563 d by a field vec\n+00003cb0: 746f 723c 2f73 7061 6e3e 3c2f 6469 763e tor
    \n+00003cc0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00003cf0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n+00003d50: 2039 303c 2f61 3e3c 2f73 7061 6e3e 2020 90 \n+00003d60: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef<\n+00003d80: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldVector&l\n+00003dc0: 743b 4b2c 434f 4c53 2667 743b 3c2f 613e t;K,COLS>\n+00003dd0: 203c 6120 636c 6173 733d 2263 6f64 6520 row_type;.
    \n+00003e80: 3931 3c2f 7370 616e 3e20 3c2f 6469 763e 91
    \n+00003e90: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00003ec0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n+00003f20: 2039 323c 2f61 3e3c 2f73 7061 6e3e 2020 92 \n+00003f30: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef<\n+00003f50: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> row_type \n+00003f90: 2661 6d70 3b3c 6120 636c 6173 733d 2263 &row_referen\n+00003ff0: 6365 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 ce;
    .\n+00004010: 3c61 2069 643d 226c 3030 3039 3322 206e 93\n+00004090: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c
    <\n+000040a0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+000040b0: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord\">typedef const<\n+000040e0: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> row_type \n+00004120: 2661 6d70 3b3c 6120 636c 6173 733d 2263 &const_row_r\n+00004180: 6566 6572 656e 6365 3c2f 613e 3b3c 2f64 eference;.
    9\n+000041e0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n+000041f0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+00004220: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> \n+00004280: 3935 3c2f 613e 3c2f 7370 616e 3e20 2020 95 \n+00004290: 203c 7370 616e 2063 6c61 7373 3d22 6b65 typedef std::array\n+000042c0: 266c 743b 726f 775f 7479 7065 2c52 4f57 <row_type,ROW\n+000042d0: 5326 6774 3b20 3c61 2063 6c61 7373 3d22 S> container_\n+00004330: 7479 7065 3c2f 613e 3b3c 2f64 6976 3e0a type;
    .\n+00004340: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+00004480: 3c61 2069 643d 226c 3030 3039 3722 206e 97\n+00004500: 3c2f 613e 3c2f 7370 616e 3e20 2020 203c
    <\n+00004510: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00004520: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord\">typedef typena\n+00004550: 6d65 3c2f 7370 616e 3e20 636f 6e74 6169 me contai\n+00004560: 6e65 725f 7479 7065 3a3a 7369 7a65 5f74 ner_type::size_t\n+00004570: 7970 6520 3c61 2063 6c61 7373 3d22 636f ype size_type;
    .
    98 }\n+00004630: 3b3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c ;
    .
    .<\n+00004640: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00004650: 3e3c 6120 6964 3d22 6c30 3030 3939 2220 > 99
    .
    100 \n+000046f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n+00004710: 2f73 7061 6e3e 266c 743b 203c 7370 616e /span>< class K,\n+00004740: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int ROWS, int\n+00004790: 2043 4f4c 5320 2667 743b 3c2f 6469 763e COLS >
    \n+000047a0: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
    .
    \n+00004830: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 101 struc\n+00004880: 7420 3c2f 7370 616e 3e3c 6120 636c 6173 t FieldTrait\n+000048c0: 733c 2f61 3e26 6c74 3b20 3c61 2063 6c61 s< FieldMatri\n+00004900: 783c 2f61 3e26 6c74 3b4b 2c52 4f57 532c x<K,ROWS,\n+00004910: 434f 4c53 2667 743b 2026 6774 3b3c 2f64 COLS> >.
    10\n+00004970: 323c 2f73 7061 6e3e 2020 7b3c 2f64 6976 2 {.
    \n+00004a10: 2031 3033 3c2f 613e 3c2f 7370 616e 3e20 103 \n+00004a20: 2020 203c 7370 616e 2063 6c61 7373 3d22 typedef\n+00004a40: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c ty\n+00004a60: 7065 6e61 6d65 3c2f 7370 616e 3e20 3c61 pename Fi\n+00004ac0: 656c 6454 7261 6974 7326 6c74 3b4b 2667 eldTraits<K&g\n+00004ad0: 743b 3a3a 6669 656c 645f 7479 7065 3c2f t;::field_type field_type;
    .
    104<\n+00004be0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00004c00: 7479 7065 6465 663c 2f73 7061 6e3e 203c typedef <\n+00004c10: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00004c20: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord\">typename FieldTraits\n+00004c90: 266c 743b 4b26 6774 3b3a 3a72 6561 6c5f <K>::real_\n+00004ca0: 7479 7065 3c2f 613e 203c 6120 636c 6173 type real_ty\n+00004d00: 7065 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 pe;
    .\n+00004d20: 3c61 2069 643d 226c 3030 3130 3522 206e 105 };
    ..
    10\n+00004dc0: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
    .\n+00004dd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+00004e00: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 115 temp\n+00004e40: 6c61 7465 3c2f 7370 616e 3e26 6c74 3b3c late<<\n+00004e50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00004e60: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord\">class K, i\n+00004e90: 6e74 3c2f 7370 616e 3e20 524f 5753 2c20 nt ROWS, \n+00004ea0: 3c73 7061 6e20 636c 6173 733d 226b 6579 int COLS>.
    .
    116<\n+00004f90: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> cl\n+00004fb0: 6173 7320 3c2f 7370 616e 3e3c 6120 636c ass FieldMatr\n+00004ff0: 6978 3c2f 613e 203a 203c 7370 616e 2063 ix : p\n+00005010: 7562 6c69 633c 2f73 7061 6e3e 203c 6120 ublic DenseMa\n+00005050: 7472 6978 3c2f 613e 266c 743b 2046 6965 trix< Fie\n+00005060: 6c64 4d61 7472 6978 266c 743b 4b2c 524f ldMatrix<K,RO\n+00005070: 5753 2c43 4f4c 5326 6774 3b20 2667 743b WS,COLS> >\n+00005080: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000050d0: 2031 3137 3c2f 7370 616e 3e20 207b 3c2f 117 {.
    1\n+00005130: 3138 3c2f 7370 616e 3e20 2020 2073 7464 18 std\n+00005140: 3a3a 6172 7261 7926 6c74 3b20 4669 656c ::array< Fiel\n+00005150: 6456 6563 746f 7226 6c74 3b4b 2c43 4f4c dVector<K,COL\n+00005160: 5326 6774 3b2c 2052 4f57 5320 2667 743b S>, ROWS >\n+00005170: 205f 6461 7461 3b3c 2f64 6976 3e0a 3c64 _data;
    .\n+00005190: 3c61 2069 643d 226c 3030 3131 3922 206e 119 type\n+000051f0: 6465 663c 2f73 7061 6e3e 203c 6120 636c def DenseMatr\n+00005230: 6978 266c 743b 2046 6965 6c64 4d61 7472 ix< FieldMatr\n+00005240: 6978 266c 743b 4b2c 524f 5753 2c43 4f4c ix<K,ROWS,COL\n+00005250: 5326 6774 3b3c 2f61 3e20 2667 743b 203c S> > <\n+00005260: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00005270: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n+00005280: 3134 3030 2e68 746d 6c22 3e42 6173 653c 1400.html\">Base<\n+00005290: 2f61 3e3b 3c2f 6469 763e 0a3c 6469 7620 /a>;
    .
    120 \n+000052f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 public:
    .<\n+00005350: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00005360: 6e6f 223e 2020 3132 313c 2f73 7061 6e3e no\"> 121\n+00005370: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+000053c0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 123 c\n+00005430: 6f6e 7374 6578 7072 3c2f 7370 616e 3e20 onstexpr \n+00005440: 3c73 7061 6e20 636c 6173 733d 226b 6579 static in\n+00005480: 743c 2f73 7061 6e3e 203c 6120 636c 6173 t rows = ROWS;
    \n+000054f0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00005520: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n+00005580: 3132 353c 2f61 3e3c 2f73 7061 6e3e 2020 125 \n+00005590: 2020 3c73 7061 6e20 636c 6173 733d 226b constexp\n+000055b0: 723c 2f73 7061 6e3e 203c 7370 616e 2063 r s\n+000055d0: 7461 7469 633c 2f73 7061 6e3e 203c 7370 tatic int cols = CO\n+00005660: 4c53 3b3c 2f64 6976 3e0a 3c64 6976 2063 LS;
    .
    126 <\n+000056c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>...
    129 <\n+00005a60: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>..<\n+00005c00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00005c10: 3e3c 6120 6964 3d22 6c30 3031 3331 2220 > 13\n+00005c90: 313c 2f61 3e3c 2f73 7061 6e3e 2020 2020 1 \n+00005ca0: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef typen\n+00005ce0: 616d 653c 2f73 7061 6e3e 203c 6120 636c ame Base::con\n+00005d20: 7374 5f72 6f77 5f72 6566 6572 656e 6365 st_row_reference\n+00005d30: 3c2f 613e 203c 6120 636c 6173 733d 2263 const_row_r\n+00005d90: 6566 6572 656e 6365 3c2f 613e 3b3c 2f64 eference;.
    13\n+00005df0: 323c 2f73 7061 6e3e 203c 2f64 6976 3e0a 2
    .\n+00005e00: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+00005e90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+00005ec0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1\n+00005f20: 3336 3c2f 613e 3c2f 7370 616e 3e20 2020 36 \n+00005f30: 203c 7370 616e 2063 6c61 7373 3d22 6b65 constexpr\n+00005f50: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 FieldMa\n+00005fb0: 7472 6978 3c2f 613e 2829 203d 203c 7370 trix() = default;
    .<\n+00006000: 6120 6964 3d22 6c30 3031 3337 2220 6e61 a id=\"l00137\" na\n+00006010: 6d65 3d22 6c30 3031 3337 223e 3c2f 613e me=\"l00137\">\n+00006020: 3c73 7061 6e20 636c 6173 733d 226c 696e 137
    .
    .<\n+00006090: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000060a0: 3e3c 6120 6964 3d22 6c30 3031 3430 2220 > 14\n+00006120: 303c 2f61 3e3c 2f73 7061 6e3e 2020 2020 0 \n+00006130: 3c61 2063 6c61 7373 3d22 636f 6465 2068 FieldMatrix\n+00006190: 2873 7464 3a3a 696e 6974 6961 6c69 7a65 (std::initialize\n+000061a0: 725f 6c69 7374 266c 743b 3c61 2063 6c61 r_list<Dune::Fiel\n+000061e0: 6456 6563 746f 7226 6c74 3b4b 2c20 636f dVector<K, co\n+000061f0: 6c73 2667 743b 3c2f 613e 2026 6774 3b20 ls> > \n+00006200: 3c73 7061 6e20 636c 6173 733d 226b 6579 const &l) {.
    141\n+00006280: 3c2f 7370 616e 3e20 2020 2020 2061 7373 ass\n+00006290: 6572 7428 6c2e 7369 7a65 2829 203d 3d20 ert(l.size() == \n+000062a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 rows); // Actually, t\n+00006320: 6869 7320 6973 206e 6f74 206e 6565 6465 his is not neede\n+00006330: 6420 616e 7920 6d6f 7265 213c 2f73 7061 d any more!
    .
    142 \n+000063a0: 2020 2073 7464 3a3a 636f 7079 5f6e 286c std::copy_n(l\n+000063b0: 2e62 6567 696e 2829 2c20 7374 643a 3a6d .begin(), std::m\n+000063c0: 696e 283c 7370 616e 2063 6c61 7373 3d22 in(static_\n+000063e0: 6361 7374 266c 743b 3c2f 7370 616e 3e73 cast<s\n+000063f0: 7464 3a3a 7369 7a65 5f74 3c73 7061 6e20 td::size_t\n+00006410: 2667 743b 3c2f 7370 616e 3e28 524f 5753 >(ROWS\n+00006420: 292c 3c2f 6469 763e 0a3c 6469 7620 636c ),
    .
    143 \n+00006480: 2020 2020 2020 2020 2020 2020 2020 2020 \n+00006490: 2020 2020 2020 2020 2020 2020 2020 2020 \n+000064a0: 2020 206c 2e73 697a 6528 2929 2c3c 2f64 l.size()),.
    14\n+00006500: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 \n+00006510: 2020 2020 2020 2020 205f 6461 7461 2e62 _data.b\n+00006520: 6567 696e 2829 293b 3c2f 6469 763e 0a3c egin());
    .<\n+00006530: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00006540: 3e3c 6120 6964 3d22 6c30 3031 3435 2220 > 145 }
    .<\n+00006590: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+000065e0: 3134 363c 2f73 7061 6e3e 203c 2f64 6976 146 .
    147<\n+00006640: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00006660: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n+00006670: 266c 743b 3c73 7061 6e20 636c 6173 733d <class \n+00006690: 3c2f 7370 616e 3e54 2c3c 2f64 6976 3e0a T,
    .\n+000066a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+00006780: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
    .
    149 FieldMat\n+000068c0: 7269 783c 2f61 3e28 5420 3c73 7061 6e20 rix(T \n+000068e0: 636f 6e73 743c 2f73 7061 6e3e 2661 6d70 const&\n+000068f0: 3b20 7268 7329 3c2f 6469 763e 0a3c 6469 ; rhs)
    .<\n+00006910: 6120 6964 3d22 6c30 3031 3530 2220 6e61 a id=\"l00150\" na\n+00006920: 6d65 3d22 6c30 3031 3530 223e 3c2f 613e me=\"l00150\">\n+00006930: 3c73 7061 6e20 636c 6173 733d 226c 696e 150 {
    .<\n+00006970: 6120 6964 3d22 6c30 3031 3531 2220 6e61 a id=\"l00151\" na\n+00006980: 6d65 3d22 6c30 3031 3531 223e 3c2f 613e me=\"l00151\">\n+00006990: 3c73 7061 6e20 636c 6173 733d 226c 696e 151 *th\n+000069d0: 6973 3c2f 7370 616e 3e20 3d20 7268 733b is = rhs;\n+000069e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00006a30: 2031 3532 3c2f 7370 616e 3e20 2020 207d 152 }\n+00006a40: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n+00006a60: 3c61 2069 643d 226c 3030 3135 3322 206e 153
    .
    154 \n+00006b00: 2020 3c73 7061 6e20 636c 6173 733d 226b using Base::opera\n+00006b30: 746f 723d 3b3c 2f64 6976 3e0a 3c64 6976 tor=;
    .<\n+00006b70: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00006b80: 6e6f 223e 2020 3135 353c 2f73 7061 6e3e no\"> 155\n+00006b90: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+00006be0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 157 FieldMatrix\n+00006c70: 3c2f 613e 2661 6d70 3b20 3c61 2063 6c61 & opera\n+00006cd0: 746f 723d 3c2f 613e 283c 7370 616e 2063 tor=(c\n+00006cf0: 6f6e 7374 3c2f 7370 616e 3e20 3c61 2063 onst FieldMat\n+00006d30: 7269 783c 2f61 3e26 616d 703b 2920 3d20 rix&) = \n+00006d40: 3c73 7061 6e20 636c 6173 733d 226b 6579 defaul\n+00006d60: 743c 2f73 7061 6e3e 3b3c 2f64 6976 3e0a t;
    .\n+00006d70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00006e00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00006e10: 6e6f 223e 2020 3136 303c 2f73 7061 6e3e no\"> 160\n+00006e20: 2020 2020 3c73 7061 6e20 636c 6173 733d templa\n+00006e40: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<typename T>
    .<\n+00006e80: 6469 7620 636c 6173 733d 2266 6f6c 646f div class=\"foldo\n+00006e90: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen\" id=\"foldope\n+00006ea0: 6e30 3031 3631 2220 6461 7461 2d73 7461 n00161\" data-sta\n+00006eb0: 7274 3d22 7b22 2064 6174 612d 656e 643d rt=\"{\" data-end=\n+00006ec0: 227d 223e 0a3c 6469 7620 636c 6173 733d \"}\">..
    \n+000070d0: 2020 3136 323c 2f73 7061 6e3e 2020 2020 162 \n+000070e0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n+00007130: 2020 3136 333c 2f73 7061 6e3e 2020 2020 163 \n+00007140: 2020 5f64 6174 6120 3d20 782e 5f64 6174 _data = x._dat\n+00007150: 613b 3c2f 6469 763e 0a3c 6469 7620 636c a;
    .
    164 \n+000071b0: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n+000071d0: 7572 6e3c 2f73 7061 6e3e 202a 3c73 7061 urn *this;.
    1\n+00007250: 3635 3c2f 7370 616e 3e20 2020 207d 3c2f 65 }.
    .<\n+000072a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000072b0: 6e6f 223e 2020 3136 363c 2f73 7061 6e3e no\"> 166\n+000072c0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+00007310: 2020 3136 383c 2f73 7061 6e3e 2020 2020 168 \n+00007320: 3c73 7061 6e20 636c 6173 733d 226b 6579 template <\n+00007360: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n+00007370: 542c 203c 7370 616e 2063 6c61 7373 3d22 T, int\n+00007390: 3c2f 7370 616e 3e20 726f 7773 2c20 3c73 rows, int cols>..
    \n+00007600: 2020 3137 303c 2f73 7061 6e3e 203c 2f64 170 .
    ..
    \n+00007820: 2031 3733 3c2f 7370 616e 3e3c 7370 616e 173 {.
    17\n+000078a0: 343c 2f73 7061 6e3e 2020 2020 2020 3c61 4 Dune::\n+000078e0: 4669 656c 644d 6174 7269 7826 6c74 3b4b FieldMatrix<K\n+000078f0: 2c20 434f 4c53 2c20 524f 5753 2667 743b , COLS, ROWS>\n+00007900: 3c2f 613e 2041 543b 3c2f 6469 763e 0a3c AT;
    .<\n+00007910: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00007920: 3e3c 6120 6964 3d22 6c30 3031 3735 2220 > 175 for( <\n+00007990: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+000079a0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype\">int i = 0; i <\n+000079c0: 3b20 524f 5753 3b20 2b2b 6920 293c 2f64 ; ROWS; ++i ).
    17\n+00007a20: 363c 2f73 7061 6e3e 2020 2020 2020 2020 6 \n+00007a30: 3c73 7061 6e20 636c 6173 733d 226b 6579 for( \n+00007a70: 696e 743c 2f73 7061 6e3e 206a 203d 2030 int j = 0\n+00007a80: 3b20 6a20 266c 743b 2043 4f4c 533b 202b ; j < COLS; +\n+00007a90: 2b6a 2029 3c2f 6469 763e 0a3c 6469 7620 +j )
    .
    177 \n+00007af0: 2020 2020 2020 2020 2041 545b 6a5d 5b69 AT[j][i\n+00007b00: 5d20 3d20 282a 3c73 7061 6e20 636c 6173 ] = (*this\n+00007b20: 3c2f 7370 616e 3e29 5b69 5d5b 6a5d 3b3c )[i][j];<\n+00007b30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00007b80: 3137 383c 2f73 7061 6e3e 2020 2020 2020 178 \n+00007b90: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n+00007bb0: 3c2f 7370 616e 3e20 4154 3b3c 2f64 6976 AT;.
    179<\n+00007c10: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    180 .
    1\n+00007cd0: 3832 3c2f 7370 616e 3e20 2020 203c 7370 82 template <cla\n+00007d20: 7373 3c2f 7370 616e 3e20 4f74 6865 7253 ss OtherS\n+00007d30: 6361 6c61 7226 6774 3b3c 2f64 6976 3e0a calar>
    .\n+00007d40: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
    .
    <\n+00007dd0: 6120 636c 6173 733d 226c 696e 6522 2068 a class=\"line\" h\n+00007de0: 7265 663d 2261 3031 3430 382e 6874 6d6c ref=\"a01408.html\n+00007df0: 2361 6536 3033 3366 3231 3764 3264 6531 #ae6033f217d2de1\n+00007e00: 6337 6330 6464 6431 3038 3435 3966 6638 c7c0ddd108459ff8\n+00007e10: 6163 223e 2020 3138 333c 2f61 3e3c 2f73 ac\"> 183 fr\n+00007e40: 6965 6e64 3c2f 7370 616e 3e20 3c73 7061 iend auto ope\n+00007ec0: 7261 746f 722b 203c 2f61 3e28 203c 7370 rator+ ( const \n+00007ef0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n+00007f20: 644d 6174 7269 783c 2f61 3e26 616d 703b dMatrix&\n+00007f30: 206d 6174 7269 7841 2c3c 2f64 6976 3e0a matrixA,
    .\n+00007f40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+00008040: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+000080a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 \n+00008190: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00008200: 6120 6964 3d22 6c30 3031 3838 2220 6e61 a id=\"l00188\" na\n+00008210: 6d65 3d22 6c30 3031 3838 223e 3c2f 613e me=\"l00188\">\n+00008220: 3c73 7061 6e20 636c 6173 733d 226c 696e 188 for (siz\n+000082c0: 655f 7479 7065 3c2f 613e 2069 203d 2030 e_type i = 0\n+000082d0: 3b20 6920 266c 743b 2052 4f57 533b 202b ; i < ROWS; +\n+000082e0: 2b69 293c 2f64 6976 3e0a 3c64 6976 2063 +i)
    .
    189 \n+00008340: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+00008360: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n+000083c0: 5f74 7970 653c 2f61 3e20 6a20 3d20 303b _type j = 0;\n+000083d0: 206a 2026 6c74 3b20 434f 4c53 3b20 2b2b j < COLS; ++\n+000083e0: 6a29 3c2f 6469 763e 0a3c 6469 7620 636c j)
    .
    190 \n+00008440: 2020 2020 2020 2072 6573 756c 745b 695d result[i]\n+00008450: 5b6a 5d20 3d20 6d61 7472 6978 415b 695d [j] = matrixA[i]\n+00008460: 5b6a 5d20 2b20 6d61 7472 6978 425b 695d [j] + matrixB[i]\n+00008470: 5b6a 5d3b 3c2f 6469 763e 0a3c 6469 7620 [j];
    .
    191 \n+000084d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00008520: 2031 3932 3c2f 7370 616e 3e20 2020 2020 192 \n+00008530: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n+00008550: 6e3c 2f73 7061 6e3e 2072 6573 756c 743b n result;\n+00008560: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000085b0: 2031 3933 3c2f 7370 616e 3e20 2020 207d 193 }\n+000085c0: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n+000085e0: 3c61 2069 643d 226c 3030 3139 3422 206e 194
    .
    196 \n+00008680: 2020 3c73 7061 6e20 636c 6173 733d 226b template\n+000086a0: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <class O\n+000086d0: 7468 6572 5363 616c 6172 2667 743b 3c2f therScalar>.
    .<\n+00008760: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00008770: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no\"> 197 friend\n+000087f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 auto operator- \n+00008870: 2820 3c73 7061 6e20 636c 6173 733d 226b ( const FieldMatrix\n+000088d0: 2661 6d70 3b20 6d61 7472 6978 412c 3c2f & matrixA,.
    1\n+00008930: 3938 3c2f 7370 616e 3e20 2020 2020 2020 98 \n+00008940: 2020 2020 2020 2020 2020 2020 2020 2020 \n+00008950: 2020 2020 203c 7370 616e 2063 6c61 7373 const\n+00008970: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 FieldMatrix&\n+000089b0: 6c74 3b4f 7468 6572 5363 616c 6172 2c52 lt;OtherScalar,R\n+000089c0: 4f57 532c 434f 4c53 2667 743b 3c2f 613e OWS,COLS>\n+000089d0: 2661 6d70 3b20 6d61 7472 6978 4229 3c2f & matrixB).
    1\n+00008a30: 3939 3c2f 7370 616e 3e20 2020 207b 3c2f 99 {.
    2\n+00008a90: 3030 3c2f 7370 616e 3e20 2020 2020 203c 00 <\n+00008aa0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00008ab0: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n+00008ac0: 3134 3038 2e68 746d 6c22 3e46 6965 6c64 1408.html\">Field\n+00008ad0: 4d61 7472 6978 266c 743b 7479 7065 6e61 Matrix<typena\n+00008ae0: 6d65 2050 726f 6d6f 7469 6f6e 5472 6169 me PromotionTrai\n+00008af0: 7473 266c 743b 4b2c 4f74 6865 7253 6361 ts<K,OtherSca\n+00008b00: 6c61 7226 6774 3b3a 3a50 726f 6d6f 7465 lar>::Promote\n+00008b10: 6454 7970 653c 2f61 3e2c 524f 5753 2c43 dType,ROWS,C\n+00008b20: 4f4c 5326 6774 3b20 7265 7375 6c74 3b3c OLS> result;<\n+00008b30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00008b80: 3230 313c 2f73 7061 6e3e 203c 2f64 6976 201 .
    202<\n+00008be0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> for\n+00008c10: 2028 3c61 2063 6c61 7373 3d22 636f 6465 (size_type \n+00008c70: 6920 3d20 303b 2069 2026 6c74 3b20 524f i = 0; i < RO\n+00008c80: 5753 3b20 2b2b 6929 3c2f 6469 763e 0a3c WS; ++i)
    .<\n+00008c90: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00008ca0: 3e3c 6120 6964 3d22 6c30 3032 3033 2220 > 203 for \n+00008d10: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type j\n+00008d70: 203d 2030 3b20 6a20 266c 743b 2043 4f4c = 0; j < COL\n+00008d80: 533b 202b 2b6a 293c 2f64 6976 3e0a 3c64 S; ++j)
    .\n+00008da0: 3c61 2069 643d 226c 3030 3230 3422 206e 204 resu\n+00008df0: 6c74 5b69 5d5b 6a5d 203d 206d 6174 7269 lt[i][j] = matri\n+00008e00: 7841 5b69 5d5b 6a5d 202d 206d 6174 7269 xA[i][j] - matri\n+00008e10: 7842 5b69 5d5b 6a5d 3b3c 2f64 6976 3e0a xB[i][j];
    .\n+00008e20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00008eb0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00008ec0: 6e6f 223e 2020 3230 363c 2f73 7061 6e3e no\"> 206\n+00008ed0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+00008ef0: 7265 7475 726e 3c2f 7370 616e 3e20 7265 return re\n+00008f00: 7375 6c74 3b3c 2f64 6976 3e0a 3c64 6976 sult;
    .<\n+00008f40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00008f50: 6e6f 223e 2020 3230 373c 2f73 7061 6e3e no\"> 207\n+00008f60: 2020 2020 7d3c 2f64 6976 3e0a 3c2f 6469 }
    ..
    208\n+00008fc0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+00008fd0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00008fe0: 3e3c 6120 6964 3d22 6c30 3032 3130 2220 > 210 tem\n+00009040: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n+00009050: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class Scalar,.
    211<\n+000090d0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> \n+000090e0: 2020 2020 7374 643a 3a65 6e61 626c 655f std::enable_\n+000090f0: 6966 5f74 266c 743b 4973 4e75 6d62 6572 if_t<IsNumber\n+00009100: 266c 743b 5363 616c 6172 2667 743b 3a3a <Scalar>::\n+00009110: 7661 6c75 652c 203c 7370 616e 2063 6c61 value, int> \n+00009140: 3d20 3026 6774 3b3c 2f64 6976 3e0a 3c64 = 0>
    ..
    212 frie\n+00009250: 6e64 3c2f 7370 616e 3e20 3c73 7061 6e20 nd \n+00009270: 6175 746f 3c2f 7370 616e 3e20 3c61 2063 auto opera\n+000092d0: 746f 722a 203c 2f61 3e28 203c 7370 616e tor* ( const FieldM\n+00009330: 6174 7269 783c 2f61 3e26 616d 703b 206d atrix& m\n+00009340: 6174 7269 782c 2053 6361 6c61 7220 7363 atrix, Scalar sc\n+00009350: 616c 6172 293c 2f64 6976 3e0a 3c64 6976 alar)
    .<\n+00009390: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000093a0: 6e6f 223e 2020 3231 333c 2f73 7061 6e3e no\"> 213
    \n+000093b0: 2020 2020 7b3c 2f64 6976 3e0a 3c64 6976 {
    .<\n+000093f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00009400: 6e6f 223e 2020 3231 343c 2f73 7061 6e3e no\"> 214\n+00009410: 2020 2020 2020 3c61 2063 6c61 7373 3d22 FieldMatrix<\n+00009450: 3b74 7970 656e 616d 6520 5072 6f6d 6f74 ;typename Promot\n+00009460: 696f 6e54 7261 6974 7326 6c74 3b4b 2c53 ionTraits<K,S\n+00009470: 6361 6c61 7226 6774 3b3a 3a50 726f 6d6f calar>::Promo\n+00009480: 7465 6454 7970 653c 2f61 3e2c 524f 5753 tedType,ROWS\n+00009490: 2c43 4f4c 5326 6774 3b20 7265 7375 6c74 ,COLS> result\n+000094a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+000094f0: 2020 3231 353c 2f73 7061 6e3e 203c 2f64 215 .
    21\n+00009550: 363c 2f73 7061 6e3e 2020 2020 2020 3c73 6 for (size_type i = 0; i < \n+000095f0: 524f 5753 3b20 2b2b 6929 3c2f 6469 763e ROWS; ++i)
    \n+00009600: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00009630: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 217 for (size_type\n+000096e0: 206a 203d 2030 3b20 6a20 266c 743b 2043 j = 0; j < C\n+000096f0: 4f4c 533b 202b 2b6a 293c 2f64 6976 3e0a OLS; ++j)
    .\n+00009700: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    219 <\n+000097e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00009830: 3232 303c 2f73 7061 6e3e 2020 2020 2020 220 \n+00009840: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n+00009860: 3c2f 7370 616e 3e20 7265 7375 6c74 3b3c result;<\n+00009870: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+000098c0: 3232 313c 2f73 7061 6e3e 2020 2020 7d3c 221 }<\n+000098d0: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
    .<\n+000098f0: 6120 6964 3d22 6c30 3032 3232 2220 6e61 a id=\"l00222\" na\n+00009900: 6d65 3d22 6c30 3032 3232 223e 3c2f 613e me=\"l00222\">\n+00009910: 3c73 7061 6e20 636c 6173 733d 226c 696e 222
    .
    224 \n+00009990: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n+000099b0: 2f73 7061 6e3e 2026 6c74 3b3c 7370 616e /span> <class Sc\n+000099e0: 616c 6172 2c3c 2f64 6976 3e0a 3c64 6976 alar,
    .<\n+00009a20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00009a30: 6e6f 223e 2020 3232 353c 2f73 7061 6e3e no\"> 225\n+00009a40: 2020 2020 2020 2020 2020 2020 2020 7374 st\n+00009a50: 643a 3a65 6e61 626c 655f 6966 5f74 266c d::enable_if_t&l\n+00009a60: 743b 4973 4e75 6d62 6572 266c 743b 5363 t;IsNumber<Sc\n+00009a70: 616c 6172 2667 743b 3a3a 7661 6c75 652c alar>::value,\n+00009a80: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int> = 0>\n+00009ab0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    .<\n+00009b00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00009b10: 3e3c 6120 6964 3d22 6c30 3032 3236 2220 > 22\n+00009b90: 363c 2f61 3e3c 2f73 7061 6e3e 2020 2020 6 \n+00009ba0: 3c73 7061 6e20 636c 6173 733d 226b 6579 friend auto operator* <\n+00009c40: 2f61 3e28 2053 6361 6c61 7220 7363 616c /a>( Scalar scal\n+00009c50: 6172 2c20 3c73 7061 6e20 636c 6173 733d ar, const<\n+00009c70: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldMatrix& matrix)<\n+00009cc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00009d10: 3232 373c 2f73 7061 6e3e 2020 2020 7b3c 227 {<\n+00009d20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00009d70: 3232 383c 2f73 7061 6e3e 2020 2020 2020 228 \n+00009d80: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n+00009db0: 644d 6174 7269 7826 6c74 3b74 7970 656e dMatrix<typen\n+00009dc0: 616d 6520 5072 6f6d 6f74 696f 6e54 7261 ame PromotionTra\n+00009dd0: 6974 7326 6c74 3b4b 2c53 6361 6c61 7226 its<K,Scalar&\n+00009de0: 6774 3b3a 3a50 726f 6d6f 7465 6454 7970 gt;::PromotedTyp\n+00009df0: 653c 2f61 3e2c 524f 5753 2c43 4f4c 5326 e,ROWS,COLS&\n+00009e00: 6774 3b20 7265 7375 6c74 3b3c 2f64 6976 gt; result;.
    229<\n+00009e60: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n+00009e80: 3c61 2069 643d 226c 3030 3233 3022 206e 230 for (si\n+00009f40: 7a65 5f74 7970 653c 2f61 3e20 6920 3d20 ze_type i = \n+00009f50: 303b 2069 2026 6c74 3b20 524f 5753 3b20 0; i < ROWS; \n+00009f60: 2b2b 6929 3c2f 6469 763e 0a3c 6469 7620 ++i)
    .
    231 \n+00009fc0: 2020 2020 2020 203c 7370 616e 2063 6c61 for (siz\n+0000a040: 655f 7479 7065 3c2f 613e 206a 203d 2030 e_type j = 0\n+0000a050: 3b20 6a20 266c 743b 2043 4f4c 533b 202b ; j < COLS; +\n+0000a060: 2b6a 293c 2f64 6976 3e0a 3c64 6976 2063 +j)
    .
    232 \n+0000a0c0: 2020 2020 2020 2020 7265 7375 6c74 5b69 result[i\n+0000a0d0: 5d5b 6a5d 203d 2073 6361 6c61 7220 2a20 ][j] = scalar * \n+0000a0e0: 6d61 7472 6978 5b69 5d5b 6a5d 3b3c 2f64 matrix[i][j];.
    23\n+0000a140: 333c 2f73 7061 6e3e 203c 2f64 6976 3e0a 3
    .\n+0000a150: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+0000a1e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+0000a240: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0000a290: 2032 3336 3c2f 7370 616e 3e20 3c2f 6469 236 .
    238\n+0000a2f0: 3c2f 7370 616e 3e20 2020 203c 7370 616e template\n+0000a320: 2026 6c74 3b3c 7370 616e 2063 6c61 7373 <class\n+0000a340: 203c 2f73 7061 6e3e 5363 616c 6172 2c3c Scalar,<\n+0000a350: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000a3a0: 3233 393c 2f73 7061 6e3e 2020 2020 2020 239 \n+0000a3b0: 2020 2020 2020 2020 7374 643a 3a65 6e61 std::ena\n+0000a3c0: 626c 655f 6966 5f74 266c 743b 4973 4e75 ble_if_t<IsNu\n+0000a3d0: 6d62 6572 266c 743b 5363 616c 6172 2667 mber<Scalar&g\n+0000a3e0: 743b 3a3a 7661 6c75 652c 203c 7370 616e t;::value, int&\n+0000a410: 6774 3b20 3d20 3026 6774 3b3c 2f64 6976 gt; = 0>.
    .
    240<\n+0000a500: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+0000a520: 6672 6965 6e64 3c2f 7370 616e 3e20 3c73 friend auto \n+0000a550: 3c61 2063 6c61 7373 3d22 636f 6465 2068 o\n+0000a5a0: 7065 7261 746f 722f 203c 2f61 3e28 203c perator/ ( <\n+0000a5b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000a5c0: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const Fi\n+0000a600: 656c 644d 6174 7269 783c 2f61 3e26 616d eldMatrix&am\n+0000a610: 703b 206d 6174 7269 782c 2053 6361 6c61 p; matrix, Scala\n+0000a620: 7220 7363 616c 6172 293c 2f64 6976 3e0a r scalar)
    .\n+0000a630: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+0000a690: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+0000a7b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0000a7c0: 6e6f 223e 2020 3234 333c 2f73 7061 6e3e no\"> 243\n+0000a7d0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+0000a820: 2020 3234 343c 2f73 7061 6e3e 2020 2020 244 \n+0000a830: 2020 3c73 7061 6e20 636c 6173 733d 226b for<\n+0000a850: 2f73 7061 6e3e 2028 3c61 2063 6c61 7373 /span> (size_typ\n+0000a8b0: 653c 2f61 3e20 6920 3d20 303b 2069 2026 e i = 0; i &\n+0000a8c0: 6c74 3b20 524f 5753 3b20 2b2b 6929 3c2f lt; ROWS; ++i).
    2\n+0000a920: 3435 3c2f 7370 616e 3e20 2020 2020 2020 45 \n+0000a930: 203c 7370 616e 2063 6c61 7373 3d22 6b65 for (size_type\n+0000a9b0: 3c2f 613e 206a 203d 2030 3b20 6a20 266c j = 0; j &l\n+0000a9c0: 743b 2043 4f4c 533b 202b 2b6a 293c 2f64 t; COLS; ++j).
    24\n+0000aa20: 363c 2f73 7061 6e3e 2020 2020 2020 2020 6 \n+0000aa30: 2020 7265 7375 6c74 5b69 5d5b 6a5d 203d result[i][j] =\n+0000aa40: 206d 6174 7269 785b 695d 5b6a 5d20 2f20 matrix[i][j] / \n+0000aa50: 7363 616c 6172 3b3c 2f64 6976 3e0a 3c64 scalar;
    .\n+0000aa70: 3c61 2069 643d 226c 3030 3234 3722 206e 247
    .
    248 \n+0000ab10: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n+0000ab30: 7475 726e 3c2f 7370 616e 3e20 7265 7375 turn resu\n+0000ab40: 6c74 3b3c 2f64 6976 3e0a 3c64 6976 2063 lt;
    .
    249 \n+0000aba0: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
    .
    \n+0000abb0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+0000ac20: 6120 6964 3d22 6c30 3032 3533 2220 6e61 a id=\"l00253\" na\n+0000ac30: 6d65 3d22 6c30 3032 3533 223e 3c2f 613e me=\"l00253\">\n+0000ac40: 3c73 7061 6e20 636c 6173 733d 226c 696e 253 templ\n+0000ac80: 6174 653c 2f73 7061 6e3e 2026 6c74 3b3c ate <<\n+0000ac90: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000aca0: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord\">class OtherScalar, <\n+0000acc0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000acd0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype\">int otherCols>\n+0000acf0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    ..
    \n+0000af40: 2020 3235 353c 2f73 7061 6e3e 2020 2020 255 \n+0000af50: 2020 2020 2020 2020 2020 2020 2020 2020 \n+0000af60: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n+0000af80: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst FieldMatr\n+0000afc0: 6978 266c 743b 4f74 6865 7253 6361 6c61 ix<OtherScala\n+0000afd0: 722c 2043 4f4c 532c 206f 7468 6572 436f r, COLS, otherCo\n+0000afe0: 6c73 2667 743b 3c2f 613e 2661 6d70 3b20 ls>& \n+0000aff0: 6d61 7472 6978 4229 3c2f 6469 763e 0a3c matrixB)
    .<\n+0000b000: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0000b010: 3e3c 6120 6964 3d22 6c30 3032 3536 2220 > 256 {
    .<\n+0000b060: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0000b070: 3e3c 6120 6964 3d22 6c30 3032 3537 2220 > 257 FieldMatrix\n+0000b0f0: 266c 743b 7479 7065 6e61 6d65 2050 726f <typename Pro\n+0000b100: 6d6f 7469 6f6e 5472 6169 7473 266c 743b motionTraits<\n+0000b110: 4b2c 4f74 6865 7253 6361 6c61 7226 6774 K,OtherScalar>\n+0000b120: 3b3a 3a50 726f 6d6f 7465 6454 7970 653c ;::PromotedType<\n+0000b130: 2f61 3e2c 524f 5753 2c6f 7468 6572 436f /a>,ROWS,otherCo\n+0000b140: 6c73 2667 743b 2072 6573 756c 743b 3c2f ls> result;.
    2\n+0000b1a0: 3538 3c2f 7370 616e 3e20 3c2f 6469 763e 58
    \n+0000b1b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000b1e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 259 for \n+0000b230: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type i\n+0000b290: 203d 2030 3b20 6920 266c 743b 206d 6174 = 0; i < mat\n+0000b2a0: 7269 7841 2e3c 6120 636c 6173 733d 2263 rixA.mat_rows(); ++i)
    \n+0000b310: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000b340: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 260 for (size_type\n+0000b3f0: 206a 203d 2030 3b20 6a20 266c 743b 206d j = 0; j < m\n+0000b400: 6174 7269 7842 2e3c 6120 636c 6173 733d atrixB.mat_cols\n+0000b460: 3c2f 613e 2829 3b20 2b2b 6a29 3c2f 6469 (); ++j).
    261\n+0000b4c0: 3c2f 7370 616e 3e20 2020 2020 2020 207b {\n+0000b4d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0000b520: 2032 3632 3c2f 7370 616e 3e20 2020 2020 262 \n+0000b530: 2020 2020 2072 6573 756c 745b 695d 5b6a result[i][j\n+0000b540: 5d20 3d20 303b 3c2f 6469 763e 0a3c 6469 ] = 0;
    .<\n+0000b560: 6120 6964 3d22 6c30 3032 3633 2220 6e61 a id=\"l00263\" na\n+0000b570: 6d65 3d22 6c30 3032 3633 223e 3c2f 613e me=\"l00263\">\n+0000b580: 3c73 7061 6e20 636c 6173 733d 226c 696e 263 for \n+0000b5d0: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type k\n+0000b630: 203d 2030 3b20 6b20 266c 743b 206d 6174 = 0; k < mat\n+0000b640: 7269 7841 2e3c 6120 636c 6173 733d 2263 rixA.mat_cols(); ++k)
    \n+0000b6b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000b6e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 264 \n+0000b710: 2072 6573 756c 745b 695d 5b6a 5d20 2b3d result[i][j] +=\n+0000b720: 206d 6174 7269 7841 5b69 5d5b 6b5d 202a matrixA[i][k] *\n+0000b730: 206d 6174 7269 7842 5b6b 5d5b 6a5d 3b3c matrixB[k][j];<\n+0000b740: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000b790: 3236 353c 2f73 7061 6e3e 2020 2020 2020 265 \n+0000b7a0: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    266 <\n+0000b800: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000b850: 3236 373c 2f73 7061 6e3e 2020 2020 2020 267 \n+0000b860: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n+0000b880: 3c2f 7370 616e 3e20 7265 7375 6c74 3b3c result;<\n+0000b890: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000b8e0: 3236 383c 2f73 7061 6e3e 2020 2020 7d3c 268 }<\n+0000b8f0: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
    .<\n+0000b910: 6120 6964 3d22 6c30 3032 3639 2220 6e61 a id=\"l00269\" na\n+0000b920: 6d65 3d22 6c30 3032 3639 223e 3c2f 613e me=\"l00269\">\n+0000b930: 3c73 7061 6e20 636c 6173 733d 226c 696e 269
    .
    276 \n+0000b9b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n+0000b9d0: 2f73 7061 6e3e 2026 6c74 3b3c 7370 616e /span> <class Ot\n+0000ba00: 6865 724d 6174 7269 782c 2073 7464 3a3a herMatrix, std::\n+0000ba10: 656e 6162 6c65 5f69 665f 7426 6c74 3b3c enable_if_t<<\n+0000ba20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000ba70: 3237 373c 2f73 7061 6e3e 2020 2020 2020 277 \n+0000ba80: 496d 706c 3a3a 4973 5374 6174 6963 5369 Impl::IsStaticSi\n+0000ba90: 7a65 4d61 7472 6978 5f76 266c 743b 4f74 zeMatrix_v<Ot\n+0000baa0: 6865 724d 6174 7269 7826 6774 3b3c 2f64 herMatrix>.
    27\n+0000bb00: 383c 2f73 7061 6e3e 2020 2020 2020 616e 8 an\n+0000bb10: 6420 6e6f 7420 496d 706c 3a3a 4973 4669 d not Impl::IsFi\n+0000bb20: 656c 644d 6174 7269 785f 7626 6c74 3b4f eldMatrix_v<O\n+0000bb30: 7468 6572 4d61 7472 6978 2667 743b 3c2f therMatrix>.
    2\n+0000bb90: 3739 3c2f 7370 616e 3e20 2020 2020 202c 79 ,\n+0000bba0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int> = 0>\n+0000bbd0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    ..
    \n+0000be20: 2020 3238 313c 2f73 7061 6e3e 2020 2020 281 \n+0000be30: 2020 2020 2020 2020 2020 2020 2020 2020 \n+0000be40: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n+0000be60: 6e73 743c 2f73 7061 6e3e 204f 7468 6572 nst Other\n+0000be70: 4d61 7472 6978 2661 6d70 3b20 6d61 7472 Matrix& matr\n+0000be80: 6978 4229 3c2f 6469 763e 0a3c 6469 7620 ixB)
    .
    282 \n+0000bee0: 2020 207b 3c2f 6469 763e 0a3c 6469 7620 {
    .
    283 \n+0000bf40: 2020 2020 203c 7370 616e 2063 6c61 7373 using\n+0000bf60: 203c 2f73 7061 6e3e 4669 656c 6420 3d20 Field = \n+0000bf70: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename PromotionT\n+0000bff0: 7261 6974 7326 6c74 3b4b 2c20 7479 7065 raits<K, type\n+0000c000: 6e61 6d65 204f 7468 6572 4d61 7472 6978 name OtherMatrix\n+0000c010: 3a3a 6669 656c 645f 7479 7065 2667 743b ::field_type>\n+0000c020: 3a3a 5072 6f6d 6f74 6564 5479 7065 3c2f ::PromotedType;
    ..
    285 \n+0000c160: 2020 2020 3c73 7061 6e20 636c 6173 733d fo\n+0000c180: 723c 2f73 7061 6e3e 2028 7374 643a 3a73 r (std::s\n+0000c190: 697a 655f 7420 6a3d 303b 206a 266c 743b ize_t j=0; j<\n+0000c1a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 rows; ++j)<\n+0000c200: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000c250: 3238 363c 2f73 7061 6e3e 2020 2020 2020 286 \n+0000c260: 2020 6d61 7472 6978 422e 3c61 2063 6c61 matrixB.mtv(matrixA[j], r\n+0000c2d0: 6573 756c 745b 6a5d 293b 3c2f 6469 763e esult[j]);
    \n+0000c2e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+0000c370: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+0000c3d0: 0a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
    .
    \n+0000c420: 2020 3238 393c 2f73 7061 6e3e 203c 2f64 289 .
    29\n+0000c480: 363c 2f73 7061 6e3e 2020 2020 3c73 7061 6 template <clas\n+0000c4d0: 7320 3c2f 7370 616e 3e4f 7468 6572 4d61 s OtherMa\n+0000c4e0: 7472 6978 2c20 7374 643a 3a65 6e61 626c trix, std::enabl\n+0000c4f0: 655f 6966 5f74 266c 743b 3c2f 6469 763e e_if_t<
    \n+0000c500: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000c530: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 297 Impl:\n+0000c560: 3a49 7353 7461 7469 6353 697a 654d 6174 :IsStaticSizeMat\n+0000c570: 7269 785f 7626 6c74 3b4f 7468 6572 4d61 rix_v<OtherMa\n+0000c580: 7472 6978 2667 743b 3c2f 6469 763e 0a3c trix>
    .<\n+0000c590: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0000c5a0: 3e3c 6120 6964 3d22 6c30 3032 3938 2220 > 298 and not\n+0000c5f0: 2049 6d70 6c3a 3a49 7346 6965 6c64 4d61 Impl::IsFieldMa\n+0000c600: 7472 6978 5f76 266c 743b 4f74 6865 724d trix_v<OtherM\n+0000c610: 6174 7269 7826 6774 3b3c 2f64 6976 3e0a atrix>
    .\n+0000c620: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+0000c650: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 299 , int\n+0000c6a0: 2667 743b 203d 2030 2667 743b 3c2f 6469 > = 0>.
    .
    300\n+0000c790: 3c2f 7370 616e 3e20 2020 203c 7370 616e friend <\n+0000c7c0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000c7d0: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord\">auto\n+0000c7e0: 203c 6120 636c 6173 733d 2263 6f64 6520 \n+0000c830: 6f70 6572 6174 6f72 2a20 3c2f 613e 2820 operator* ( \n+0000c840: 3c73 7061 6e20 636c 6173 733d 226b 6579 const OtherMatrix&a\n+0000c870: 6d70 3b20 6d61 7472 6978 412c 3c2f 6469 mp; matrixA,.
    301\n+0000c8d0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 \n+0000c8e0: 2020 2020 2020 2020 2020 2020 2020 2020 \n+0000c8f0: 2020 203c 7370 616e 2063 6c61 7373 3d22 const FieldMatrix& matrixB)<\n+0000c960: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000c9b0: 3330 323c 2f73 7061 6e3e 2020 2020 7b3c 302 {<\n+0000c9c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000ca10: 3330 333c 2f73 7061 6e3e 2020 2020 2020 303 \n+0000ca20: 3c73 7061 6e20 636c 6173 733d 226b 6579 using Field = typename\n+0000ca70: 203c 6120 636c 6173 733d 2263 6f64 6520 PromotionTraits\n+0000cad0: 266c 743b 4b2c 2074 7970 656e 616d 6520 <K, typename \n+0000cae0: 4f74 6865 724d 6174 7269 783a 3a66 6965 OtherMatrix::fie\n+0000caf0: 6c64 5f74 7970 6526 6774 3b3a 3a50 726f ld_type>::Pro\n+0000cb00: 6d6f 7465 6454 7970 653c 2f61 3e3b 3c2f motedType;.
    3\n+0000cb60: 3034 3c2f 7370 616e 3e20 2020 2020 203c 04 <\n+0000cb70: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+0000cb80: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n+0000cb90: 3134 3038 2e68 746d 6c22 3e44 756e 653a 1408.html\">Dune:\n+0000cba0: 3a46 6965 6c64 4d61 7472 6978 266c 743b :FieldMatrix<\n+0000cbb0: 4669 656c 642c 204f 7468 6572 4d61 7472 Field, OtherMatr\n+0000cbc0: 6978 3a3a 726f 7773 2c20 636f 6c73 2667 ix::rows, cols&g\n+0000cbd0: 743b 3c2f 613e 2072 6573 756c 743b 3c2f t; result;.
    3\n+0000cc30: 3035 3c2f 7370 616e 3e20 2020 2020 203c 05 <\n+0000cc40: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000cc50: 6f72 6466 6c6f 7722 3e66 6f72 3c2f 7370 ordflow\">for (std::size_t\n+0000cc70: 206a 3d30 3b20 6a26 6c74 3b3c 6120 636c j=0; j<cols\n+0000ccd0: 3c2f 613e 3b20 2b2b 6a29 3c2f 6469 763e ; ++j)
    \n+0000cce0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000cd10: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 306 {.
    307\n+0000cd90: 3c2f 7370 616e 3e20 2020 2020 2020 203c <\n+0000cda0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000cdb0: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord\">auto\n+0000cdc0: 2042 5f6a 203d 2049 6d70 6c3a 3a43 6f6c B_j = Impl::Col\n+0000cdd0: 756d 6e56 6563 746f 7256 6965 7728 6d61 umnVectorView(ma\n+0000cde0: 7472 6978 422c 206a 293b 3c2f 6469 763e trixB, j);
    \n+0000cdf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000ce20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 308 auto r\n+0000ce70: 6573 756c 745f 6a20 3d20 496d 706c 3a3a esult_j = Impl::\n+0000ce80: 436f 6c75 6d6e 5665 6374 6f72 5669 6577 ColumnVectorView\n+0000ce90: 2872 6573 756c 742c 206a 293b 3c2f 6469 (result, j);.
    309\n+0000cef0: 3c2f 7370 616e 3e20 2020 2020 2020 206d m\n+0000cf00: 6174 7269 7841 2e6d 7628 425f 6a2c 2072 atrixA.mv(B_j, r\n+0000cf10: 6573 756c 745f 6a29 3b3c 2f64 6976 3e0a esult_j);
    .\n+0000cf20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+0000cf50: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 310 }.
    311<\n+0000cfd0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return result;.
    312<\n+0000d060: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    313 .
    3\n+0000d120: 3135 3c2f 7370 616e 3e20 2020 203c 7370 15 template<\n+0000d170: 696e 743c 2f73 7061 6e3e 206c 2667 743b int l>\n+0000d180: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    .<\n+0000d1e0: 6120 6964 3d22 6c30 3033 3136 2220 6e61 a id=\"l00316\" na\n+0000d1f0: 6d65 3d22 6c30 3033 3136 223e 3c2f 613e me=\"l00316\">\n+0000d200: 3c73 7061 6e20 636c 6173 733d 226c 696e 316<\n+0000d260: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c61 /a> FieldM\n+0000d2a0: 6174 7269 7826 6c74 3b4b 2c6c 2c63 6f6c atrix<K,l,col\n+0000d2b0: 7326 6774 3b3c 2f61 3e20 3c61 2063 6c61 s> leftm\n+0000d310: 756c 7469 706c 7961 6e79 3c2f 613e 2028 ultiplyany (\n+0000d320: 3c73 7061 6e20 636c 6173 733d 226b 6579 const F\n+0000d370: 6965 6c64 4d61 7472 6978 266c 743b 4b2c ieldMatrix<K,\n+0000d380: 6c2c 726f 7773 2667 743b 3c2f 613e 2661 l,rows>&a\n+0000d390: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; M) const.
    3\n+0000d460: 3137 3c2f 7370 616e 3e3c 7370 616e 2063 17 \n+0000d480: 2020 203c 2f73 7061 6e3e 7b3c 2f64 6976 {.\n+0000d540: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+0000d5b0: 6120 6964 3d22 6c30 3033 3230 2220 6e61 a id=\"l00320\" na\n+0000d5c0: 6d65 3d22 6c30 3033 3230 223e 3c2f 613e me=\"l00320\">\n+0000d5d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 320 for (siz\n+0000d670: 655f 7479 7065 3c2f 613e 2069 3d30 3b20 e_type i=0; \n+0000d680: 6926 6c74 3b6c 3b20 692b 2b29 207b 3c2f i<l; i++) {.
    3\n+0000d6e0: 3231 3c2f 7370 616e 3e20 2020 2020 2020 21 \n+0000d6f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 for (size_type\n+0000d770: 3c2f 613e 206a 3d30 3b20 6a26 6c74 3b3c j=0; j<<\n+0000d780: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+0000d790: 5f76 6172 6961 626c 6522 2068 7265 663d _variable\" href=\n+0000d7a0: 2261 3031 3430 382e 6874 6d6c 2361 6332 \"a01408.html#ac2\n+0000d7b0: 3831 3666 3164 3036 3766 3533 3333 3636 816f1d067f533366\n+0000d7c0: 3239 3763 3035 3366 3037 3039 3962 223e 297c053f07099b\">\n+0000d7d0: 636f 6c73 3c2f 613e 3b20 6a2b 2b29 207b cols; j++) {\n+0000d7e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0000d830: 2033 3232 3c2f 7370 616e 3e20 2020 2020 322 \n+0000d840: 2020 2020 2043 5b69 5d5b 6a5d 203d 2030 C[i][j] = 0\n+0000d850: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+0000d8a0: 2020 3332 333c 2f73 7061 6e3e 2020 2020 323 \n+0000d8b0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+0000d8d0: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n+0000d930: 5f74 7970 653c 2f61 3e20 6b3d 303b 206b _type k=0; k\n+0000d940: 266c 743b 3c61 2063 6c61 7373 3d22 636f <rows; k\n+0000d9a0: 2b2b 293c 2f64 6976 3e0a 3c64 6976 2063 ++)
    .
    324 \n+0000da00: 2020 2020 2020 2020 2020 435b 695d 5b6a C[i][j\n+0000da10: 5d20 2b3d 203c 6120 636c 6173 733d 2263 ] += M[i][k\n+0000da70: 5d2a 282a 3c73 7061 6e20 636c 6173 733d ]*(*this)[k][j];.
    32\n+0000daf0: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 \n+0000db00: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
    .
    \n+0000db50: 2020 3332 363c 2f73 7061 6e3e 2020 2020 326 \n+0000db60: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    327 \n+0000dbc0: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n+0000dbe0: 7475 726e 3c2f 7370 616e 3e20 433b 3c2f turn C;.
    3\n+0000dc40: 3238 3c2f 7370 616e 3e20 2020 207d 3c2f 28 }.
    .<\n+0000dc90: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0000dca0: 6e6f 223e 2020 3332 393c 2f73 7061 6e3e no\"> 329\n+0000dcb0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+0000dd00: 2020 3333 303c 2f73 7061 6e3e 2020 2020 330 \n+0000dd10: 3c73 7061 6e20 636c 6173 733d 226b 6579 using Base::rightm\n+0000dd90: 756c 7469 706c 793c 2f61 3e3b 3c2f 6469 ultiply;.
    331\n+0000ddf0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+0000de00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0000de10: 3e3c 6120 6964 3d22 6c30 3033 3333 2220 > 333 tem\n+0000de70: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n+0000de80: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;int r, int c&\n+0000ded0: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    .\n+0000df20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+0000df50: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 3\n+0000dfb0: 3334 3c2f 613e 3c2f 7370 616e 3e20 2020 34 \n+0000dfc0: 203c 6120 636c 6173 733d 2263 6f64 6520 Fie\n+0000dff0: 6c64 4d61 7472 6978 3c2f 613e 2661 6d70 ldMatrix&\n+0000e000: 3b20 3c61 2063 6c61 7373 3d22 636f 6465 ; rightmultiply\n+0000e060: 3c2f 613e 2028 3c73 7061 6e20 636c 6173 (cons\n+0000e080: 743c 2f73 7061 6e3e 203c 6120 636c 6173 t FieldMatrix\n+0000e0c0: 266c 743b 4b2c 722c 6326 6774 3b3c 2f61 <K,r,c>& M).
    3\n+0000e180: 3335 3c2f 7370 616e 3e20 2020 207b 3c2f 35 {.
    3\n+0000e1e0: 3336 3c2f 7370 616e 3e20 2020 2020 203c 36 <\n+0000e1f0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000e200: 6f72 6422 3e73 7461 7469 635f 6173 7365 ord\">static_asse\n+0000e210: 7274 3c2f 7370 616e 3e28 7220 3d3d 2063 rt(r == c\n+0000e220: 2c20 3c73 7061 6e20 636c 6173 733d 2273 , &q\n+0000e240: 756f 743b 4361 6e6e 6f74 2072 6967 6874 uot;Cannot right\n+0000e250: 6d75 6c74 6970 6c79 2077 6974 6820 6e6f multiply with no\n+0000e260: 6e2d 7371 7561 7265 206d 6174 7269 7826 n-square matrix&\n+0000e270: 7175 6f74 3b3c 2f73 7061 6e3e 293b 3c2f quot;);.
    3\n+0000e2d0: 3337 3c2f 7370 616e 3e20 2020 2020 203c 37 <\n+0000e2e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000e2f0: 6f72 6422 3e73 7461 7469 635f 6173 7365 ord\">static_asse\n+0000e300: 7274 3c2f 7370 616e 3e28 7220 3d3d 203c rt(r == <\n+0000e310: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+0000e320: 5f76 6172 6961 626c 6522 2068 7265 663d _variable\" href=\n+0000e330: 2261 3031 3430 382e 6874 6d6c 2361 6332 \"a01408.html#ac2\n+0000e340: 3831 3666 3164 3036 3766 3533 3333 3636 816f1d067f533366\n+0000e350: 3239 3763 3035 3366 3037 3039 3962 223e 297c053f07099b\">\n+0000e360: 636f 6c73 3c2f 613e 2c20 3c73 7061 6e20 cols, "Size\n+0000e390: 206d 6973 6d61 7463 6826 7175 6f74 3b3c mismatch"<\n+0000e3a0: 2f73 7061 6e3e 293b 3c2f 6469 763e 0a3c /span>);
    .<\n+0000e3b0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0000e3c0: 3e3c 6120 6964 3d22 6c30 3033 3338 2220 > 338 FieldMatrix\n+0000e440: 266c 743b 4b2c 726f 7773 2c63 6f6c 7326 <K,rows,cols&\n+0000e450: 6774 3b3c 2f61 3e20 4328 2a3c 7370 616e gt; C(*this);.
    3\n+0000e4d0: 3339 3c2f 7370 616e 3e20 3c2f 6469 763e 39
    \n+0000e4e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000e510: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 340 for \n+0000e560: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type i\n+0000e5c0: 3d30 3b20 6926 6c74 3b3c 6120 636c 6173 =0; i<rows; i++)
    .<\n+0000e630: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0000e640: 3e3c 6120 6964 3d22 6c30 3033 3431 2220 > 341 for \n+0000e6b0: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type j\n+0000e710: 3d30 3b20 6a26 6c74 3b3c 6120 636c 6173 =0; j<cols; j++) {
    \n+0000e780: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000e7b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 342 (\n+0000e7e0: 2a74 6869 7329 5b69 5d5b 6a5d 203d 2030 *this)[i][j] = 0\n+0000e7f0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+0000e840: 2020 3334 333c 2f73 7061 6e3e 2020 2020 343 \n+0000e850: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+0000e870: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n+0000e8d0: 5f74 7970 653c 2f61 3e20 6b3d 303b 206b _type k=0; k\n+0000e8e0: 266c 743b 3c61 2063 6c61 7373 3d22 636f <cols; k\n+0000e940: 2b2b 293c 2f64 6976 3e0a 3c64 6976 2063 ++)
    .
    344 \n+0000e9a0: 2020 2020 2020 2020 2020 282a 3c73 7061 (*this)[i\n+0000e9d0: 5d5b 6a5d 202b 3d20 435b 695d 5b6b 5d2a ][j] += C[i][k]*\n+0000e9e0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 M[k][j];.
    34\n+0000ea90: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 \n+0000eaa0: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
    .
    \n+0000eaf0: 2020 3334 363c 2f73 7061 6e3e 2020 2020 346 \n+0000eb00: 2020 3c73 7061 6e20 636c 6173 733d 226b retu\n+0000eb20: 726e 3c2f 7370 616e 3e20 2a3c 7370 616e rn *this;.
    34\n+0000eba0: 373c 2f73 7061 6e3e 2020 2020 7d3c 2f64 7 }.
    .
    348 \n+0000ec10: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0000ec60: 2033 3530 3c2f 7370 616e 3e20 2020 203c 350 <\n+0000ec70: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0000ec80: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord\">template<int l&g\n+0000ecc0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    ..
    \n+0000efa0: 2020 3335 323c 2f73 7061 6e3e 3c73 7061 352 {.
    3\n+0000f020: 3533 3c2f 7370 616e 3e20 2020 2020 203c 53 <\n+0000f030: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+0000f040: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n+0000f050: 3134 3038 2e68 746d 6c22 3e46 6965 6c64 1408.html\">Field\n+0000f060: 4d61 7472 6978 266c 743b 4b2c 726f 7773 Matrix<K,rows\n+0000f070: 2c6c 2667 743b 3c2f 613e 2043 3b3c 2f64 ,l> C;.
    35\n+0000f0d0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n+0000f0e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+0000f230: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+0000f260: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 356 for\n+0000f2b0: 2028 3c61 2063 6c61 7373 3d22 636f 6465 (size_type \n+0000f310: 6a3d 303b 206a 266c 743b 6c3b 206a 2b2b j=0; j<l; j++\n+0000f320: 2920 7b3c 2f64 6976 3e0a 3c64 6976 2063 ) {
    .
    357 \n+0000f380: 2020 2020 2020 2020 435b 695d 5b6a 5d20 C[i][j] \n+0000f390: 3d20 303b 3c2f 6469 763e 0a3c 6469 7620 = 0;
    .
    358 \n+0000f3f0: 2020 2020 2020 2020 203c 7370 616e 2063 for (<\n+0000f420: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+0000f430: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef\" href=\"\n+0000f440: 6130 3134 3038 2e68 746d 6c23 6133 3966 a01408.html#a39f\n+0000f450: 3061 6561 3935 3264 3061 3130 6362 6335 0aea952d0a10cbc5\n+0000f460: 6263 6135 3863 3465 3939 3266 3122 3e73 bca58c4e992f1\">s\n+0000f470: 697a 655f 7479 7065 3c2f 613e 206b 3d30 ize_type k=0\n+0000f480: 3b20 6b26 6c74 3b3c 6120 636c 6173 733d ; k<cols\n+0000f4e0: 3b20 6b2b 2b29 3c2f 6469 763e 0a3c 6469 ; k++)
    .<\n+0000f500: 6120 6964 3d22 6c30 3033 3539 2220 6e61 a id=\"l00359\" na\n+0000f510: 6d65 3d22 6c30 3033 3539 223e 3c2f 613e me=\"l00359\">\n+0000f520: 3c73 7061 6e20 636c 6173 733d 226c 696e 359 C[i\n+0000f550: 5d5b 6a5d 202b 3d20 282a 3c73 7061 6e20 ][j] += (*\n+0000f570: 7468 6973 3c2f 7370 616e 3e29 5b69 5d5b this)[i][\n+0000f580: 6b5d 2a3c 6120 636c 6173 733d 2263 6f64 k]*M[k][j];\n+0000f5e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0000f630: 2033 3630 3c2f 7370 616e 3e20 2020 2020 360 \n+0000f640: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
    .
    361 \n+0000f6a0: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
    .<\n+0000f6c0: 6120 6964 3d22 6c30 3033 3632 2220 6e61 a id=\"l00362\" na\n+0000f6d0: 6d65 3d22 6c30 3033 3632 223e 3c2f 613e me=\"l00362\">\n+0000f6e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 362 return C\n+0000f730: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+0000f780: 2020 3336 333c 2f73 7061 6e3e 2020 2020 363 \n+0000f790: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
    .
    .<\n+0000f7a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0000f7b0: 3e3c 6120 6964 3d22 6c30 3033 3634 2220 > 364
    .
    365 \n+0000f850: 2020 203c 7370 616e 2063 6c61 7373 3d22 // make\n+0000f870: 2074 6869 7320 7468 696e 6720 6120 6d61 this thing a ma\n+0000f880: 7472 6978 3c2f 7370 616e 3e3c 2f64 6976 trix.
    \n+0000f920: 2033 3636 3c2f 613e 3c2f 7370 616e 3e20 366 \n+0000f930: 2020 203c 7370 616e 2063 6c61 7373 3d22 static<\n+0000f950: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> con\n+0000f970: 7374 6578 7072 3c2f 7370 616e 3e20 3c61 stexpr si\n+0000f9d0: 7a65 5f74 7970 653c 2f61 3e20 3c61 2063 ze_type mat\n+0000fa30: 5f72 6f77 733c 2f61 3e28 2920 7b20 3c73 _rows() { return ROWS; }.
    367 stati\n+0000fb30: 633c 2f73 7061 6e3e 203c 7370 616e 2063 c c\n+0000fb50: 6f6e 7374 6578 7072 3c2f 7370 616e 3e20 onstexpr \n+0000fb60: 3c61 2063 6c61 7373 3d22 636f 6465 2068 \n+0000fbb0: 7369 7a65 5f74 7970 653c 2f61 3e20 3c61 size_type m\n+0000fc10: 6174 5f63 6f6c 733c 2f61 3e28 2920 7b20 at_cols() { \n+0000fc20: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n+0000fc40: 3c2f 7370 616e 3e20 434f 4c53 3b20 7d3c COLS; }<\n+0000fc50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0000fca0: 3336 383c 2f73 7061 6e3e 203c 2f64 6976 368 .
    .\n+0000fea0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+0000ff00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0000ff30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 371 DUNE_\n+0000ffb0: 4153 5345 5254 5f42 4f55 4e44 533c 2f61 ASSERT_BOUNDS(i < ROWS);<\n+0000ffd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00010020: 3337 323c 2f73 7061 6e3e 2020 2020 2020 372 \n+00010030: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n+00010050: 3c2f 7370 616e 3e20 5f64 6174 615b 695d _data[i]\n+00010060: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+000100b0: 2020 3337 333c 2f73 7061 6e3e 2020 2020 373 \n+000100c0: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
    .
    .<\n+000100d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000100e0: 3e3c 6120 6964 3d22 6c30 3033 3734 2220 > 374
    .
    \n+00010170: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+000101a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n+00010200: 3337 353c 2f61 3e3c 2f73 7061 6e3e 2020 375 \n+00010210: 2020 3c61 2063 6c61 7373 3d22 636f 6465 co\n+00010240: 6e73 745f 726f 775f 7265 6665 7265 6e63 nst_row_referenc\n+00010250: 653c 2f61 3e20 3c61 2063 6c61 7373 3d22 e mat_acces\n+000102b0: 733c 2f61 3e20 2820 3c61 2063 6c61 7373 s ( size_typ\n+00010310: 653c 2f61 3e20 6920 293c 7370 616e 2063 e i ) \n+00010330: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
    376\n+00010390: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 \n+000103b0: 203c 2f73 7061 6e3e 7b3c 2f64 6976 3e0a {
    .\n+000103c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+000103f0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 377 DUNE_A\n+00010470: 5353 4552 545f 424f 554e 4453 3c2f 613e SSERT_BOUNDS\n+00010480: 2869 2026 6c74 3b20 524f 5753 293b 3c2f (i < ROWS);.
    3\n+000104e0: 3738 3c2f 7370 616e 3e20 2020 2020 203c 78 <\n+000104f0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00010500: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n+00010510: 2f73 7061 6e3e 205f 6461 7461 5b69 5d3b /span> _data[i];\n+00010520: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00010570: 2033 3739 3c2f 7370 616e 3e20 2020 207d 379 }\n+00010580: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n+000105a0: 3c61 2069 643d 226c 3030 3338 3022 206e 380 };
    ..
    38\n+00010640: 313c 2f73 7061 6e3e 203c 2f64 6976 3e0a 1
    .\n+00010650: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+00010710: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+00010740: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 385 template&l\n+00010770: 743b 636c 6173 7320 4b26 6774 3b3c 2f64 t;class K>.
    38\n+000107d0: 363c 2f73 7061 6e3e 2020 3c73 7061 6e20 6 \n+000107f0: 636c 6173 7320 3c2f 7370 616e 3e46 6965 class Fie\n+00010800: 6c64 4d61 7472 6978 266c 743b 4b2c 312c ldMatrix<K,1,\n+00010810: 3126 6774 3b20 3a20 3c73 7061 6e20 636c 1> : pu\n+00010830: 626c 6963 3c2f 7370 616e 3e20 4465 6e73 blic Dens\n+00010840: 654d 6174 7269 7826 6c74 3b20 4669 656c eMatrix< Fiel\n+00010850: 644d 6174 7269 7826 6c74 3b4b 2c31 2c31 dMatrix<K,1,1\n+00010860: 2667 743b 2026 6774 3b3c 2f64 6976 3e0a > >
    .\n+00010870: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+000108e0: 3c61 2069 643d 226c 3030 3338 3822 206e 388 FieldVecto\n+00010930: 7226 6c74 3b4b 2c31 2667 743b 205f 6461 r<K,1> _da\n+00010940: 7461 3b3c 2f64 6976 3e0a 3c64 6976 2063 ta;
    .
    389 \n+000109a0: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef<\n+000109c0: 2f73 7061 6e3e 2044 656e 7365 4d61 7472 /span> DenseMatr\n+000109d0: 6978 266c 743b 2046 6965 6c64 4d61 7472 ix< FieldMatr\n+000109e0: 6978 266c 743b 4b2c 312c 3126 6774 3b20 ix<K,1,1> \n+000109f0: 2667 743b 2042 6173 653b 3c2f 6469 763e > Base;
    \n+00010a00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00010a30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 390 pub\n+00010a70: 6c69 633c 2f73 7061 6e3e 3a3c 2f64 6976 lic:.
    391<\n+00010ad0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00010af0: 2f2f 2073 7461 6e64 6172 6420 636f 6e73 // standard cons\n+00010b00: 7472 7563 746f 7220 616e 6420 6576 6572 tructor and ever\n+00010b10: 7974 6869 6e67 2069 7320 7375 6666 6963 ything is suffic\n+00010b20: 6965 6e74 202e 2e2e 3c2f 7370 616e 3e3c ient ...<\n+00010b30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00010b80: 3339 323c 2f73 7061 6e3e 203c 2f64 6976 392 .
    393<\n+00010be0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00010c00: 2f2f 3d3d 3d3d 3d20 7479 7065 2064 6566 //===== type def\n+00010c10: 696e 6974 696f 6e73 2061 6e64 2063 6f6e initions and con\n+00010c20: 7374 616e 7473 3c2f 7370 616e 3e3c 2f64 stants.
    39\n+00010c80: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n+00010c90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00010e30: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00010e40: 6e6f 223e 2020 3339 373c 2f73 7061 6e3e no\"> 397
    \n+00010e50: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+00010ea0: 2020 3430 303c 2f73 7061 6e3e 2020 2020 400 \n+00010eb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 constexpr<\n+00010ed0: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> sta\n+00010ef0: 7469 633c 2f73 7061 6e3e 203c 7370 616e tic int \n+00010f20: 3c61 2063 6c61 7373 3d22 636f 6465 2068 blocklevel \n+00010f80: 3d20 313b 3c2f 6469 763e 0a3c 6469 7620 = 1;
    .
    401 \n+00010fe0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00011030: 2034 3032 3c2f 7370 616e 3e20 2020 203c 402 <\n+00011040: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00011050: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord\">typedef typena\n+00011080: 6d65 3c2f 7370 616e 3e20 3c61 2063 6c61 me Base::\n+000110e0: 726f 775f 7479 7065 3c2f 613e 203c 6120 row_type row\n+00011140: 5f74 7970 653c 2f61 3e3b 3c2f 6469 763e _type;
    \n+00011150: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+000111c0: 6120 6964 3d22 6c30 3034 3034 2220 6e61 a id=\"l00404\" na\n+000111d0: 6d65 3d22 6c30 3034 3034 223e 3c2f 613e me=\"l00404\">\n+000111e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 404 typed\n+00011220: 6566 3c2f 7370 616e 3e20 3c73 7061 6e20 ef \n+00011240: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n+00011250: 3c61 2063 6c61 7373 3d22 636f 6465 2068 \n+000112a0: 4261 7365 3a3a 726f 775f 7265 6665 7265 Base::row_refere\n+000112b0: 6e63 653c 2f61 3e20 3c61 2063 6c61 7373 nce row_refe\n+00011310: 7265 6e63 653c 2f61 3e3b 3c2f 6469 763e rence;
    \n+00011320: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+000114a0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00011510: 6120 6964 3d22 6c30 3034 3039 2220 6e61 a id=\"l00409\" na\n+00011520: 6d65 3d22 6c30 3034 3039 223e 3c2f 613e me=\"l00409\">\n+00011530: 3c73 7061 6e20 636c 6173 733d 226c 696e 409 const\n+00011570: 6578 7072 3c2f 7370 616e 3e20 3c73 7061 expr static \n+000115a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 int rows =\n+00011620: 2031 3b3c 2f64 6976 3e0a 3c64 6976 2063 1;
    .
    412 \n+00011680: 2020 3c73 7061 6e20 636c 6173 733d 226b constexp\n+000116a0: 723c 2f73 7061 6e3e 203c 7370 616e 2063 r s\n+000116c0: 7461 7469 633c 2f73 7061 6e3e 203c 7370 tatic int cols = 1;\n+00011750: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000117a0: 2034 3133 3c2f 7370 616e 3e20 3c2f 6469 413 .
    414\n+00011800: 3c2f 7370 616e 3e20 2020 203c 7370 616e //===== constru\n+00011830: 6374 6f72 733c 2f73 7061 6e3e 3c2f 6469 ctors.
    417\n+00011890: 3c2f 7370 616e 3e20 2020 203c 7370 616e constexpr FieldMatrix() = default;\n+00011950: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000119a0: 2034 3138 3c2f 7370 616e 3e20 3c2f 6469 418 .
    421\n+00011a00: 3c2f 7370 616e 3e20 2020 203c 6120 636c Fiel\n+00011a60: 644d 6174 7269 783c 2f61 3e28 7374 643a dMatrix(std:\n+00011a70: 3a69 6e69 7469 616c 697a 6572 5f6c 6973 :initializer_lis\n+00011a80: 7426 6c74 3b3c 6120 636c 6173 733d 2263 t<Dune::FieldVect\n+00011ac0: 6f72 266c 743b 4b2c 2031 2667 743b 3c2f or<K, 1>> con\n+00011af0: 7374 3c2f 7370 616e 3e20 2661 6d70 3b6c st &l\n+00011b00: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
    .
    \n+00011b50: 2020 3432 323c 2f73 7061 6e3e 2020 2020 422 \n+00011b60: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n+00011bb0: 2020 3432 333c 2f73 7061 6e3e 2020 2020 423 \n+00011bc0: 2020 7374 643a 3a63 6f70 795f 6e28 6c2e std::copy_n(l.\n+00011bd0: 6265 6769 6e28 292c 2073 7464 3a3a 6d69 begin(), std::mi\n+00011be0: 6e28 3c73 7061 6e20 636c 6173 733d 226b n(static_c\n+00011c00: 6173 7426 6c74 3b3c 2f73 7061 6e3e 2073 ast< s\n+00011c10: 7464 3a3a 7369 7a65 5f74 203c 7370 616e td::size_t >( 1 \n+00011c40: 292c 206c 2e73 697a 6528 2929 2c20 2661 ), l.size()), &a\n+00011c50: 6d70 3b5f 6461 7461 293b 3c2f 6469 763e mp;_data);
    \n+00011c60: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+00011cc0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00011d30: 6120 6964 3d22 6c30 3034 3236 2220 6e61 a id=\"l00426\" na\n+00011d40: 6d65 3d22 6c30 3034 3236 223e 3c2f 613e me=\"l00426\">\n+00011d50: 3c73 7061 6e20 636c 6173 733d 226c 696e 426 templ\n+00011d90: 6174 653c 2f73 7061 6e3e 2026 6c74 3b3c ate <<\n+00011da0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00011db0: 6f72 6422 3e63 6c61 7373 203c 2f73 7061 ord\">class T,
    .
    427 \n+00011e20: 2020 2020 2020 2020 2020 2020 203c 7370 typename = std::enable\n+00011e60: 5f69 665f 7426 6c74 3b48 6173 4465 6e73 _if_t<HasDens\n+00011e70: 654d 6174 7269 7841 7373 6967 6e65 7226 eMatrixAssigner&\n+00011e80: 6c74 3b46 6965 6c64 4d61 7472 6978 2c20 lt;FieldMatrix, \n+00011e90: 5426 6774 3b3a 3a76 616c 7565 2667 743b T>::value>\n+00011ea0: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    ..
    429 \n+00011ff0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    430 \n+00012050: 2020 202a 3c73 7061 6e20 636c 6173 733d *this = rhs;.
    431\n+000120d0: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    432\n+00012130: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+00012140: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00012150: 3e3c 6120 6964 3d22 6c30 3034 3333 2220 > 433 usi\n+000121b0: 6e67 203c 2f73 7061 6e3e 4261 7365 3a3a ng Base::\n+000121c0: 6f70 6572 6174 6f72 3d3b 3c2f 6469 763e operator=;
    \n+000121d0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00012240: 6120 6964 3d22 6c30 3034 3336 2220 6e61 a id=\"l00436\" na\n+00012250: 6d65 3d22 6c30 3034 3336 223e 3c2f 613e me=\"l00436\">\n+00012260: 3c73 7061 6e20 636c 6173 733d 226c 696e 436 FieldMatrix\n+00012290: 266c 743b 4b2c 2031 2c20 3126 6774 3b20 <K, 1, 1> \n+000122a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 transposed(\n+00012300: 293c 7370 616e 2063 6c61 7373 3d22 6b65 ) const
    .
    437<\n+00012380: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00012390: 6f72 6422 3e20 2020 203c 2f73 7061 6e3e ord\"> \n+000123a0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n+000123f0: 2020 3433 383c 2f73 7061 6e3e 2020 2020 438 \n+00012400: 2020 3c73 7061 6e20 636c 6173 733d 226b retu\n+00012420: 726e 3c2f 7370 616e 3e20 2a3c 7370 616e rn *this;.
    43\n+000124a0: 393c 2f73 7061 6e3e 2020 2020 7d3c 2f64 9 }.
    44\n+00012500: 303c 2f73 7061 6e3e 203c 2f64 6976 3e0a 0
    .\n+00012510: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    443 \n+00012620: 2020 203c 7370 616e 2063 6c61 7373 3d22 friend<\n+00012640: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> aut\n+00012660: 6f3c 2f73 7061 6e3e 203c 6120 636c 6173 o operator\n+000126c0: 2b20 3c2f 613e 2820 3c73 7061 6e20 636c + ( co\n+000126e0: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst Fiel\n+00012740: 644d 6174 7269 783c 2f61 3e26 616d 703b dMatrix&\n+00012750: 206d 6174 7269 7841 2c3c 2f64 6976 3e0a matrixA,
    .\n+00012760: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    445 \n+00012880: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
    .
    446 \n+000128e0: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n+00012900: 7475 726e 3c2f 7370 616e 3e20 4669 656c turn Fiel\n+00012910: 644d 6174 7269 7826 6c74 3b74 7970 656e dMatrix<typen\n+00012920: 616d 6520 5072 6f6d 6f74 696f 6e54 7261 ame PromotionTra\n+00012930: 6974 7326 6c74 3b4b 2c4f 7468 6572 5363 its<K,OtherSc\n+00012940: 616c 6172 2667 743b 3a3a 5072 6f6d 6f74 alar>::Promot\n+00012950: 6564 5479 7065 2c31 2c31 2667 743b 7b6d edType,1,1>{m\n+00012960: 6174 7269 7841 5b30 5d5b 305d 202b 206d atrixA[0][0] + m\n+00012970: 6174 7269 7842 5b30 5d5b 305d 7d3b 3c2f atrixB[0][0]};.
    4\n+000129d0: 3437 3c2f 7370 616e 3e20 2020 207d 3c2f 47 }.
    4\n+00012a30: 3438 3c2f 7370 616e 3e20 3c2f 6469 763e 48
    \n+00012a40: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00012a70: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 450 t\n+00012ab0: 656d 706c 6174 653c 2f73 7061 6e3e 2026 emplate &\n+00012ac0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class <\n+00012ae0: 2f73 7061 6e3e 3c61 2063 6c61 7373 3d22 /span>Scalar,
    .
    451 \n+00012ba0: 2020 2020 2020 2020 2020 2073 7464 3a3a std::\n+00012bb0: 656e 6162 6c65 5f69 665f 7426 6c74 3b49 enable_if_t<I\n+00012bc0: 734e 756d 6265 7226 6c74 3b53 6361 6c61 sNumber<Scala\n+00012bd0: 7226 6774 3b3a 3a76 616c 7565 2c20 3c73 r>::value, int> = 0>.
    4\n+00012c60: 3532 3c2f 7370 616e 3e20 2020 203c 7370 52 friend\n+00012c90: 203c 7370 616e 2063 6c61 7373 3d22 6b65 auto operator+ \n+00012d10: 2820 3c73 7061 6e20 636c 6173 733d 226b ( const FieldMatri\n+00012d90: 783c 2f61 3e26 616d 703b 206d 6174 7269 x& matri\n+00012da0: 782c 3c2f 6469 763e 0a3c 6469 7620 636c x,
    .
    453 \n+00012e00: 2020 2020 2020 2020 2020 2020 2020 2020 \n+00012e10: 2020 2020 2020 2020 203c 7370 616e 2063 c\n+00012e30: 6f6e 7374 3c2f 7370 616e 3e20 5363 616c onst Scal\n+00012e40: 6172 2661 6d70 3b20 7363 616c 6172 293c ar& scalar)<\n+00012e50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00012ea0: 3435 343c 2f73 7061 6e3e 2020 2020 7b3c 454 {<\n+00012eb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00012f00: 3435 353c 2f73 7061 6e3e 2020 2020 2020 455 \n+00012f10: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n+00012f30: 3c2f 7370 616e 3e20 4669 656c 644d 6174 FieldMat\n+00012f40: 7269 7826 6c74 3b74 7970 656e 616d 6520 rix<typename \n+00012f50: 5072 6f6d 6f74 696f 6e54 7261 6974 7326 PromotionTraits&\n+00012f60: 6c74 3b4b 2c53 6361 6c61 7226 6774 3b3a lt;K,Scalar>:\n+00012f70: 3a50 726f 6d6f 7465 6454 7970 652c 312c :PromotedType,1,\n+00012f80: 3126 6774 3b7b 6d61 7472 6978 5b30 5d5b 1>{matrix[0][\n+00012f90: 305d 202b 2073 6361 6c61 727d 3b3c 2f64 0] + scalar};.
    45\n+00012ff0: 363c 2f73 7061 6e3e 2020 2020 7d3c 2f64 6 }.
    45\n+00013050: 373c 2f73 7061 6e3e 203c 2f64 6976 3e0a 7
    .\n+00013060: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n+000131b0: 2020 3436 303c 2f73 7061 6e3e 2020 2020 460 \n+000131c0: 2020 2020 2020 2020 2020 7374 643a 3a65 std::e\n+000131d0: 6e61 626c 655f 6966 5f74 266c 743b 4973 nable_if_t<Is\n+000131e0: 4e75 6d62 6572 266c 743b 5363 616c 6172 Number<Scalar\n+000131f0: 2667 743b 3a3a 7661 6c75 652c 203c 7370 >::value, int> = 0>.
    46\n+00013280: 313c 2f73 7061 6e3e 2020 2020 3c73 7061 1 friend \n+000132b0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator+ (\n+00013330: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const Scalar& \n+00013360: 7363 616c 6172 2c3c 2f64 6976 3e0a 3c64 scalar,
    .\n+00013380: 3c61 2069 643d 226c 3030 3436 3222 206e 462 \n+000133d0: 2020 2020 2020 2020 2020 2020 2020 3c73 const\n+00013400: 203c 6120 636c 6173 733d 2263 6f64 6520 FieldMatrix& matrix).
    4\n+000134c0: 3633 3c2f 7370 616e 3e20 2020 207b 3c2f 63 {.
    4\n+00013520: 3634 3c2f 7370 616e 3e20 2020 2020 203c 64 <\n+00013530: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00013540: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n+00013550: 2f73 7061 6e3e 2046 6965 6c64 4d61 7472 /span> FieldMatr\n+00013560: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n+00013570: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n+00013580: 743b 5363 616c 6172 2c4b 2667 743b 3a3a t;Scalar,K>::\n+00013590: 5072 6f6d 6f74 6564 5479 7065 2c31 2c31 PromotedType,1,1\n+000135a0: 2667 743b 7b73 6361 6c61 7220 2b20 6d61 >{scalar + ma\n+000135b0: 7472 6978 5b30 5d5b 305d 7d3b 3c2f 6469 trix[0][0]};.
    465\n+00013610: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    466\n+00013670: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+00013680: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00013690: 3e3c 6120 6964 3d22 6c30 3034 3638 2220 > 468 tem\n+000136f0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n+00013700: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class OtherScalar&\n+00013730: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    469 \n+00013790: 2020 3c73 7061 6e20 636c 6173 733d 226b friend auto\n+000137d0: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 operator-\n+00013830: 203c 2f61 3e28 203c 7370 616e 2063 6c61 ( con\n+00013850: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st Field\n+000138b0: 4d61 7472 6978 3c2f 613e 2661 6d70 3b20 Matrix& \n+000138c0: 6d61 7472 6978 412c 3c2f 6469 763e 0a3c matrixA,
    .<\n+000138d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000138e0: 3e3c 6120 6964 3d22 6c30 3034 3730 2220 > 470 \n+00013930: 2020 2020 2020 2020 2020 2020 2020 203c <\n+00013940: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00013950: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const FieldMatrix<\n+00013970: 3b4f 7468 6572 5363 616c 6172 2c31 2c31 ;OtherScalar,1,1\n+00013980: 2667 743b 2661 6d70 3b20 6d61 7472 6978 >& matrix\n+00013990: 4229 3c2f 6469 763e 0a3c 6469 7620 636c B)
    .
    471 \n+000139f0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    472 \n+00013a50: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n+00013a70: 7572 6e3c 2f73 7061 6e3e 2046 6965 6c64 urn Field\n+00013a80: 4d61 7472 6978 266c 743b 7479 7065 6e61 Matrix<typena\n+00013a90: 6d65 2050 726f 6d6f 7469 6f6e 5472 6169 me PromotionTrai\n+00013aa0: 7473 266c 743b 4b2c 4f74 6865 7253 6361 ts<K,OtherSca\n+00013ab0: 6c61 7226 6774 3b3a 3a50 726f 6d6f 7465 lar>::Promote\n+00013ac0: 6454 7970 652c 312c 3126 6774 3b7b 6d61 dType,1,1>{ma\n+00013ad0: 7472 6978 415b 305d 5b30 5d20 2d20 6d61 trixA[0][0] - ma\n+00013ae0: 7472 6978 425b 305d 5b30 5d7d 3b3c 2f64 trixB[0][0]};.
    47\n+00013b40: 333c 2f73 7061 6e3e 2020 2020 7d3c 2f64 3 }.
    47\n+00013ba0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n+00013bb0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n+00013d00: 2020 3437 373c 2f73 7061 6e3e 2020 2020 477 \n+00013d10: 2020 2020 2020 2020 2020 7374 643a 3a65 std::e\n+00013d20: 6e61 626c 655f 6966 5f74 266c 743b 4973 nable_if_t<Is\n+00013d30: 4e75 6d62 6572 266c 743b 5363 616c 6172 Number<Scalar\n+00013d40: 2667 743b 3a3a 7661 6c75 652c 203c 7370 >::value, int> = 0>.
    47\n+00013dd0: 383c 2f73 7061 6e3e 2020 2020 3c73 7061 8 friend \n+00013e00: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator- (\n+00013e80: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const FieldMatrix\n+00013f00: 3c2f 613e 2661 6d70 3b20 6d61 7472 6978 & matrix\n+00013f10: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
    .
    \n+00013f60: 2020 3437 393c 2f73 7061 6e3e 2020 2020 479 \n+00013f70: 2020 2020 2020 2020 2020 2020 2020 2020 \n+00013f80: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n+00013fa0: 6e73 743c 2f73 7061 6e3e 2053 6361 6c61 nst Scala\n+00013fb0: 7226 616d 703b 2073 6361 6c61 7229 3c2f r& scalar).
    4\n+00014010: 3830 3c2f 7370 616e 3e20 2020 207b 3c2f 80 {.
    4\n+00014070: 3831 3c2f 7370 616e 3e20 2020 2020 203c 81 <\n+00014080: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00014090: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n+000140a0: 2f73 7061 6e3e 2046 6965 6c64 4d61 7472 /span> FieldMatr\n+000140b0: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n+000140c0: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n+000140d0: 743b 4b2c 5363 616c 6172 2667 743b 3a3a t;K,Scalar>::\n+000140e0: 5072 6f6d 6f74 6564 5479 7065 2c31 2c31 PromotedType,1,1\n+000140f0: 2667 743b 7b6d 6174 7269 785b 305d 5b30 >{matrix[0][0\n+00014100: 5d20 2d20 7363 616c 6172 7d3b 3c2f 6469 ] - scalar};.
    482\n+00014160: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    483\n+000141c0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+000141d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000141e0: 3e3c 6120 6964 3d22 6c30 3034 3835 2220 > 485 tem\n+00014240: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n+00014250: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class Scalar,\n+000142d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00014320: 2034 3836 3c2f 7370 616e 3e20 2020 2020 486 \n+00014330: 2020 2020 2020 2020 2073 7464 3a3a 656e std::en\n+00014340: 6162 6c65 5f69 665f 7426 6c74 3b49 734e able_if_t<IsN\n+00014350: 756d 6265 7226 6c74 3b53 6361 6c61 7226 umber<Scalar&\n+00014360: 6774 3b3a 3a76 616c 7565 2c20 3c73 7061 gt;::value, int\n+00014390: 2667 743b 203d 2030 2667 743b 3c2f 6469 > = 0>.
    487\n+000143f0: 3c2f 7370 616e 3e20 2020 203c 7370 616e friend <\n+00014420: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00014430: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord\">auto\n+00014440: 203c 6120 636c 6173 733d 2263 6f64 6520 \n+00014490: 6f70 6572 6174 6f72 2d20 3c2f 613e 2820 operator- ( \n+000144a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const Scalar& s\n+000144d0: 6361 6c61 722c 3c2f 6469 763e 0a3c 6469 calar,
    .<\n+000144f0: 6120 6964 3d22 6c30 3034 3838 2220 6e61 a id=\"l00488\" na\n+00014500: 6d65 3d22 6c30 3034 3838 223e 3c2f 613e me=\"l00488\">\n+00014510: 3c73 7061 6e20 636c 6173 733d 226c 696e 488 \n+00014540: 2020 2020 2020 2020 2020 2020 203c 7370 const \n+00014570: 3c61 2063 6c61 7373 3d22 636f 6465 2068 FieldMatrix\n+000145d0: 2661 6d70 3b20 6d61 7472 6978 293c 2f64 & matrix).
    48\n+00014630: 393c 2f73 7061 6e3e 2020 2020 7b3c 2f64 9 {.
    49\n+00014690: 303c 2f73 7061 6e3e 2020 2020 2020 3c73 0 return FieldMatri\n+000146d0: 7826 6c74 3b74 7970 656e 616d 6520 5072 x<typename Pr\n+000146e0: 6f6d 6f74 696f 6e54 7261 6974 7326 6c74 omotionTraits<\n+000146f0: 3b53 6361 6c61 722c 4b26 6774 3b3a 3a50 ;Scalar,K>::P\n+00014700: 726f 6d6f 7465 6454 7970 652c 312c 3126 romotedType,1,1&\n+00014710: 6774 3b7b 7363 616c 6172 202d 206d 6174 gt;{scalar - mat\n+00014720: 7269 785b 305d 5b30 5d7d 3b3c 2f64 6976 rix[0][0]};.
    491<\n+00014780: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    492<\n+000147e0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n+00014800: 3c61 2069 643d 226c 3030 3439 3422 206e 494 temp\n+00014860: 6c61 7465 3c2f 7370 616e 3e20 266c 743b late <\n+00014870: 3c73 7061 6e20 636c 6173 733d 226b 6579 class Scalar,<\n+000148f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00014940: 3439 353c 2f73 7061 6e3e 2020 2020 2020 495 \n+00014950: 2020 2020 2020 2020 7374 643a 3a65 6e61 std::ena\n+00014960: 626c 655f 6966 5f74 266c 743b 4973 4e75 ble_if_t<IsNu\n+00014970: 6d62 6572 266c 743b 5363 616c 6172 2667 mber<Scalar&g\n+00014980: 743b 3a3a 7661 6c75 652c 203c 7370 616e t;::value, int&\n+000149b0: 6774 3b20 3d20 3026 6774 3b3c 2f64 6976 gt; = 0>.
    496<\n+00014a10: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00014a30: 6672 6965 6e64 3c2f 7370 616e 3e20 3c73 friend auto \n+00014a60: 3c61 2063 6c61 7373 3d22 636f 6465 2068 o\n+00014ab0: 7065 7261 746f 722a 203c 2f61 3e28 203c perator* ( <\n+00014ac0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00014ad0: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const FieldMatrix& matrix, \n+00014b50: 5363 616c 6172 2073 6361 6c61 7229 3c2f Scalar scalar).
    4\n+00014bb0: 3937 3c2f 7370 616e 3e20 2020 207b 3c2f 97 {.
    4\n+00014c10: 3938 3c2f 7370 616e 3e20 2020 2020 203c 98 <\n+00014c20: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00014c30: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n+00014c40: 2f73 7061 6e3e 2046 6965 6c64 4d61 7472 /span> FieldMatr\n+00014c50: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n+00014c60: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n+00014c70: 743b 4b2c 5363 616c 6172 2667 743b 3a3a t;K,Scalar>::\n+00014c80: 5072 6f6d 6f74 6564 5479 7065 2c31 2c31 PromotedType,1,1\n+00014c90: 2667 743b 207b 6d61 7472 6978 5b30 5d5b > {matrix[0][\n+00014ca0: 305d 202a 2073 6361 6c61 727d 3b3c 2f64 0] * scalar};.
    49\n+00014d00: 393c 2f73 7061 6e3e 2020 2020 7d3c 2f64 9 }.
    50\n+00014d60: 303c 2f73 7061 6e3e 203c 2f64 6976 3e0a 0
    .\n+00014d70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n+00014ec0: 2020 3530 333c 2f73 7061 6e3e 2020 2020 503 \n+00014ed0: 2020 2020 2020 2020 2020 7374 643a 3a65 std::e\n+00014ee0: 6e61 626c 655f 6966 5f74 266c 743b 4973 nable_if_t<Is\n+00014ef0: 4e75 6d62 6572 266c 743b 5363 616c 6172 Number<Scalar\n+00014f00: 2667 743b 3a3a 7661 6c75 652c 203c 7370 >::value, int> = 0>.
    50\n+00014f90: 343c 2f73 7061 6e3e 2020 2020 3c73 7061 4 friend \n+00014fc0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator* (\n+00015040: 2053 6361 6c61 7220 7363 616c 6172 2c20 Scalar scalar, \n+00015050: 3c73 7061 6e20 636c 6173 733d 226b 6579 const FieldMatrix<\n+000150d0: 2f61 3e26 616d 703b 206d 6174 7269 7829 /a>& matrix)\n+000150e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00015130: 2035 3035 3c2f 7370 616e 3e20 2020 207b 505 {\n+00015140: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00015190: 2035 3036 3c2f 7370 616e 3e20 2020 2020 506 \n+000151a0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n+000151c0: 6e3c 2f73 7061 6e3e 2046 6965 6c64 4d61 n FieldMa\n+000151d0: 7472 6978 266c 743b 7479 7065 6e61 6d65 trix<typename\n+000151e0: 2050 726f 6d6f 7469 6f6e 5472 6169 7473 PromotionTraits\n+000151f0: 266c 743b 4b2c 5363 616c 6172 2667 743b <K,Scalar>\n+00015200: 3a3a 5072 6f6d 6f74 6564 5479 7065 2c31 ::PromotedType,1\n+00015210: 2c31 2667 743b 207b 7363 616c 6172 202a ,1> {scalar *\n+00015220: 206d 6174 7269 785b 305d 5b30 5d7d 3b3c matrix[0][0]};<\n+00015230: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00015280: 3530 373c 2f73 7061 6e3e 2020 2020 7d3c 507 }<\n+00015290: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+000152e0: 3530 383c 2f73 7061 6e3e 203c 2f64 6976 508 .
    510<\n+00015340: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+00015360: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n+00015370: 266c 743b 3c73 7061 6e20 636c 6173 733d <class \n+00015390: 3c2f 7370 616e 3e3c 6120 636c 6173 733d Scalar,
    .
    511 \n+00015450: 2020 2020 2020 2020 2020 2020 7374 643a std:\n+00015460: 3a65 6e61 626c 655f 6966 5f74 266c 743b :enable_if_t<\n+00015470: 4973 4e75 6d62 6572 266c 743b 5363 616c IsNumber<Scal\n+00015480: 6172 2667 743b 3a3a 7661 6c75 652c 203c ar>::value, <\n+00015490: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+000154a0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype\">int> = 0><\n+000154c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00015510: 3531 323c 2f73 7061 6e3e 2020 2020 3c73 512 friend auto operator/ ( const FieldMatr\n+00015640: 6978 3c2f 613e 2661 6d70 3b20 6d61 7472 ix& matr\n+00015650: 6978 2c20 5363 616c 6172 2073 6361 6c61 ix, Scalar scala\n+00015660: 7229 3c2f 6469 763e 0a3c 6469 7620 636c r)
    .
    513 \n+000156c0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    514 \n+00015720: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n+00015740: 7572 6e3c 2f73 7061 6e3e 2046 6965 6c64 urn Field\n+00015750: 4d61 7472 6978 266c 743b 7479 7065 6e61 Matrix<typena\n+00015760: 6d65 2050 726f 6d6f 7469 6f6e 5472 6169 me PromotionTrai\n+00015770: 7473 266c 743b 4b2c 5363 616c 6172 2667 ts<K,Scalar&g\n+00015780: 743b 3a3a 5072 6f6d 6f74 6564 5479 7065 t;::PromotedType\n+00015790: 2c31 2c31 2667 743b 207b 6d61 7472 6978 ,1,1> {matrix\n+000157a0: 5b30 5d5b 305d 202f 2073 6361 6c61 727d [0][0] / scalar}\n+000157b0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+00015800: 2020 3531 353c 2f73 7061 6e3e 2020 2020 515 \n+00015810: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
    .
    \n+00015860: 2020 3531 363c 2f73 7061 6e3e 203c 2f64 516 .
    51\n+000158c0: 373c 2f73 7061 6e3e 2020 2020 3c73 7061 7 //===== solve<\n+000158f0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
    .<\n+00015910: 6120 6964 3d22 6c30 3035 3138 2220 6e61 a id=\"l00518\" na\n+00015920: 6d65 3d22 6c30 3035 3138 223e 3c2f 613e me=\"l00518\">\n+00015930: 3c73 7061 6e20 636c 6173 733d 226c 696e 518
    .
    521 \n+000159b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n+000159d0: 2f73 7061 6e3e 2026 6c74 3b3c 7370 616e /span> <class Ot\n+00015a00: 6865 7253 6361 6c61 722c 203c 7370 616e herScalar, int \n+00015a30: 6f74 6865 7243 6f6c 7326 6774 3b3c 2f64 otherCols>.
    52\n+00015a90: 323c 2f73 7061 6e3e 2020 2020 3c73 7061 2 friend \n+00015ac0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator* (\n+00015b40: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const FieldMatrix\n+00015bc0: 3c2f 613e 2661 6d70 3b20 6d61 7472 6978 & matrix\n+00015bd0: 412c 3c2f 6469 763e 0a3c 6469 7620 636c A,
    .
    523 \n+00015c30: 2020 2020 2020 2020 2020 2020 2020 2020 \n+00015c40: 2020 2020 2020 2020 203c 7370 616e 2063 c\n+00015c60: 6f6e 7374 3c2f 7370 616e 3e20 4669 656c onst Fiel\n+00015c70: 644d 6174 7269 7826 6c74 3b4f 7468 6572 dMatrix<Other\n+00015c80: 5363 616c 6172 2c20 312c 206f 7468 6572 Scalar, 1, other\n+00015c90: 436f 6c73 2667 743b 2661 6d70 3b20 6d61 Cols>& ma\n+00015ca0: 7472 6978 4229 3c2f 6469 763e 0a3c 6469 trixB)
    .<\n+00015cc0: 6120 6964 3d22 6c30 3035 3234 2220 6e61 a id=\"l00524\" na\n+00015cd0: 6d65 3d22 6c30 3035 3234 223e 3c2f 613e me=\"l00524\">\n+00015ce0: 3c73 7061 6e20 636c 6173 733d 226c 696e 524 {
    .<\n+00015d20: 6120 6964 3d22 6c30 3035 3235 2220 6e61 a id=\"l00525\" na\n+00015d30: 6d65 3d22 6c30 3035 3235 223e 3c2f 613e me=\"l00525\">\n+00015d40: 3c73 7061 6e20 636c 6173 733d 226c 696e 525 FieldMatr\n+00015d70: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n+00015d80: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n+00015d90: 743b 4b2c 4f74 6865 7253 6361 6c61 7226 t;K,OtherScalar&\n+00015da0: 6774 3b3a 3a50 726f 6d6f 7465 6454 7970 gt;::PromotedTyp\n+00015db0: 652c 312c 6f74 6865 7243 6f6c 7326 6774 e,1,otherCols>\n+00015dc0: 3b20 7265 7375 6c74 3b3c 2f64 6976 3e0a ; result;
    .\n+00015dd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00015e60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00015e70: 6e6f 223e 2020 3532 373c 2f73 7061 6e3e no\"> 527\n+00015e80: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+00015ea0: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n+00015f00: 5f74 7970 653c 2f61 3e20 6a20 3d20 303b _type j = 0;\n+00015f10: 206a 2026 6c74 3b20 6d61 7472 6978 422e j < matrixB.\n+00015f20: 6d61 745f 636f 6c73 2829 3b20 2b2b 6a29 mat_cols(); ++j)\n+00015f30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00015f80: 2035 3238 3c2f 7370 616e 3e20 2020 2020 528 \n+00015f90: 2020 2072 6573 756c 745b 305d 5b6a 5d20 result[0][j] \n+00015fa0: 3d20 6d61 7472 6978 415b 305d 5b30 5d20 = matrixA[0][0] \n+00015fb0: 2a20 6d61 7472 6978 425b 305d 5b6a 5d3b * matrixB[0][j];\n+00015fc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00016010: 2035 3239 3c2f 7370 616e 3e20 3c2f 6469 529 .
    530\n+00016070: 3c2f 7370 616e 3e20 2020 2020 203c 7370 return result;.
    531\n+00016100: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    532\n+00016160: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+00016170: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00016180: 3e3c 6120 6964 3d22 6c30 3035 3339 2220 > 539 tem\n+000161e0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n+000161f0: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class OtherMatrix,\n+00016220: 2073 7464 3a3a 656e 6162 6c65 5f69 665f std::enable_if_\n+00016230: 7426 6c74 3b3c 2f64 6976 3e0a 3c64 6976 t<
    .<\n+00016270: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00016280: 6e6f 223e 2020 3534 303c 2f73 7061 6e3e no\"> 540\n+00016290: 2020 2020 2020 496d 706c 3a3a 4973 5374 Impl::IsSt\n+000162a0: 6174 6963 5369 7a65 4d61 7472 6978 5f76 aticSizeMatrix_v\n+000162b0: 266c 743b 4f74 6865 724d 6174 7269 7826 <OtherMatrix&\n+000162c0: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    541 \n+00016320: 2020 2020 616e 6420 6e6f 7420 496d 706c and not Impl\n+00016330: 3a3a 4973 4669 656c 644d 6174 7269 785f ::IsFieldMatrix_\n+00016340: 7626 6c74 3b4f 7468 6572 4d61 7472 6978 v<OtherMatrix\n+00016350: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    542 \n+000163b0: 2020 2020 2061 6e64 2028 4f74 6865 724d and (OtherM\n+000163c0: 6174 7269 783a 3a72 6f77 733d 3d31 293c atrix::rows==1)<\n+000163d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00016420: 3534 333c 2f73 7061 6e3e 2020 2020 2020 543 \n+00016430: 2c20 3c73 7061 6e20 636c 6173 733d 226b , int<\n+00016450: 2f73 7061 6e3e 2667 743b 203d 2030 2667 /span>> = 0&g\n+00016460: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    .
    544 \n+000164c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 friend auto<\n+00016500: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> operator* \n+00016560: 3c2f 613e 2820 3c73 7061 6e20 636c 6173 ( cons\n+00016580: 743c 2f73 7061 6e3e 203c 6120 636c 6173 t FieldM\n+000165e0: 6174 7269 783c 2f61 3e26 616d 703b 206d atrix& m\n+000165f0: 6174 7269 7841 2c3c 2f64 6976 3e0a 3c64 atrixA,
    .\n+00016610: 3c61 2069 643d 226c 3030 3534 3522 206e 545 \n+00016660: 2020 2020 2020 2020 2020 2020 2020 3c73 const\n+00016690: 204f 7468 6572 4d61 7472 6978 2661 6d70 OtherMatrix&\n+000166a0: 3b20 6d61 7472 6978 4229 3c2f 6469 763e ; matrixB)
    \n+000166b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+00016710: 0a3c 6469 7620 636c 6173 733d 226c 696e ..\n+00016860: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+00016930: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00016a60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00016a70: 6e6f 223e 2020 3535 303c 2f73 7061 6e3e no\"> 550\n+00016a80: 2020 2020 2020 2020 6d61 7472 6978 422e matrixB.\n+00016a90: 6d74 7628 6d61 7472 6978 415b 6a5d 2c20 mtv(matrixA[j], \n+00016aa0: 7265 7375 6c74 5b6a 5d29 3b3c 2f64 6976 result[j]);.
    551<\n+00016b00: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return result;.
    552<\n+00016b90: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    553<\n+00016bf0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n+00016c10: 3c61 2069 643d 226c 3030 3536 3022 206e 560 temp\n+00016c70: 6c61 7465 3c2f 7370 616e 3e20 266c 743b late <\n+00016c80: 3c73 7061 6e20 636c 6173 733d 226b 6579 class OtherMatrix, \n+00016cb0: 7374 643a 3a65 6e61 626c 655f 6966 5f74 std::enable_if_t\n+00016cc0: 266c 743b 3c2f 6469 763e 0a3c 6469 7620 <
    .
    561 \n+00016d20: 2020 2020 2049 6d70 6c3a 3a49 7353 7461 Impl::IsSta\n+00016d30: 7469 6353 697a 654d 6174 7269 785f 7626 ticSizeMatrix_v&\n+00016d40: 6c74 3b4f 7468 6572 4d61 7472 6978 2667 lt;OtherMatrix&g\n+00016d50: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    .
    562 \n+00016db0: 2020 2061 6e64 206e 6f74 2049 6d70 6c3a and not Impl:\n+00016dc0: 3a49 7346 6965 6c64 4d61 7472 6978 5f76 :IsFieldMatrix_v\n+00016dd0: 266c 743b 4f74 6865 724d 6174 7269 7826 <OtherMatrix&\n+00016de0: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    563 \n+00016e40: 2020 2020 616e 6420 284f 7468 6572 4d61 and (OtherMa\n+00016e50: 7472 6978 3a3a 636f 6c73 3d3d 3129 3c2f trix::cols==1).
    5\n+00016eb0: 3634 3c2f 7370 616e 3e20 2020 2020 202c 64 ,\n+00016ec0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int> = 0>\n+00016ef0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    ..
    \n+00017080: 2020 3536 363c 2f73 7061 6e3e 2020 2020 566 \n+00017090: 2020 2020 2020 2020 2020 2020 2020 2020 \n+000170a0: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n+000170c0: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst Fiel\n+00017120: 644d 6174 7269 783c 2f61 3e26 616d 703b dMatrix&\n+00017130: 206d 6174 7269 7842 293c 2f64 6976 3e0a matrixB)
    .\n+00017140: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+000171a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+000172f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00017300: 3e3c 6120 6964 3d22 6c30 3035 3639 2220 > 569 Dune::Field\n+00017380: 4d61 7472 6978 266c 743b 4669 656c 642c Matrix<Field,\n+00017390: 204f 7468 6572 4d61 7472 6978 3a3a 726f OtherMatrix::ro\n+000173a0: 7773 2c20 636f 6c73 2667 743b 3c2f 613e ws, cols>\n+000173b0: 2072 6573 756c 743b 3c2f 6469 763e 0a3c result;
    .<\n+000173c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000173d0: 3e3c 6120 6964 3d22 6c30 3035 3730 2220 > 570 for (s\n+00017440: 7464 3a3a 7369 7a65 5f74 206a 3d30 3b20 td::size_t j=0; \n+00017450: 6a26 6c74 3b3c 6120 636c 6173 733d 2263 j<cols; \n+000174b0: 2b2b 6a29 3c2f 6469 763e 0a3c 6469 7620 ++j)
    .
    571 \n+00017510: 2020 2020 207b 3c2f 6469 763e 0a3c 6469 {
    .<\n+00017530: 6120 6964 3d22 6c30 3035 3732 2220 6e61 a id=\"l00572\" na\n+00017540: 6d65 3d22 6c30 3035 3732 223e 3c2f 613e me=\"l00572\">\n+00017550: 3c73 7061 6e20 636c 6173 733d 226c 696e 572 a\n+00017590: 7574 6f3c 2f73 7061 6e3e 2042 5f6a 203d uto B_j =\n+000175a0: 2049 6d70 6c3a 3a43 6f6c 756d 6e56 6563 Impl::ColumnVec\n+000175b0: 746f 7256 6965 7728 6d61 7472 6978 422c torView(matrixB,\n+000175c0: 206a 293b 3c2f 6469 763e 0a3c 6469 7620 j);
    .
    573 \n+00017620: 2020 2020 2020 203c 7370 616e 2063 6c61 aut\n+00017640: 6f3c 2f73 7061 6e3e 2072 6573 756c 745f o result_\n+00017650: 6a20 3d20 496d 706c 3a3a 436f 6c75 6d6e j = Impl::Column\n+00017660: 5665 6374 6f72 5669 6577 2872 6573 756c VectorView(resul\n+00017670: 742c 206a 293b 3c2f 6469 763e 0a3c 6469 t, j);
    .<\n+00017690: 6120 6964 3d22 6c30 3035 3734 2220 6e61 a id=\"l00574\" na\n+000176a0: 6d65 3d22 6c30 3035 3734 223e 3c2f 613e me=\"l00574\">\n+000176b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 574 matrixA\n+000176e0: 2e6d 7628 425f 6a2c 2072 6573 756c 745f .mv(B_j, result_\n+000176f0: 6a29 3b3c 2f64 6976 3e0a 3c64 6976 2063 j);
    .
    575 \n+00017750: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
    .<\n+00017790: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000177a0: 6e6f 223e 2020 3537 363c 2f73 7061 6e3e no\"> 576\n+000177b0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+000177d0: 7265 7475 726e 3c2f 7370 616e 3e20 7265 return re\n+000177e0: 7375 6c74 3b3c 2f64 6976 3e0a 3c64 6976 sult;
    .<\n+00017820: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00017830: 6e6f 223e 2020 3537 373c 2f73 7061 6e3e no\"> 577\n+00017840: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
    .<\n+00017880: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00017890: 6e6f 223e 2020 3537 383c 2f73 7061 6e3e no\"> 578\n+000178a0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+000178f0: 2020 3538 303c 2f73 7061 6e3e 2020 2020 580 \n+00017900: 3c73 7061 6e20 636c 6173 733d 226b 6579 template<int l&\n+00017950: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    581 \n+000179b0: 2020 4669 656c 644d 6174 7269 7826 6c74 FieldMatrix<\n+000179c0: 3b4b 2c6c 2c31 2667 743b 203c 6120 636c ;K,l,1> left\n+00017a20: 6d75 6c74 6970 6c79 616e 793c 2f61 3e20 multiplyany \n+00017a30: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (const FieldMatrix&\n+00017a60: 6c74 3b4b 2c6c 2c31 2667 743b 2661 6d70 lt;K,l,1>&\n+00017a70: 3b20 3c61 2063 6c61 7373 3d22 636f 6465 ; M) \n+00017ae0: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
    582\n+00017b40: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 \n+00017b60: 203c 2f73 7061 6e3e 7b3c 2f64 6976 3e0a {
    .\n+00017b70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00017c20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00017c30: 6e6f 223e 2020 3538 343c 2f73 7061 6e3e no\"> 584
    \n+00017c40: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+00017c60: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n+00017cc0: 5f74 7970 653c 2f61 3e20 6a3d 303b 206a _type j=0; j\n+00017cd0: 266c 743b 6c3b 206a 2b2b 293c 2f64 6976 <l; j++).
    585<\n+00017d30: 2f73 7061 6e3e 2020 2020 2020 2020 435b /span> C[\n+00017d40: 6a5d 5b30 5d20 3d20 3c61 2063 6c61 7373 j][0] = M[j\n+00017da0: 5d5b 305d 2a28 2a3c 7370 616e 2063 6c61 ][0]*(*thi\n+00017dc0: 733c 2f73 7061 6e3e 295b 305d 5b30 5d3b s)[0][0];\n+00017dd0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00017e20: 2035 3836 3c2f 7370 616e 3e20 2020 2020 586 \n+00017e30: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n+00017e50: 6e3c 2f73 7061 6e3e 2043 3b3c 2f64 6976 n C;.
    587<\n+00017eb0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    588<\n+00017f10: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n+00017f30: 3c61 2069 643d 226c 3030 3539 3022 206e 590 FieldMatr\n+00017fd0: 6978 3c2f 613e 2661 6d70 3b20 3c61 2063 ix& rig\n+00018030: 6874 6d75 6c74 6970 6c79 3c2f 613e 2028 htmultiply (\n+00018040: 3c73 7061 6e20 636c 6173 733d 226b 6579 const FieldMatrix<\n+000180c0: 2f61 3e26 616d 703b 203c 6120 636c 6173 /a>& M)\n+00018120: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00018170: 2035 3931 3c2f 7370 616e 3e20 2020 207b 591 {\n+00018180: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000181d0: 2035 3932 3c2f 7370 616e 3e20 2020 2020 592 \n+000181e0: 205f 6461 7461 5b30 5d20 2a3d 203c 6120 _data[0] *= M<\n+00018240: 2f61 3e5b 305d 5b30 5d3b 3c2f 6469 763e /a>[0][0];
    \n+00018250: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00018310: 6120 6964 3d22 6c30 3035 3934 2220 6e61 a id=\"l00594\" na\n+00018320: 6d65 3d22 6c30 3035 3934 223e 3c2f 613e me=\"l00594\">\n+00018330: 3c73 7061 6e20 636c 6173 733d 226c 696e 594 }
    .<\n+00018370: 6120 6964 3d22 6c30 3035 3935 2220 6e61 a id=\"l00595\" na\n+00018380: 6d65 3d22 6c30 3035 3935 223e 3c2f 613e me=\"l00595\">\n+00018390: 3c73 7061 6e20 636c 6173 733d 226c 696e 595
    .
    597 \n+00018410: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n+00018430: 2f73 7061 6e3e 266c 743b 3c73 7061 6e20 /span><int l\n+00018460: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    598 \n+000184c0: 2020 2046 6965 6c64 4d61 7472 6978 266c FieldMatrix&l\n+000184d0: 743b 4b2c 312c 6c26 6774 3b20 3c61 2063 t;K,1,l> rig\n+00018530: 6874 6d75 6c74 6970 6c79 616e 793c 2f61 htmultiplyany (const FieldMatri\n+00018570: 7826 6c74 3b4b 2c31 2c6c 2667 743b 2661 x<K,1,l>&a\n+00018580: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; M) const.
    5\n+00018650: 3939 3c2f 7370 616e 3e3c 7370 616e 2063 99 \n+00018670: 2020 203c 2f73 7061 6e3e 7b3c 2f64 6976 {.
    600<\n+000186d0: 2f73 7061 6e3e 2020 2020 2020 4669 656c /span> Fiel\n+000186e0: 644d 6174 7269 7826 6c74 3b4b 2c31 2c6c dMatrix<K,1,l\n+000186f0: 2667 743b 2043 3b3c 2f64 6976 3e0a 3c64 > C;
    .\n+00018710: 3c61 2069 643d 226c 3030 3630 3122 206e 601
    .
    602 \n+000187b0: 2020 2020 3c73 7061 6e20 636c 6173 733d fo\n+000187d0: 723c 2f73 7061 6e3e 2028 3c61 2063 6c61 r (size_t\n+00018830: 7970 653c 2f61 3e20 6a3d 303b 206a 266c ype j=0; j&l\n+00018840: 743b 6c3b 206a 2b2b 293c 2f64 6976 3e0a t;l; j++)
    .\n+00018850: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+00018880: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 603 C[0]\n+000188b0: 5b6a 5d20 3d20 3c61 2063 6c61 7373 3d22 [j] = M[0][\n+00018910: 6a5d 2a5f 6461 7461 5b30 5d3b 3c2f 6469 j]*_data[0];.
    604\n+00018970: 3c2f 7370 616e 3e20 2020 2020 203c 7370 return C;
    .\n+000189c0: 3c61 2069 643d 226c 3030 3630 3522 206e 605 }
    .\n+00018a20: 3c61 2069 643d 226c 3030 3630 3622 206e 606
    .
    607 \n+00018ac0: 2020 3c73 7061 6e20 636c 6173 733d 2263 // make \n+00018ae0: 7468 6973 2074 6869 6e67 2061 206d 6174 this thing a mat\n+00018af0: 7269 783c 2f73 7061 6e3e 3c2f 6469 763e rix
    \n+00018b00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00018b30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 608 s\n+00018b70: 7461 7469 633c 2f73 7061 6e3e 203c 7370 tatic constexpr size_type mat_rows(\n+00018c60: 2920 7b20 3c73 7061 6e20 636c 6173 733d ) { re\n+00018c80: 7475 726e 3c2f 7370 616e 3e20 313b 207d turn 1; }\n+00018c90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00018ce0: 2036 3039 3c2f 7370 616e 3e20 2020 203c 609 <\n+00018cf0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00018d00: 6f72 6422 3e73 7461 7469 633c 2f73 7061 ord\">static constex\n+00018d30: 7072 3c2f 7370 616e 3e20 3c61 2063 6c61 pr size_t\n+00018d90: 7970 653c 2f61 3e20 3c61 2063 6c61 7373 ype mat_col\n+00018df0: 733c 2f61 3e28 2920 7b20 3c73 7061 6e20 s() { return 1; }
    .<\n+00018e40: 6120 6964 3d22 6c30 3036 3130 2220 6e61 a id=\"l00610\" na\n+00018e50: 6d65 3d22 6c30 3036 3130 223e 3c2f 613e me=\"l00610\">\n+00018e60: 3c73 7061 6e20 636c 6173 733d 226c 696e 610
    ..<\n+00019050: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00019060: 6e6f 223e 2020 3631 323c 2f73 7061 6e3e no\"> 612\n+00019070: 2020 2020 7b3c 2f64 6976 3e0a 3c64 6976 {
    .<\n+000190b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000190c0: 6e6f 223e 2020 3631 333c 2f73 7061 6e3e no\"> 613\n+000190d0: 2020 2020 2020 3c61 2063 6c61 7373 3d22 DUNE_ASSER\n+00019130: 545f 424f 554e 4453 3c2f 613e 2869 203d T_BOUNDS(i =\n+00019140: 3d20 3029 3b3c 2f64 6976 3e0a 3c64 6976 = 0);
    .<\n+00019180: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00019190: 6e6f 223e 2020 3631 343c 2f73 7061 6e3e no\"> 614\n+000191a0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+000191c0: 7265 7475 726e 3c2f 7370 616e 3e20 5f64 return _d\n+000191d0: 6174 613b 3c2f 6469 763e 0a3c 6469 7620 ata;
    .
    615 \n+00019230: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
    .
    616 \n+00019290: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000192e0: 2036 3137 3c2f 7370 616e 3e20 2020 203c 617 <\n+000192f0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00019300: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef\" href=\"\n+00019310: 6130 3134 3038 2e68 746d 6c23 6132 3930 a01408.html#a290\n+00019320: 6430 6236 3937 3131 6439 6538 6166 3137 d0b69711d9e8af17\n+00019330: 3833 6263 3533 3232 6664 6334 6522 3e63 83bc5322fdc4e\">c\n+00019340: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n+00019350: 6365 3c2f 613e 203c 6120 636c 6173 733d ce mat_acce\n+000193b0: 7373 3c2f 613e 2028 5b5b 6d61 7962 655f ss ([[maybe_\n+000193c0: 756e 7573 6564 5d5d 203c 6120 636c 6173 unused]] size_ty\n+00019420: 7065 3c2f 613e 2069 293c 7370 616e 2063 pe i) \n+00019440: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
    618\n+000194a0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 \n+000194c0: 203c 2f73 7061 6e3e 7b3c 2f64 6976 3e0a {
    .\n+000194d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+000195a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00019630: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00019640: 3e3c 6120 6964 3d22 6c30 3036 3231 2220 > 621 }
    .<\n+00019690: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000196a0: 3e3c 6120 6964 3d22 6c30 3036 3232 2220 > 622
    .
    624 \n+00019740: 2020 203c 6120 636c 6173 733d 2263 6f64 FieldMatrix<\n+000197a0: 2f61 3e26 616d 703b 203c 6120 636c 6173 /a>& operat\n+00019800: 6f72 2b3d 203c 2f61 3e28 3c73 7061 6e20 or+= (\n+00019820: 636f 6e73 743c 2f73 7061 6e3e 204b 2661 const K&a\n+00019830: 6d70 3b20 6b29 3c2f 6469 763e 0a3c 6469 mp; k)
    .<\n+00019850: 6120 6964 3d22 6c30 3036 3235 2220 6e61 a id=\"l00625\" na\n+00019860: 6d65 3d22 6c30 3036 3235 223e 3c2f 613e me=\"l00625\">\n+00019870: 3c73 7061 6e20 636c 6173 733d 226c 696e 625 {
    .<\n+000198b0: 6120 6964 3d22 6c30 3036 3236 2220 6e61 a id=\"l00626\" na\n+000198c0: 6d65 3d22 6c30 3036 3236 223e 3c2f 613e me=\"l00626\">\n+000198d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 626 _data[0] \n+00019900: 2b3d 206b 3b3c 2f64 6976 3e0a 3c64 6976 += k;
    .<\n+00019940: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00019950: 6e6f 223e 2020 3632 373c 2f73 7061 6e3e no\"> 627\n+00019960: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+00019980: 7265 7475 726e 3c2f 7370 616e 3e20 282a return (*\n+00019990: 3c73 7061 6e20 636c 6173 733d 226b 6579 this);
    .
    628 \n+00019a10: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    629 <\n+00019a70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00019ac0: 3633 313c 2f73 7061 6e3e 2020 2020 3c61 631 F\n+00019b20: 6965 6c64 4d61 7472 6978 3c2f 613e 2661 ieldMatrix&a\n+00019b30: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; operator-= \n+00019b90: 3c2f 613e 283c 7370 616e 2063 6c61 7373 (const\n+00019bb0: 3c2f 7370 616e 3e20 4b26 616d 703b 206b K& k\n+00019bc0: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
    .
    \n+00019c10: 2020 3633 323c 2f73 7061 6e3e 2020 2020 632 \n+00019c20: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n+00019c70: 2020 3633 333c 2f73 7061 6e3e 2020 2020 633 \n+00019c80: 2020 5f64 6174 615b 305d 202d 3d20 6b3b _data[0] -= k;\n+00019c90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00019ce0: 2036 3334 3c2f 7370 616e 3e20 2020 2020 634 \n+00019cf0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n+00019d10: 6e3c 2f73 7061 6e3e 2028 2a3c 7370 616e n (*this);.
    6\n+00019d90: 3335 3c2f 7370 616e 3e20 2020 207d 3c2f 35 }.
    6\n+00019df0: 3336 3c2f 7370 616e 3e20 3c2f 6469 763e 36
    \n+00019e00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00019e30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 638 FieldM\n+00019eb0: 6174 7269 783c 2f61 3e26 616d 703b 203c atrix& <\n+00019ec0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00019ed0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function\" href=\n+00019ee0: 2261 3031 3430 302e 6874 6d6c 2361 3732 \"a01400.html#a72\n+00019ef0: 3162 3262 6334 6432 3239 3538 6561 3562 1b2bc4d22958ea5b\n+00019f00: 3037 6165 3535 3935 6636 3239 3537 223e 07ae5595f62957\">\n+00019f10: 6f70 6572 6174 6f72 2a3d 203c 2f61 3e28 operator*= (\n+00019f20: 3c73 7061 6e20 636c 6173 733d 226b 6579 const K& k).
    639\n+00019fa0: 3c2f 7370 616e 3e20 2020 207b 3c2f 6469 {.
    640\n+0001a000: 3c2f 7370 616e 3e20 2020 2020 205f 6461 _da\n+0001a010: 7461 5b30 5d20 2a3d 206b 3b3c 2f64 6976 ta[0] *= k;.
    641<\n+0001a070: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return (*this\n+0001a0c0: 3c2f 7370 616e 3e29 3b3c 2f64 6976 3e0a );
    .\n+0001a0d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+0001a130: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+0001a1c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0001a1d0: 6e6f 223e 2020 3634 353c 2f73 7061 6e3e no\"> 645\n+0001a1e0: 2020 2020 3c61 2063 6c61 7373 3d22 636f FieldMatrix\n+0001a240: 3c2f 613e 2661 6d70 3b20 3c61 2063 6c61 & opera\n+0001a2a0: 746f 722f 3d20 3c2f 613e 283c 7370 616e tor/= (const K&\n+0001a2d0: 616d 703b 206b 293c 2f64 6976 3e0a 3c64 amp; k)
    .\n+0001a2f0: 3c61 2069 643d 226c 3030 3634 3622 206e 646 {
    .\n+0001a350: 3c61 2069 643d 226c 3030 3634 3722 206e 647 _data[0]\n+0001a3a0: 202f 3d20 6b3b 3c2f 6469 763e 0a3c 6469 /= k;
    .<\n+0001a3c0: 6120 6964 3d22 6c30 3036 3438 2220 6e61 a id=\"l00648\" na\n+0001a3d0: 6d65 3d22 6c30 3036 3438 223e 3c2f 613e me=\"l00648\">\n+0001a3e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 648 return (\n+0001a430: 2a3c 7370 616e 2063 6c61 7373 3d22 6b65 *this);
    .
    649 \n+0001a4b0: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
    .
    650 \n+0001a510: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001a560: 2036 3531 3c2f 7370 616e 3e20 2020 203c 651 <\n+0001a570: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class=\"comm\n+0001a580: 656e 7422 3e2f 2f3d 3d3d 3d3d 2063 6f6e ent\">//===== con\n+0001a590: 7665 7273 696f 6e20 6f70 6572 6174 6f72 version operator\n+0001a5a0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
    .\n+0001a5c0: 3c61 2069 643d 226c 3030 3635 3222 206e 652
    .
    653 \n+0001a660: 2020 3c73 7061 6e20 636c 6173 733d 226b operator\n+0001a680: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c co\n+0001a6a0: 6e73 743c 2f73 7061 6e3e 204b 2661 6d70 nst K&\n+0001a6b0: 3b20 2829 203c 7370 616e 2063 6c61 7373 ; () const\n+0001a6d0: 3c2f 7370 616e 3e20 7b20 3c73 7061 6e20 { return _data[0]; }.
    65\n+0001a760: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n+0001a770: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+0001a7d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001a7e0: 3e3c 6120 6964 3d22 6c30 3036 3536 2220 > 656
    .
    658 \n+0001a880: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n+0001a8a0: 2f73 7061 6e3e 266c 743b 3c73 7061 6e20 /span><\n+0001a8c0: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n+0001a8d0: 4b26 6774 3b3c 2f64 6976 3e0a 3c64 6976 K>
    .<\n+0001a910: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0001a920: 6e6f 223e 2020 3635 393c 2f73 7061 6e3e no\"> 659\n+0001a930: 2020 7374 643a 3a6f 7374 7265 616d 2661 std::ostream&a\n+0001a940: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; operator&l\n+0001a9a0: 743b 266c 743b 203c 2f61 3e28 7374 643a t;< (std:\n+0001a9b0: 3a6f 7374 7265 616d 2661 6d70 3b20 732c :ostream& s,\n+0001a9c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const FieldMatrix&\n+0001a9f0: 6c74 3b4b 2c31 2c31 2667 743b 2661 6d70 lt;K,1,1>&\n+0001aa00: 3b20 6129 3c2f 6469 763e 0a3c 6469 7620 ; a)
    .
    660 \n+0001aa60: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    661 \n+0001aac0: 2073 2026 6c74 3b26 6c74 3b20 615b 305d s << a[0]\n+0001aad0: 5b30 5d3b 3c2f 6469 763e 0a3c 6469 7620 [0];
    .
    662 \n+0001ab30: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n+0001ab50: 7572 6e3c 2f73 7061 6e3e 2073 3b3c 2f64 urn s;.
    66\n+0001abb0: 333c 2f73 7061 6e3e 2020 7d3c 2f64 6976 3 }.
    664<\n+0001ac10: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n+0001ac30: 3c61 2069 643d 226c 3030 3636 3522 206e 665#en\n+0001ac90: 6469 6620 3c2f 7370 616e 3e3c 7370 616e dif // DOXYGEN
    .
    666 .
    .
    667<\n+0001ade0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> na\n+0001ae00: 6d65 7370 6163 6520 3c2f 7370 616e 3e46 mespace F\n+0001ae10: 4d61 7472 6978 4865 6c70 207b 3c2f 6469 MatrixHelp {.
    668\n+0001ae70: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+0001ae80: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001ae90: 3e3c 6120 6964 3d22 6c30 3036 3730 2220 > 670 tem\n+0001aef0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n+0001af00: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;typename<\n+0001af20: 2f73 7061 6e3e 204b 2667 743b 3c2f 6469 /span> K>.
    .
    671<\n+0001b010: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+0001b030: 7374 6174 6963 3c2f 7370 616e 3e20 3c73 static inline K invertMatri\n+0001b0c0: 783c 2f61 3e20 283c 7370 616e 2063 6c61 x (con\n+0001b0e0: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st FieldMatri\n+0001b120: 7826 6c74 3b4b 2c31 2c31 2667 743b 3c2f x<K,1,1> &matrix, \n+0001b140: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n+0001b170: 644d 6174 7269 7826 6c74 3b4b 2c31 2c31 dMatrix<K,1,1\n+0001b180: 2667 743b 3c2f 613e 2026 616d 703b 696e > &in\n+0001b190: 7665 7273 6529 3c2f 6469 763e 0a3c 6469 verse)
    .<\n+0001b1b0: 6120 6964 3d22 6c30 3036 3732 2220 6e61 a id=\"l00672\" na\n+0001b1c0: 6d65 3d22 6c30 3036 3732 223e 3c2f 613e me=\"l00672\">\n+0001b1d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 672 {
    .<\n+0001b210: 6120 6964 3d22 6c30 3036 3733 2220 6e61 a id=\"l00673\" na\n+0001b220: 6d65 3d22 6c30 3036 3733 223e 3c2f 613e me=\"l00673\">\n+0001b230: 3c73 7061 6e20 636c 6173 733d 226c 696e 673 usi\n+0001b270: 6e67 203c 2f73 7061 6e3e 7265 616c 5f74 ng real_t\n+0001b280: 7970 6520 3d20 3c73 7061 6e20 636c 6173 ype = type\n+0001b2a0: 6e61 6d65 3c2f 7370 616e 3e20 3c61 2063 name Fiel\n+0001b300: 6454 7261 6974 7326 6c74 3b4b 2667 743b dTraits<K>\n+0001b310: 3a3a 7265 616c 5f74 7970 653c 2f61 3e3b ::real_type;\n+0001b320: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001b370: 2036 3734 3c2f 7370 616e 3e20 2020 2020 674 \n+0001b380: 2069 6e76 6572 7365 5b30 5d5b 305d 203d inverse[0][0] =\n+0001b390: 2072 6561 6c5f 7479 7065 2831 2e30 292f real_type(1.0)/\n+0001b3a0: 6d61 7472 6978 5b30 5d5b 305d 3b3c 2f64 matrix[0][0];.
    67\n+0001b400: 353c 2f73 7061 6e3e 2020 2020 2020 3c73 5 return matrix[0][\n+0001b440: 305d 3b3c 2f64 6976 3e0a 3c64 6976 2063 0];
    .
    676 \n+0001b4a0: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
    .
    \n+0001b4b0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+0001b520: 6120 6964 3d22 6c30 3036 3739 2220 6e61 a id=\"l00679\" na\n+0001b530: 6d65 3d22 6c30 3036 3739 223e 3c2f 613e me=\"l00679\">\n+0001b540: 3c73 7061 6e20 636c 6173 733d 226c 696e 679 templ\n+0001b580: 6174 653c 2f73 7061 6e3e 2026 6c74 3b3c ate <<\n+0001b590: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0001b5a0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord\">typename K>
    \n+0001b5c0: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
    .
    <\n+0001b650: 6120 636c 6173 733d 226c 696e 6522 2068 a class=\"line\" h\n+0001b660: 7265 663d 2261 3030 3433 362e 6874 6d6c ref=\"a00436.html\n+0001b670: 2361 3637 3135 3538 3135 6230 3334 3737 #a67155815b03477\n+0001b680: 3331 3239 6432 3162 6665 3339 3932 6630 3129d21bfe3992f0\n+0001b690: 6236 223e 2020 3638 303c 2f61 3e3c 2f73 b6\"> 680 st\n+0001b6c0: 6174 6963 3c2f 7370 616e 3e20 3c73 7061 atic inline \n+0001b6f0: 4b20 3c61 2063 6c61 7373 3d22 636f 6465 K invertMatrix_\n+0001b750: 7265 7454 7261 6e73 706f 7365 643c 2f61 retTransposed (const FieldMatrix<\n+0001b7c0: 3b4b 2c31 2c31 2667 743b 3c2f 613e 2026 ;K,1,1> &\n+0001b7d0: 616d 703b 6d61 7472 6978 2c20 3c61 2063 amp;matrix, FieldMat\n+0001b810: 7269 7826 6c74 3b4b 2c31 2c31 2667 743b rix<K,1,1>\n+0001b820: 3c2f 613e 2026 616d 703b 696e 7665 7273 &invers\n+0001b830: 6529 3c2f 6469 763e 0a3c 6469 7620 636c e)
    .
    681 \n+0001b890: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    682 \n+0001b8f0: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n+0001b910: 7572 6e3c 2f73 7061 6e3e 203c 6120 636c urn inve\n+0001b970: 7274 4d61 7472 6978 3c2f 613e 286d 6174 rtMatrix(mat\n+0001b980: 7269 782c 696e 7665 7273 6529 3b3c 2f64 rix,inverse);.
    68\n+0001b9e0: 333c 2f73 7061 6e3e 2020 2020 7d3c 2f64 3 }.
    .
    684 \n+0001ba50: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001baa0: 2036 3835 3c2f 7370 616e 3e20 3c2f 6469 685 .
    687\n+0001bb00: 3c2f 7370 616e 3e20 2020 203c 7370 616e template\n+0001bb30: 2026 6c74 3b3c 7370 616e 2063 6c61 7373 <typen\n+0001bb50: 616d 653c 2f73 7061 6e3e 204b 2667 743b ame K>\n+0001bb60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    .<\n+0001bbc0: 6120 6964 3d22 6c30 3036 3838 2220 6e61 a id=\"l00688\" na\n+0001bbd0: 6d65 3d22 6c30 3036 3838 223e 3c2f 613e me=\"l00688\">\n+0001bbe0: 3c73 7061 6e20 636c 6173 733d 226c 696e 688<\n+0001bc40: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c73 /a> static inline K invertM\n+0001bcf0: 6174 7269 783c 2f61 3e20 283c 7370 616e atrix (const FieldM\n+0001bd50: 6174 7269 7826 6c74 3b4b 2c32 2c32 2667 atrix<K,2,2&g\n+0001bd60: 743b 3c2f 613e 2026 616d 703b 6d61 7472 t; &matr\n+0001bd70: 6978 2c20 3c61 2063 6c61 7373 3d22 636f ix, \n+0001bda0: 4669 656c 644d 6174 7269 7826 6c74 3b4b FieldMatrix<K\n+0001bdb0: 2c32 2c32 2667 743b 3c2f 613e 2026 616d ,2,2> &am\n+0001bdc0: 703b 696e 7665 7273 6529 3c2f 6469 763e p;inverse)
    \n+0001bdd0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n+0001be30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0001be60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 690 using re\n+0001beb0: 616c 5f74 7970 6520 3d20 3c73 7061 6e20 al_type = \n+0001bed0: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n+0001bee0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 \n+0001bf30: 4669 656c 6454 7261 6974 7326 6c74 3b4b FieldTraits<K\n+0001bf40: 2667 743b 3a3a 7265 616c 5f74 7970 653c >::real_type<\n+0001bf50: 2f61 3e3b 3c2f 6469 763e 0a3c 6469 7620 /a>;
    .
    691 \n+0001bfb0: 2020 2020 203c 7370 616e 2063 6c61 7373 // co\n+0001bfd0: 6465 2067 656e 6572 6174 6564 2062 7920 de generated by \n+0001bfe0: 6d61 706c 653c 2f73 7061 6e3e 3c2f 6469 maple.
    692\n+0001c040: 3c2f 7370 616e 3e20 2020 2020 204b 2064 K d\n+0001c050: 6574 203d 2028 6d61 7472 6978 5b30 5d5b et = (matrix[0][\n+0001c060: 305d 2a6d 6174 7269 785b 315d 5b31 5d20 0]*matrix[1][1] \n+0001c070: 2d20 6d61 7472 6978 5b30 5d5b 315d 2a6d - matrix[0][1]*m\n+0001c080: 6174 7269 785b 315d 5b30 5d29 3b3c 2f64 atrix[1][0]);.
    69\n+0001c0e0: 333c 2f73 7061 6e3e 2020 2020 2020 4b20 3 K \n+0001c0f0: 6465 745f 3120 3d20 7265 616c 5f74 7970 det_1 = real_typ\n+0001c100: 6528 312e 3029 2f64 6574 3b3c 2f64 6976 e(1.0)/det;.
    694<\n+0001c160: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n+0001c170: 7273 655b 305d 5b30 5d20 3d20 2020 6d61 rse[0][0] = ma\n+0001c180: 7472 6978 5b31 5d5b 315d 202a 2064 6574 trix[1][1] * det\n+0001c190: 5f31 3b3c 2f64 6976 3e0a 3c64 6976 2063 _1;
    .
    695 \n+0001c1f0: 2020 2020 696e 7665 7273 655b 305d 5b31 inverse[0][1\n+0001c200: 5d20 3d20 2d20 6d61 7472 6978 5b30 5d5b ] = - matrix[0][\n+0001c210: 315d 202a 2064 6574 5f31 3b3c 2f64 6976 1] * det_1;.
    696<\n+0001c270: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n+0001c280: 7273 655b 315d 5b30 5d20 3d20 2d20 6d61 rse[1][0] = - ma\n+0001c290: 7472 6978 5b31 5d5b 305d 202a 2064 6574 trix[1][0] * det\n+0001c2a0: 5f31 3b3c 2f64 6976 3e0a 3c64 6976 2063 _1;
    .
    697 \n+0001c300: 2020 2020 696e 7665 7273 655b 315d 5b31 inverse[1][1\n+0001c310: 5d20 3d20 2020 6d61 7472 6978 5b30 5d5b ] = matrix[0][\n+0001c320: 305d 202a 2064 6574 5f31 3b3c 2f64 6976 0] * det_1;.
    698<\n+0001c380: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return det;
    .<\n+0001c3c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001c3d0: 3e3c 6120 6964 3d22 6c30 3036 3939 2220 > 699 }
    .<\n+0001c420: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001c470: 3730 303c 2f73 7061 6e3e 203c 2f64 6976 700 .
    703<\n+0001c4d0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+0001c4f0: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n+0001c500: 266c 743b 3c73 7061 6e20 636c 6173 733d <typena\n+0001c520: 6d65 3c2f 7370 616e 3e20 4b26 6774 3b3c me K><\n+0001c530: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>..\n+0001c7c0: 3c61 2069 643d 226c 3030 3730 3522 206e 705 {
    .\n+0001c820: 3c61 2069 643d 226c 3030 3730 3622 206e 706 us\n+0001c880: 696e 6720 3c2f 7370 616e 3e72 6561 6c5f ing real_\n+0001c890: 7479 7065 203d 203c 7370 616e 2063 6c61 type = typ\n+0001c8b0: 656e 616d 653c 2f73 7061 6e3e 203c 6120 ename Fie\n+0001c910: 6c64 5472 6169 7473 266c 743b 4b26 6774 ldTraits<K>\n+0001c920: 3b3a 3a72 6561 6c5f 7479 7065 3c2f 613e ;::real_type\n+0001c930: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+0001c980: 2020 3730 373c 2f73 7061 6e3e 2020 2020 707 \n+0001c990: 2020 3c73 7061 6e20 636c 6173 733d 2263 // code \n+0001c9b0: 6765 6e65 7261 7465 6420 6279 206d 6170 generated by map\n+0001c9c0: 6c65 3c2f 7370 616e 3e3c 2f64 6976 3e0a le
    .\n+0001c9d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 \n+0001ca70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0001caa0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 709 K det\n+0001cad0: 5f31 203d 2072 6561 6c5f 7479 7065 2831 _1 = real_type(1\n+0001cae0: 2e30 292f 6465 743b 3c2f 6469 763e 0a3c .0)/det;
    .<\n+0001caf0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001cb00: 3e3c 6120 6964 3d22 6c30 3037 3130 2220 > 710 inverse\n+0001cb50: 5b30 5d5b 305d 203d 2020 206d 6174 7269 [0][0] = matri\n+0001cb60: 785b 315d 5b31 5d20 2a20 6465 745f 313b x[1][1] * det_1;\n+0001cb70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001cbc0: 2037 3131 3c2f 7370 616e 3e20 2020 2020 711 \n+0001cbd0: 2069 6e76 6572 7365 5b31 5d5b 305d 203d inverse[1][0] =\n+0001cbe0: 202d 206d 6174 7269 785b 305d 5b31 5d20 - matrix[0][1] \n+0001cbf0: 2a20 6465 745f 313b 3c2f 6469 763e 0a3c * det_1;
    .<\n+0001cc00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001cc10: 3e3c 6120 6964 3d22 6c30 3037 3132 2220 > 712 inverse\n+0001cc60: 5b30 5d5b 315d 203d 202d 206d 6174 7269 [0][1] = - matri\n+0001cc70: 785b 315d 5b30 5d20 2a20 6465 745f 313b x[1][0] * det_1;\n+0001cc80: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001ccd0: 2037 3133 3c2f 7370 616e 3e20 2020 2020 713 \n+0001cce0: 2069 6e76 6572 7365 5b31 5d5b 315d 203d inverse[1][1] =\n+0001ccf0: 2020 206d 6174 7269 785b 305d 5b30 5d20 matrix[0][0] \n+0001cd00: 2a20 6465 745f 313b 3c2f 6469 763e 0a3c * det_1;
    .<\n+0001cd10: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001cd20: 3e3c 6120 6964 3d22 6c30 3037 3134 2220 > 714 return\n+0001cd90: 2064 6574 3b3c 2f64 6976 3e0a 3c64 6976 det;
    .<\n+0001cdd0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0001cde0: 6e6f 223e 2020 3731 353c 2f73 7061 6e3e no\"> 715\n+0001cdf0: 2020 2020 7d3c 2f64 6976 3e0a 3c2f 6469 }
    ..
    716\n+0001ce50: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n+0001ce60: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001ce70: 3e3c 6120 6964 3d22 6c30 3037 3138 2220 > 718 tem\n+0001ced0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n+0001cee0: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;typename<\n+0001cf00: 2f73 7061 6e3e 204b 2667 743b 3c2f 6469 /span> K>.
    .
    719<\n+0001cff0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+0001d010: 7374 6174 6963 3c2f 7370 616e 3e20 3c73 static inline K invertMatri\n+0001d0a0: 783c 2f61 3e20 283c 7370 616e 2063 6c61 x (con\n+0001d0c0: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st FieldMatri\n+0001d100: 7826 6c74 3b4b 2c33 2c33 2667 743b 3c2f x<K,3,3> &matrix, \n+0001d120: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n+0001d150: 644d 6174 7269 7826 6c74 3b4b 2c33 2c33 dMatrix<K,3,3\n+0001d160: 2667 743b 3c2f 613e 2026 616d 703b 696e > &in\n+0001d170: 7665 7273 6529 3c2f 6469 763e 0a3c 6469 verse)
    .<\n+0001d190: 6120 6964 3d22 6c30 3037 3230 2220 6e61 a id=\"l00720\" na\n+0001d1a0: 6d65 3d22 6c30 3037 3230 223e 3c2f 613e me=\"l00720\">\n+0001d1b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 720 {
    .<\n+0001d1f0: 6120 6964 3d22 6c30 3037 3231 2220 6e61 a id=\"l00721\" na\n+0001d200: 6d65 3d22 6c30 3037 3231 223e 3c2f 613e me=\"l00721\">\n+0001d210: 3c73 7061 6e20 636c 6173 733d 226c 696e 721 usi\n+0001d250: 6e67 203c 2f73 7061 6e3e 7265 616c 5f74 ng real_t\n+0001d260: 7970 6520 3d20 3c73 7061 6e20 636c 6173 ype = type\n+0001d280: 6e61 6d65 3c2f 7370 616e 3e20 3c61 2063 name Fiel\n+0001d2e0: 6454 7261 6974 7326 6c74 3b4b 2667 743b dTraits<K>\n+0001d2f0: 3a3a 7265 616c 5f74 7970 653c 2f61 3e3b ::real_type;\n+0001d300: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001d350: 2037 3232 3c2f 7370 616e 3e20 2020 2020 722 \n+0001d360: 203c 7370 616e 2063 6c61 7373 3d22 636f // code g\n+0001d380: 656e 6572 6174 6564 2062 7920 6d61 706c enerated by mapl\n+0001d390: 653c 2f73 7061 6e3e 3c2f 6469 763e 0a3c e
    .<\n+0001d3a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001d3b0: 3e3c 6120 6964 3d22 6c30 3037 3233 2220 > 723 K t4 =\n+0001d400: 206d 6174 7269 785b 305d 5b30 5d20 2a20 matrix[0][0] * \n+0001d410: 6d61 7472 6978 5b31 5d5b 315d 3b3c 2f64 matrix[1][1];.
    72\n+0001d470: 343c 2f73 7061 6e3e 2020 2020 2020 4b20 4 K \n+0001d480: 7436 2020 3d20 6d61 7472 6978 5b30 5d5b t6 = matrix[0][\n+0001d490: 305d 202a 206d 6174 7269 785b 315d 5b32 0] * matrix[1][2\n+0001d4a0: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
    .
    725 \n+0001d500: 2020 204b 2074 3820 203d 206d 6174 7269 K t8 = matri\n+0001d510: 785b 305d 5b31 5d20 2a20 6d61 7472 6978 x[0][1] * matrix\n+0001d520: 5b31 5d5b 305d 3b3c 2f64 6976 3e0a 3c64 [1][0];
    .\n+0001d540: 3c61 2069 643d 226c 3030 3732 3622 206e 726 K t10 = \n+0001d590: 6d61 7472 6978 5b30 5d5b 325d 202a 206d matrix[0][2] * m\n+0001d5a0: 6174 7269 785b 315d 5b30 5d3b 3c2f 6469 atrix[1][0];.
    727\n+0001d600: 3c2f 7370 616e 3e20 2020 2020 204b 2074 K t\n+0001d610: 3132 203d 206d 6174 7269 785b 305d 5b31 12 = matrix[0][1\n+0001d620: 5d20 2a20 6d61 7472 6978 5b32 5d5b 305d ] * matrix[2][0]\n+0001d630: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+0001d680: 2020 3732 383c 2f73 7061 6e3e 2020 2020 728 \n+0001d690: 2020 4b20 7431 3420 3d20 6d61 7472 6978 K t14 = matrix\n+0001d6a0: 5b30 5d5b 325d 202a 206d 6174 7269 785b [0][2] * matrix[\n+0001d6b0: 325d 5b30 5d3b 3c2f 6469 763e 0a3c 6469 2][0];
    .<\n+0001d6d0: 6120 6964 3d22 6c30 3037 3239 2220 6e61 a id=\"l00729\" na\n+0001d6e0: 6d65 3d22 6c30 3037 3239 223e 3c2f 613e me=\"l00729\">\n+0001d6f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 729
    .
    730 \n+0001d770: 2020 204b 2064 6574 203d 2028 7434 2a6d K det = (t4*m\n+0001d780: 6174 7269 785b 325d 5b32 5d2d 7436 2a6d atrix[2][2]-t6*m\n+0001d790: 6174 7269 785b 325d 5b31 5d2d 7438 2a6d atrix[2][1]-t8*m\n+0001d7a0: 6174 7269 785b 325d 5b32 5d2b 3c2f 6469 atrix[2][2]+.
    731\n+0001d800: 3c2f 7370 616e 3e20 2020 2020 2020 2020 \n+0001d810: 2020 2020 2020 7431 302a 6d61 7472 6978 t10*matrix\n+0001d820: 5b32 5d5b 315d 2b74 3132 2a6d 6174 7269 [2][1]+t12*matri\n+0001d830: 785b 315d 5b32 5d2d 7431 342a 6d61 7472 x[1][2]-t14*matr\n+0001d840: 6978 5b31 5d5b 315d 293b 3c2f 6469 763e ix[1][1]);
    \n+0001d850: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0001d880: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 732 K t17\n+0001d8b0: 203d 2072 6561 6c5f 7479 7065 2831 2e30 = real_type(1.0\n+0001d8c0: 292f 6465 743b 3c2f 6469 763e 0a3c 6469 )/det;
    .<\n+0001d8e0: 6120 6964 3d22 6c30 3037 3333 2220 6e61 a id=\"l00733\" na\n+0001d8f0: 6d65 3d22 6c30 3037 3333 223e 3c2f 613e me=\"l00733\">\n+0001d900: 3c73 7061 6e20 636c 6173 733d 226c 696e 733
    .
    734 \n+0001d980: 2020 2069 6e76 6572 7365 5b30 5d5b 305d inverse[0][0]\n+0001d990: 203d 2020 286d 6174 7269 785b 315d 5b31 = (matrix[1][1\n+0001d9a0: 5d20 2a20 6d61 7472 6978 5b32 5d5b 325d ] * matrix[2][2]\n+0001d9b0: 202d 206d 6174 7269 785b 315d 5b32 5d20 - matrix[1][2] \n+0001d9c0: 2a20 6d61 7472 6978 5b32 5d5b 315d 292a * matrix[2][1])*\n+0001d9d0: 7431 373b 3c2f 6469 763e 0a3c 6469 7620 t17;
    .
    735 \n+0001da30: 2020 2020 2069 6e76 6572 7365 5b30 5d5b inverse[0][\n+0001da40: 315d 203d 202d 286d 6174 7269 785b 305d 1] = -(matrix[0]\n+0001da50: 5b31 5d20 2a20 6d61 7472 6978 5b32 5d5b [1] * matrix[2][\n+0001da60: 325d 202d 206d 6174 7269 785b 305d 5b32 2] - matrix[0][2\n+0001da70: 5d20 2a20 6d61 7472 6978 5b32 5d5b 315d ] * matrix[2][1]\n+0001da80: 292a 7431 373b 3c2f 6469 763e 0a3c 6469 )*t17;
    .<\n+0001daa0: 6120 6964 3d22 6c30 3037 3336 2220 6e61 a id=\"l00736\" na\n+0001dab0: 6d65 3d22 6c30 3037 3336 223e 3c2f 613e me=\"l00736\">\n+0001dac0: 3c73 7061 6e20 636c 6173 733d 226c 696e 736 inverse[0\n+0001daf0: 5d5b 325d 203d 2020 286d 6174 7269 785b ][2] = (matrix[\n+0001db00: 305d 5b31 5d20 2a20 6d61 7472 6978 5b31 0][1] * matrix[1\n+0001db10: 5d5b 325d 202d 206d 6174 7269 785b 305d ][2] - matrix[0]\n+0001db20: 5b32 5d20 2a20 6d61 7472 6978 5b31 5d5b [2] * matrix[1][\n+0001db30: 315d 292a 7431 373b 3c2f 6469 763e 0a3c 1])*t17;
    .<\n+0001db40: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001db50: 3e3c 6120 6964 3d22 6c30 3037 3337 2220 > 737 inverse\n+0001dba0: 5b31 5d5b 305d 203d 202d 286d 6174 7269 [1][0] = -(matri\n+0001dbb0: 785b 315d 5b30 5d20 2a20 6d61 7472 6978 x[1][0] * matrix\n+0001dbc0: 5b32 5d5b 325d 202d 206d 6174 7269 785b [2][2] - matrix[\n+0001dbd0: 315d 5b32 5d20 2a20 6d61 7472 6978 5b32 1][2] * matrix[2\n+0001dbe0: 5d5b 305d 292a 7431 373b 3c2f 6469 763e ][0])*t17;
    \n+0001dbf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0001dc20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 738 inver\n+0001dc50: 7365 5b31 5d5b 315d 203d 2020 286d 6174 se[1][1] = (mat\n+0001dc60: 7269 785b 305d 5b30 5d20 2a20 6d61 7472 rix[0][0] * matr\n+0001dc70: 6978 5b32 5d5b 325d 202d 2074 3134 2920 ix[2][2] - t14) \n+0001dc80: 2a20 7431 373b 3c2f 6469 763e 0a3c 6469 * t17;
    .<\n+0001dca0: 6120 6964 3d22 6c30 3037 3339 2220 6e61 a id=\"l00739\" na\n+0001dcb0: 6d65 3d22 6c30 3037 3339 223e 3c2f 613e me=\"l00739\">\n+0001dcc0: 3c73 7061 6e20 636c 6173 733d 226c 696e 739 inverse[1\n+0001dcf0: 5d5b 325d 203d 202d 2874 362d 7431 3029 ][2] = -(t6-t10)\n+0001dd00: 202a 2074 3137 3b3c 2f64 6976 3e0a 3c64 * t17;
    .\n+0001dd20: 3c61 2069 643d 226c 3030 3734 3022 206e 740 inverse[\n+0001dd70: 325d 5b30 5d20 3d20 2028 6d61 7472 6978 2][0] = (matrix\n+0001dd80: 5b31 5d5b 305d 202a 206d 6174 7269 785b [1][0] * matrix[\n+0001dd90: 325d 5b31 5d20 2d20 6d61 7472 6978 5b31 2][1] - matrix[1\n+0001dda0: 5d5b 315d 202a 206d 6174 7269 785b 325d ][1] * matrix[2]\n+0001ddb0: 5b30 5d29 202a 2074 3137 3b3c 2f64 6976 [0]) * t17;.
    741<\n+0001de10: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n+0001de20: 7273 655b 325d 5b31 5d20 3d20 2d28 6d61 rse[2][1] = -(ma\n+0001de30: 7472 6978 5b30 5d5b 305d 202a 206d 6174 trix[0][0] * mat\n+0001de40: 7269 785b 325d 5b31 5d20 2d20 7431 3229 rix[2][1] - t12)\n+0001de50: 202a 2074 3137 3b3c 2f64 6976 3e0a 3c64 * t17;
    .\n+0001de70: 3c61 2069 643d 226c 3030 3734 3222 206e 742 inverse[\n+0001dec0: 325d 5b32 5d20 3d20 2028 7434 2d74 3829 2][2] = (t4-t8)\n+0001ded0: 202a 2074 3137 3b3c 2f64 6976 3e0a 3c64 * t17;
    .\n+0001def0: 3c61 2069 643d 226c 3030 3734 3322 206e 743
    .
    744 \n+0001df90: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n+0001dfb0: 7475 726e 3c2f 7370 616e 3e20 6465 743b turn det;\n+0001dfc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001e010: 2037 3435 3c2f 7370 616e 3e20 2020 207d 745 }\n+0001e020: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n+0001e040: 3c61 2069 643d 226c 3030 3734 3622 206e 746
    .
    748 \n+0001e0e0: 2020 3c73 7061 6e20 636c 6173 733d 226b template\n+0001e100: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <typename K>
    ..
    749 stati\n+0001e240: 633c 2f73 7061 6e3e 203c 7370 616e 2063 c i\n+0001e260: 6e6c 696e 653c 2f73 7061 6e3e 204b 203c nline K <\n+0001e270: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+0001e280: 5f66 756e 6374 696f 6e22 2068 7265 663d _function\" href=\n+0001e290: 2261 3030 3433 362e 6874 6d6c 2361 3637 \"a00436.html#a67\n+0001e2a0: 3135 3538 3135 6230 3334 3737 3331 3239 155815b034773129\n+0001e2b0: 6432 3162 6665 3339 3932 6630 6236 223e d21bfe3992f0b6\">\n+0001e2c0: 696e 7665 7274 4d61 7472 6978 5f72 6574 invertMatrix_ret\n+0001e2d0: 5472 616e 7370 6f73 6564 3c2f 613e 2028 Transposed (\n+0001e2e0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const F\n+0001e330: 6965 6c64 4d61 7472 6978 266c 743b 4b2c ieldMatrix<K,\n+0001e340: 332c 3326 6774 3b3c 2f61 3e20 2661 6d70 3,3> &\n+0001e350: 3b6d 6174 7269 782c 203c 6120 636c 6173 ;matrix, FieldMatrix\n+0001e390: 266c 743b 4b2c 332c 3326 6774 3b3c 2f61 <K,3,3> &inverse)<\n+0001e3b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001e400: 3735 303c 2f73 7061 6e3e 2020 2020 7b3c 750 {<\n+0001e410: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001e460: 3735 313c 2f73 7061 6e3e 2020 2020 2020 751 \n+0001e470: 3c73 7061 6e20 636c 6173 733d 226b 6579 using real_type = <\n+0001e4a0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0001e4b0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord\">typename FieldTraits\n+0001e520: 266c 743b 4b26 6774 3b3a 3a72 6561 6c5f <K>::real_\n+0001e530: 7479 7065 3c2f 613e 3b3c 2f64 6976 3e0a type;
    .\n+0001e540: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n+0001e620: 2020 3735 333c 2f73 7061 6e3e 2020 2020 753 \n+0001e630: 2020 4b20 7434 2020 3d20 6d61 7472 6978 K t4 = matrix\n+0001e640: 5b30 5d5b 305d 202a 206d 6174 7269 785b [0][0] * matrix[\n+0001e650: 315d 5b31 5d3b 3c2f 6469 763e 0a3c 6469 1][1];
    .<\n+0001e670: 6120 6964 3d22 6c30 3037 3534 2220 6e61 a id=\"l00754\" na\n+0001e680: 6d65 3d22 6c30 3037 3534 223e 3c2f 613e me=\"l00754\">\n+0001e690: 3c73 7061 6e20 636c 6173 733d 226c 696e 754 K t6 = m\n+0001e6c0: 6174 7269 785b 305d 5b30 5d20 2a20 6d61 atrix[0][0] * ma\n+0001e6d0: 7472 6978 5b31 5d5b 325d 3b3c 2f64 6976 trix[1][2];.
    755<\n+0001e730: 2f73 7061 6e3e 2020 2020 2020 4b20 7438 /span> K t8\n+0001e740: 2020 3d20 6d61 7472 6978 5b30 5d5b 315d = matrix[0][1]\n+0001e750: 202a 206d 6174 7269 785b 315d 5b30 5d3b * matrix[1][0];\n+0001e760: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001e7b0: 2037 3536 3c2f 7370 616e 3e20 2020 2020 756 \n+0001e7c0: 204b 2074 3130 203d 206d 6174 7269 785b K t10 = matrix[\n+0001e7d0: 305d 5b32 5d20 2a20 6d61 7472 6978 5b31 0][2] * matrix[1\n+0001e7e0: 5d5b 305d 3b3c 2f64 6976 3e0a 3c64 6976 ][0];
    .<\n+0001e820: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0001e830: 6e6f 223e 2020 3735 373c 2f73 7061 6e3e no\"> 757
    \n+0001e840: 2020 2020 2020 4b20 7431 3220 3d20 6d61 K t12 = ma\n+0001e850: 7472 6978 5b30 5d5b 315d 202a 206d 6174 trix[0][1] * mat\n+0001e860: 7269 785b 325d 5b30 5d3b 3c2f 6469 763e rix[2][0];
    \n+0001e870: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0001e8a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 758 K t14\n+0001e8d0: 203d 206d 6174 7269 785b 305d 5b32 5d20 = matrix[0][2] \n+0001e8e0: 2a20 6d61 7472 6978 5b32 5d5b 305d 3b3c * matrix[2][0];<\n+0001e8f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001e940: 3735 393c 2f73 7061 6e3e 203c 2f64 6976 759 .
    760<\n+0001e9a0: 2f73 7061 6e3e 2020 2020 2020 4b20 6465 /span> K de\n+0001e9b0: 7420 3d20 2874 342a 6d61 7472 6978 5b32 t = (t4*matrix[2\n+0001e9c0: 5d5b 325d 2d74 362a 6d61 7472 6978 5b32 ][2]-t6*matrix[2\n+0001e9d0: 5d5b 315d 2d74 382a 6d61 7472 6978 5b32 ][1]-t8*matrix[2\n+0001e9e0: 5d5b 325d 2b3c 2f64 6976 3e0a 3c64 6976 ][2]+
    .<\n+0001ea20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0001ea30: 6e6f 223e 2020 3736 313c 2f73 7061 6e3e no\"> 761\n+0001ea40: 2020 2020 2020 2020 2020 2020 2020 2074 t\n+0001ea50: 3130 2a6d 6174 7269 785b 325d 5b31 5d2b 10*matrix[2][1]+\n+0001ea60: 7431 322a 6d61 7472 6978 5b31 5d5b 325d t12*matrix[1][2]\n+0001ea70: 2d74 3134 2a6d 6174 7269 785b 315d 5b31 -t14*matrix[1][1\n+0001ea80: 5d29 3b3c 2f64 6976 3e0a 3c64 6976 2063 ]);
    .
    762 \n+0001eae0: 2020 2020 4b20 7431 3720 3d20 7265 616c K t17 = real\n+0001eaf0: 5f74 7970 6528 312e 3029 2f64 6574 3b3c _type(1.0)/det;<\n+0001eb00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001eb50: 3736 333c 2f73 7061 6e3e 203c 2f64 6976 763 .
    764<\n+0001ebb0: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n+0001ebc0: 7273 655b 305d 5b30 5d20 3d20 2028 6d61 rse[0][0] = (ma\n+0001ebd0: 7472 6978 5b31 5d5b 315d 202a 206d 6174 trix[1][1] * mat\n+0001ebe0: 7269 785b 325d 5b32 5d20 2d20 6d61 7472 rix[2][2] - matr\n+0001ebf0: 6978 5b31 5d5b 325d 202a 206d 6174 7269 ix[1][2] * matri\n+0001ec00: 785b 325d 5b31 5d29 2a74 3137 3b3c 2f64 x[2][1])*t17;.
    76\n+0001ec60: 353c 2f73 7061 6e3e 2020 2020 2020 696e 5 in\n+0001ec70: 7665 7273 655b 315d 5b30 5d20 3d20 2d28 verse[1][0] = -(\n+0001ec80: 6d61 7472 6978 5b30 5d5b 315d 202a 206d matrix[0][1] * m\n+0001ec90: 6174 7269 785b 325d 5b32 5d20 2d20 6d61 atrix[2][2] - ma\n+0001eca0: 7472 6978 5b30 5d5b 325d 202a 206d 6174 trix[0][2] * mat\n+0001ecb0: 7269 785b 325d 5b31 5d29 2a74 3137 3b3c rix[2][1])*t17;<\n+0001ecc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001ed10: 3736 363c 2f73 7061 6e3e 2020 2020 2020 766 \n+0001ed20: 696e 7665 7273 655b 325d 5b30 5d20 3d20 inverse[2][0] = \n+0001ed30: 2028 6d61 7472 6978 5b30 5d5b 315d 202a (matrix[0][1] *\n+0001ed40: 206d 6174 7269 785b 315d 5b32 5d20 2d20 matrix[1][2] - \n+0001ed50: 6d61 7472 6978 5b30 5d5b 325d 202a 206d matrix[0][2] * m\n+0001ed60: 6174 7269 785b 315d 5b31 5d29 2a74 3137 atrix[1][1])*t17\n+0001ed70: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+0001edc0: 2020 3736 373c 2f73 7061 6e3e 2020 2020 767 \n+0001edd0: 2020 696e 7665 7273 655b 305d 5b31 5d20 inverse[0][1] \n+0001ede0: 3d20 2d28 6d61 7472 6978 5b31 5d5b 305d = -(matrix[1][0]\n+0001edf0: 202a 206d 6174 7269 785b 325d 5b32 5d20 * matrix[2][2] \n+0001ee00: 2d20 6d61 7472 6978 5b31 5d5b 325d 202a - matrix[1][2] *\n+0001ee10: 206d 6174 7269 785b 325d 5b30 5d29 2a74 matrix[2][0])*t\n+0001ee20: 3137 3b3c 2f64 6976 3e0a 3c64 6976 2063 17;
    .
    768 \n+0001ee80: 2020 2020 696e 7665 7273 655b 315d 5b31 inverse[1][1\n+0001ee90: 5d20 3d20 2028 6d61 7472 6978 5b30 5d5b ] = (matrix[0][\n+0001eea0: 305d 202a 206d 6174 7269 785b 325d 5b32 0] * matrix[2][2\n+0001eeb0: 5d20 2d20 7431 3429 202a 2074 3137 3b3c ] - t14) * t17;<\n+0001eec0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001ef10: 3736 393c 2f73 7061 6e3e 2020 2020 2020 769 \n+0001ef20: 696e 7665 7273 655b 325d 5b31 5d20 3d20 inverse[2][1] = \n+0001ef30: 2d28 7436 2d74 3130 2920 2a20 7431 373b -(t6-t10) * t17;\n+0001ef40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001ef90: 2037 3730 3c2f 7370 616e 3e20 2020 2020 770 \n+0001efa0: 2069 6e76 6572 7365 5b30 5d5b 325d 203d inverse[0][2] =\n+0001efb0: 2020 286d 6174 7269 785b 315d 5b30 5d20 (matrix[1][0] \n+0001efc0: 2a20 6d61 7472 6978 5b32 5d5b 315d 202d * matrix[2][1] -\n+0001efd0: 206d 6174 7269 785b 315d 5b31 5d20 2a20 matrix[1][1] * \n+0001efe0: 6d61 7472 6978 5b32 5d5b 305d 2920 2a20 matrix[2][0]) * \n+0001eff0: 7431 373b 3c2f 6469 763e 0a3c 6469 7620 t17;
    .
    771 \n+0001f050: 2020 2020 2069 6e76 6572 7365 5b31 5d5b inverse[1][\n+0001f060: 325d 203d 202d 286d 6174 7269 785b 305d 2] = -(matrix[0]\n+0001f070: 5b30 5d20 2a20 6d61 7472 6978 5b32 5d5b [0] * matrix[2][\n+0001f080: 315d 202d 2074 3132 2920 2a20 7431 373b 1] - t12) * t17;\n+0001f090: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001f0e0: 2037 3732 3c2f 7370 616e 3e20 2020 2020 772 \n+0001f0f0: 2069 6e76 6572 7365 5b32 5d5b 325d 203d inverse[2][2] =\n+0001f100: 2020 2874 342d 7438 2920 2a20 7431 373b (t4-t8) * t17;\n+0001f110: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001f160: 2037 3733 3c2f 7370 616e 3e20 3c2f 6469 773 .
    774\n+0001f1c0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 return det;
    .\n+0001f200: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n+0001f260: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001f2b0: 2037 3736 3c2f 7370 616e 3e20 3c2f 6469 776 .
    778\n+0001f310: 3c2f 7370 616e 3e20 2020 203c 7370 616e template\n+0001f340: 266c 743b 203c 7370 616e 2063 6c61 7373 < class\n+0001f360: 3c2f 7370 616e 3e20 4b2c 203c 7370 616e K, int \n+0001f390: 6d2c 203c 7370 616e 2063 6c61 7373 3d22 m, int\n+0001f3b0: 3c2f 7370 616e 3e20 6e2c 203c 7370 616e n, int \n+0001f3e0: 7020 2667 743b 3c2f 6469 763e 0a3c 6469 p >
    ..
    \n+0001f4c0: 2020 3737 393c 2f61 3e3c 2f73 7061 6e3e 779\n+0001f4d0: 2020 2020 3c73 7061 6e20 636c 6173 733d static\n+0001f4f0: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c in\n+0001f510: 6c69 6e65 3c2f 7370 616e 3e20 3c73 7061 line void multMatrix ( const<\n+0001f5c0: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldMatrix&l\n+0001f600: 743b 204b 2c20 6d2c 206e 2026 6774 3b3c t; K, m, n ><\n+0001f610: 2f61 3e20 2661 6d70 3b41 2c3c 2f64 6976 /a> &A,.
    780<\n+0001f670: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> \n+0001f680: 2020 2020 2020 2020 2020 2020 2020 2020 \n+0001f690: 2020 2020 2020 2020 2020 3c73 7061 6e20 \n+0001f6b0: 636f 6e73 743c 2f73 7061 6e3e 203c 6120 const FieldMa\n+0001f6f0: 7472 6978 266c 743b 204b 2c20 6e2c 2070 trix< K, n, p\n+0001f700: 2026 6774 3b3c 2f61 3e20 2661 6d70 3b42 > &B\n+0001f710: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
    .
    \n+0001f760: 2020 3738 313c 2f73 7061 6e3e 2020 2020 781 \n+0001f770: 2020 2020 2020 2020 2020 2020 2020 2020 \n+0001f780: 2020 2020 2020 2020 2020 2020 2020 2020 \n+0001f790: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n+0001f7c0: 644d 6174 7269 7826 6c74 3b20 4b2c 206d dMatrix< K, m\n+0001f7d0: 2c20 7020 2667 743b 3c2f 613e 2026 616d , p > &am\n+0001f7e0: 703b 7265 7420 293c 2f64 6976 3e0a 3c64 p;ret )
    .\n+0001f800: 3c61 2069 643d 226c 3030 3738 3222 206e 782 {
    .\n+0001f860: 3c61 2069 643d 226c 3030 3738 3322 206e 783 ty\n+0001f8c0: 7065 6465 663c 2f73 7061 6e3e 203c 7370 pedef typename F\n+0001f920: 6965 6c64 4d61 7472 6978 266c 743b 204b ieldMatrix< K\n+0001f930: 2c20 6d2c 2070 2026 6774 3b3c 2f61 3e20 , m, p > \n+0001f940: 3a3a 2073 697a 655f 7479 7065 2073 697a :: size_type siz\n+0001f950: 655f 7479 7065 3b3c 2f64 6976 3e0a 3c64 e_type;
    .\n+0001f970: 3c61 2069 643d 226c 3030 3738 3422 206e 784
    .
    785 \n+0001fa10: 2020 2020 3c73 7061 6e20 636c 6173 733d fo\n+0001fa30: 723c 2f73 7061 6e3e 2820 7369 7a65 5f74 r( size_t\n+0001fa40: 7970 6520 6920 3d20 303b 2069 2026 6c74 ype i = 0; i <\n+0001fa50: 3b20 6d3b 202b 2b69 2029 3c2f 6469 763e ; m; ++i )
    \n+0001fa60: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+0001fa90: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 786 {.
    787\n+0001fb10: 3c2f 7370 616e 3e20 2020 2020 2020 203c <\n+0001fb20: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+0001fb30: 6f72 6466 6c6f 7722 3e66 6f72 3c2f 7370 ordflow\">for( size_type j\n+0001fb50: 203d 2030 3b20 6a20 266c 743b 2070 3b20 = 0; j < p; \n+0001fb60: 2b2b 6a20 293c 2f64 6976 3e0a 3c64 6976 ++j )
    .<\n+0001fba0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0001fbb0: 6e6f 223e 2020 3738 383c 2f73 7061 6e3e no\"> 788
    \n+0001fbc0: 2020 2020 2020 2020 7b3c 2f64 6976 3e0a {
    .\n+0001fbd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+0001fc80: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+0001fc90: 6e6f 223e 2020 3739 303c 2f73 7061 6e3e no\"> 790\n+0001fca0: 2020 2020 2020 2020 2020 3c73 7061 6e20 for( \n+0001fcd0: 7369 7a65 5f74 7970 6520 6b20 3d20 303b size_type k = 0;\n+0001fce0: 206b 2026 6c74 3b20 6e3b 202b 2b6b 2029 k < n; ++k )\n+0001fcf0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+0001fd40: 2037 3931 3c2f 7370 616e 3e20 2020 2020 791 \n+0001fd50: 2020 2020 2020 2072 6574 5b20 6920 5d5b ret[ i ][\n+0001fd60: 206a 205d 202b 3d20 415b 2069 205d 5b20 j ] += A[ i ][ \n+0001fd70: 6b20 5d20 2a20 425b 206b 205d 5b20 6a20 k ] * B[ k ][ j \n+0001fd80: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
    .
    792 \n+0001fde0: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
    .<\n+0001fe00: 6120 6964 3d22 6c30 3037 3933 2220 6e61 a id=\"l00793\" na\n+0001fe10: 6d65 3d22 6c30 3037 3933 223e 3c2f 613e me=\"l00793\">\n+0001fe20: 3c73 7061 6e20 636c 6173 733d 226c 696e 793 }
    .<\n+0001fe50: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+0001fe60: 3e3c 6120 6964 3d22 6c30 3037 3934 2220 > 794 }
    .<\n+0001feb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+0001ff00: 3739 353c 2f73 7061 6e3e 203c 2f64 6976 795 .
    797<\n+0001ff60: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n+0001ff80: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n+0001ff90: 266c 743b 3c73 7061 6e20 636c 6173 733d <typena\n+0001ffb0: 6d65 3c2f 7370 616e 3e20 4b2c 203c 7370 me K, int rows, int col\n+00020010: 7326 6774 3b3c 2f64 6976 3e0a 3c64 6976 s>
    ..
    \n+000200f0: 2037 3938 3c2f 613e 3c2f 7370 616e 3e20 798 \n+00020100: 2020 203c 7370 616e 2063 6c61 7373 3d22 static<\n+00020120: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> inl\n+00020140: 696e 653c 2f73 7061 6e3e 203c 7370 616e ine void\n+00020170: 203c 6120 636c 6173 733d 2263 6f64 6520 multTransposed\n+000201d0: 4d61 7472 6978 3c2f 613e 283c 7370 616e Matrix(const FieldM\n+00020230: 6174 7269 7826 6c74 3b4b 2c72 6f77 732c atrix<K,rows,\n+00020240: 636f 6c73 2667 743b 3c2f 613e 2026 616d cols> &am\n+00020250: 703b 6d61 7472 6978 2c20 3c61 2063 6c61 p;matrix, FieldMatri\n+00020290: 7826 6c74 3b4b 2c63 6f6c 732c 636f 6c73 x<K,cols,cols\n+000202a0: 2667 743b 3c2f 613e 2661 6d70 3b20 7265 >& re\n+000202b0: 7429 3c2f 6469 763e 0a3c 6469 7620 636c t)
    .
    799 \n+00020310: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    800 \n+00020370: 2020 203c 7370 616e 2063 6c61 7373 3d22 typedef\n+00020390: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c ty\n+000203b0: 7065 6e61 6d65 3c2f 7370 616e 3e20 3c61 pename Fi\n+00020410: 656c 644d 6174 7269 7826 6c74 3b4b 2c72 eldMatrix<K,r\n+00020420: 6f77 732c 636f 6c73 2667 743b 3a3a 7369 ows,cols>::si\n+00020430: 7a65 5f74 7970 653c 2f61 3e20 7369 7a65 ze_type size\n+00020440: 5f74 7970 653b 3c2f 6469 763e 0a3c 6469 _type;
    .<\n+00020460: 6120 6964 3d22 6c30 3038 3031 2220 6e61 a id=\"l00801\" na\n+00020470: 6d65 3d22 6c30 3038 3031 223e 3c2f 613e me=\"l00801\">\n+00020480: 3c73 7061 6e20 636c 6173 733d 226c 696e 801
    .
    802 \n+00020500: 2020 203c 7370 616e 2063 6c61 7373 3d22 for\n+00020520: 3c2f 7370 616e 3e28 7369 7a65 5f74 7970 (size_typ\n+00020530: 6520 693d 303b 2069 266c 743b 636f 6c73 e i=0; i<cols\n+00020540: 3b20 692b 2b29 3c2f 6469 763e 0a3c 6469 ; i++)
    .<\n+00020560: 6120 6964 3d22 6c30 3038 3033 2220 6e61 a id=\"l00803\" na\n+00020570: 6d65 3d22 6c30 3038 3033 223e 3c2f 613e me=\"l00803\">\n+00020580: 3c73 7061 6e20 636c 6173 733d 226c 696e 803 for(si\n+000205d0: 7a65 5f74 7970 6520 6a3d 303b 206a 266c ze_type j=0; j&l\n+000205e0: 743b 636f 6c73 3b20 6a2b 2b29 3c2f 6469 t;cols; j++).
    804\n+00020640: 3c2f 7370 616e 3e20 2020 2020 2020 207b {\n+00020650: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000206a0: 2038 3035 3c2f 7370 616e 3e20 2020 2020 805 \n+000206b0: 2020 2020 2072 6574 5b69 5d5b 6a5d 3d30 ret[i][j]=0\n+000206c0: 2e30 3b3c 2f64 6976 3e0a 3c64 6976 2063 .0;
    .
    806 \n+00020720: 2020 2020 2020 2020 3c73 7061 6e20 636c for(siz\n+00020750: 655f 7479 7065 206b 3d30 3b20 6b26 6c74 e_type k=0; k<\n+00020760: 3b72 6f77 733b 206b 2b2b 293c 2f64 6976 ;rows; k++).
    807<\n+000207c0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> \n+000207d0: 2020 7265 745b 695d 5b6a 5d2b 3d6d 6174 ret[i][j]+=mat\n+000207e0: 7269 785b 6b5d 5b69 5d2a 6d61 7472 6978 rix[k][i]*matrix\n+000207f0: 5b6b 5d5b 6a5d 3b3c 2f64 6976 3e0a 3c64 [k][j];
    .\n+00020810: 3c61 2069 643d 226c 3030 3830 3822 206e 808 }.
    809<\n+000208b0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    810 .
    8\n+00020970: 3131 3c2f 7370 616e 3e20 2020 203c 7370 11 using \n+000209a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Dune::DenseMatr\n+00020a00: 6978 4865 6c70 3a3a 6d75 6c74 4173 7369 ixHelp::multAssi\n+00020a10: 676e 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 gn;
    .\n+00020a30: 3c61 2069 643d 226c 3030 3831 3222 206e 812
    .
    814 \n+00020ad0: 2020 3c73 7061 6e20 636c 6173 733d 226b template\n+00020af0: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <typename K, i\n+00020b40: 6e74 3c2f 7370 616e 3e20 726f 7773 2c20 nt rows, \n+00020b50: 3c73 7061 6e20 636c 6173 733d 226b 6579 int cols>.
    .
    815\n+00020c60: 3c2f 7370 616e 3e20 2020 203c 7370 616e static <\n+00020c90: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00020ca0: 6f72 6422 3e69 6e6c 696e 653c 2f73 7061 ord\">inline voi\n+00020cd0: 643c 2f73 7061 6e3e 203c 6120 636c 6173 d multAs\n+00020d30: 7369 676e 5472 616e 7370 6f73 6564 3c2f signTransposed( const<\n+00020d60: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldMatrix&l\n+00020da0: 743b 4b2c 726f 7773 2c63 6f6c 7326 6774 t;K,rows,cols>\n+00020db0: 3b3c 2f61 3e20 2661 6d70 3b6d 6174 7269 ; &matri\n+00020dc0: 782c 203c 7370 616e 2063 6c61 7373 3d22 x, const FieldVector<\n+00020e20: 3b4b 2c72 6f77 7326 6774 3b3c 2f61 3e20 ;K,rows> \n+00020e30: 2661 6d70 3b20 782c 203c 6120 636c 6173 & x, FieldVector\n+00020e70: 266c 743b 4b2c 636f 6c73 2667 743b 3c2f <K,cols> & ret).
    81\n+00020ee0: 363c 2f73 7061 6e3e 2020 2020 7b3c 2f64 6 {.
    81\n+00020f40: 373c 2f73 7061 6e3e 2020 2020 2020 3c73 7 typedef typenam\n+00020f90: 653c 2f73 7061 6e3e 203c 6120 636c 6173 e FieldMa\n+00020ff0: 7472 6978 266c 743b 4b2c 726f 7773 2c63 trix<K,rows,c\n+00021000: 6f6c 7326 6774 3b3a 3a73 697a 655f 7479 ols>::size_ty\n+00021010: 7065 3c2f 613e 2073 697a 655f 7479 7065 pe size_type\n+00021020: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+00021070: 2020 3831 383c 2f73 7061 6e3e 203c 2f64 818 .
    81\n+000210d0: 393c 2f73 7061 6e3e 2020 2020 2020 3c73 9 for(size_type i=0\n+00021110: 3b20 6926 6c74 3b63 6f6c 733b 202b 2b69 ; i<cols; ++i\n+00021120: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
    .
    \n+00021170: 2020 3832 303c 2f73 7061 6e3e 2020 2020 820 \n+00021180: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
    .
    821 \n+000211e0: 2020 2020 2020 7265 745b 695d 203d 2030 ret[i] = 0\n+000211f0: 2e30 3b3c 2f64 6976 3e0a 3c64 6976 2063 .0;
    .
    822 \n+00021250: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n+00021270: 666f 723c 2f73 7061 6e3e 2873 697a 655f for(size_\n+00021280: 7479 7065 206a 3d30 3b20 6a26 6c74 3b72 type j=0; j<r\n+00021290: 6f77 733b 202b 2b6a 293c 2f64 6976 3e0a ows; ++j)
    .\n+000212a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 \n+00021320: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00021350: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 824 }.
    825\n+000213d0: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    .
    826 <\n+00021440: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00021490: 3832 383c 2f73 7061 6e3e 2020 2020 3c73 828 template <ty\n+000214e0: 7065 6e61 6d65 3c2f 7370 616e 3e20 4b2c pename K,\n+000214f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int rows, int\n+00021540: 2063 6f6c 7326 6774 3b3c 2f64 6976 3e0a cols>
    .\n+00021550: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
    .
    829 sta\n+00021650: 7469 633c 2f73 7061 6e3e 203c 7370 616e tic inline <\n+00021680: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00021690: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n+000216a0: 3134 3132 2e68 746d 6c22 3e46 6965 6c64 1412.html\">Field\n+000216b0: 5665 6374 6f72 266c 743b 4b2c 726f 7773 Vector<K,rows\n+000216c0: 2667 743b 3c2f 613e 203c 6120 636c 6173 > mult(const FieldMatrix<\n+00021780: 3b4b 2c72 6f77 732c 636f 6c73 2667 743b ;K,rows,cols>\n+00021790: 3c2f 613e 2026 616d 703b 6d61 7472 6978 &matrix\n+000217a0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , const FieldVector<\n+00021800: 4b2c 636f 6c73 2667 743b 3c2f 613e 2026 K,cols> &\n+00021810: 616d 703b 2078 293c 2f64 6976 3e0a 3c64 amp; x)
    .\n+00021830: 3c61 2069 643d 226c 3030 3833 3022 206e 830 {
    .\n+00021890: 3c61 2069 643d 226c 3030 3833 3122 206e 831 FieldVector&\n+00021910: 6c74 3b4b 2c72 6f77 7326 6774 3b3c 2f61 lt;K,rows> ret;
    .<\n+00021940: 6120 6964 3d22 6c30 3038 3332 2220 6e61 a id=\"l00832\" na\n+00021950: 6d65 3d22 6c30 3038 3332 223e 3c2f 613e me=\"l00832\">\n+00021960: 3c73 7061 6e20 636c 6173 733d 226c 696e 832 multAssig\n+00021990: 6e28 6d61 7472 6978 2c78 2c72 6574 293b n(matrix,x,ret);\n+000219a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000219f0: 2038 3333 3c2f 7370 616e 3e20 2020 2020 833 \n+00021a00: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n+00021a20: 6e3c 2f73 7061 6e3e 2072 6574 3b3c 2f64 n ret;.
    83\n+00021a80: 343c 2f73 7061 6e3e 2020 2020 7d3c 2f64 4 }.
    .
    835 \n+00021af0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+00021b40: 2038 3337 3c2f 7370 616e 3e20 2020 203c 837 <\n+00021b50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00021b60: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord\">template <t\n+00021b90: 7970 656e 616d 653c 2f73 7061 6e3e 204b ypename K\n+00021ba0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , int<\n+00021bc0: 2f73 7061 6e3e 2072 6f77 732c 203c 7370 /span> rows, int cols>
    \n+00021c00: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
    .
    <\n+00021c90: 6120 636c 6173 733d 226c 696e 6522 2068 a class=\"line\" h\n+00021ca0: 7265 663d 2261 3030 3433 362e 6874 6d6c ref=\"a00436.html\n+00021cb0: 2361 3635 3937 3633 6262 6564 3437 6439 #a659763bbed47d9\n+00021cc0: 3362 3061 3033 6439 6463 3264 3439 6336 3b0a03d9dc2d49c6\n+00021cd0: 6630 223e 2020 3833 383c 2f61 3e3c 2f73 f0\"> 838 st\n+00021d00: 6174 6963 3c2f 7370 616e 3e20 3c73 7061 atic inline \n+00021d30: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n+00021d60: 6456 6563 746f 7226 6c74 3b4b 2c63 6f6c dVector<K,col\n+00021d70: 7326 6774 3b3c 2f61 3e20 3c61 2063 6c61 s> multT\n+00021dd0: 7261 6e73 706f 7365 643c 2f61 3e28 3c73 ransposed(const\n+00021e00: 203c 6120 636c 6173 733d 2263 6f64 6520 Fie\n+00021e30: 6c64 4d61 7472 6978 266c 743b 4b2c 726f ldMatrix<K,ro\n+00021e40: 7773 2c63 6f6c 7326 6774 3b3c 2f61 3e20 ws,cols> \n+00021e50: 2661 6d70 3b6d 6174 7269 782c 203c 7370 &matrix, const \n+00021e80: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n+00021eb0: 6456 6563 746f 7226 6c74 3b4b 2c72 6f77 dVector<K,row\n+00021ec0: 7326 6774 3b3c 2f61 3e20 2661 6d70 3b20 s> & \n+00021ed0: 7829 3c2f 6469 763e 0a3c 6469 7620 636c x)
    .
    839 \n+00021f30: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    840 \n+00021f90: 2020 203c 6120 636c 6173 733d 2263 6f64 F\n+00021fc0: 6965 6c64 5665 6374 6f72 266c 743b 4b2c ieldVector<K,\n+00021fd0: 636f 6c73 2667 743b 3c2f 613e 2072 6574 cols> ret\n+00021fe0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+00022030: 2020 3834 313c 2f73 7061 6e3e 2020 2020 841 \n+00022040: 2020 3c61 2063 6c61 7373 3d22 636f 6465 multAssignTra\n+000220a0: 6e73 706f 7365 643c 2f61 3e28 206d 6174 nsposed( mat\n+000220b0: 7269 782c 2078 2c20 7265 7420 293b 3c2f rix, x, ret );.
    8\n+00022110: 3432 3c2f 7370 616e 3e20 2020 2020 203c 42 <\n+00022120: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00022130: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n+00022140: 2f73 7061 6e3e 2072 6574 3b3c 2f64 6976 /span> ret;.
    843<\n+000221a0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    844 .
    8\n+00022260: 3435 3c2f 7370 616e 3e20 207d 203c 7370 45 } // end namesp\n+00022290: 6163 6520 464d 6174 7269 7848 656c 703c ace FMatrixHelp<\n+000222a0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 2f64 /span>
    ..
    84\n+00022300: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
    .\n+00022310: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    850 <\n+000223f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00022440: 3835 313c 2f73 7061 6e3e 3c73 7061 6e20 851#include &q\n+00022470: 756f 743b 3c61 2063 6c61 7373 3d22 636f uot;fmatrixev\n+000224a0: 2e68 683c 2f61 3e26 7175 6f74 3b3c 2f73 .hh"
    .
    852<\n+00022510: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class=\"prep\n+00022520: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor\">#endif\n+00022530: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
    .
    matri\n+00022590: 7863 6f6e 6365 7074 732e 6868 3c2f 613e xconcepts.hh\n+000225a0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n+000225d0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 \n+00022610: 3c64 6976 2063 6c61 7373 3d22 7474 646f
    Various preci\n+00022630: 7369 6f6e 2073 6574 7469 6e67 7320 666f sion settings fo\n+00022640: 7220 6361 6c63 756c 6174 696f 6e73 2077 r calculations w\n+00022650: 6974 6820 4669 656c 644d 6174 7269 7820 ith FieldMatrix \n+00022660: 616e 6420 4669 656c 6456 6563 746f 722e and FieldVector.\n+00022670: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n+000226a0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
    typetr\n+000226d0: 6169 7473 2e68 683c 2f61 3e3c 2f64 6976 aits.hh
    Traits for t\n+00022700: 7970 6520 636f 6e76 6572 7369 6f6e 7320 ype conversions \n+00022710: 616e 6420 7479 7065 2069 6e66 6f72 6d61 and type informa\n+00022720: 7469 6f6e 2e3c 2f64 6976 3e3c 2f64 6976 tion.
    .
    f\n+00022780: 7665 6374 6f72 2e68 683c 2f61 3e3c 2f64 vector.hh
    Implements\n+000227b0: 2061 2076 6563 746f 7220 636f 6e73 7472 a vector constr\n+000227c0: 7563 7465 6420 6672 6f6d 2061 2067 6976 ucted from a giv\n+000227d0: 656e 2074 7970 6520 7265 7072 6573 656e en type represen\n+000227e0: 7469 6e67 2061 2066 6965 6c64 2061 6e64 ting a field and\n+000227f0: 2061 2063 6f6d 7069 6c65 2d74 696d 6520 a compile-time \n+00022800: 6769 7665 6e20 7369 7a65 2e3c 2f64 6976 given size.
    .
    <\n+00022850: 6120 6872 6566 3d22 6130 3032 3735 2e68 a href=\"a00275.h\n+00022860: 746d 6c22 3e66 6d61 7472 6978 6576 2e68 tml\">fmatrixev.h\n+00022870: 683c 2f61 3e3c 2f64 6976 3e3c 6469 7620 h
    Ei\n+00022890: 6765 6e76 616c 7565 2063 6f6d 7075 7461 genvalue computa\n+000228a0: 7469 6f6e 7320 666f 7220 7468 6520 4669 tions for the Fi\n+000228b0: 656c 644d 6174 7269 7820 636c 6173 732e eldMatrix class.\n+000228c0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n+000228f0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
    bounds\n+00022920: 6368 6563 6b69 6e67 2e68 683c 2f61 3e3c checking.hh<\n+00022930: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Macro fo\n+00022950: 7220 7772 6170 7069 6e67 2062 6f75 6e64 r wrapping bound\n+00022960: 6172 7920 6368 6563 6b73 2e3c 2f64 6976 ary checks.
    .
    <\n+000229b0: 6120 6872 6566 3d22 6130 3033 3530 2e68 a href=\"a00350.h\n+000229c0: 746d 6c22 3e64 656e 7365 6d61 7472 6978 tml\">densematrix\n+000229d0: 2e68 683c 2f61 3e3c 2f64 6976 3e3c 6469 .hh
    \n+000229f0: 496d 706c 656d 656e 7473 2061 206d 6174 Implements a mat\n+00022a00: 7269 7820 636f 6e73 7472 7563 7465 6420 rix constructed \n+00022a10: 6672 6f6d 2061 2067 6976 656e 2074 7970 from a given typ\n+00022a20: 6520 7265 7072 6573 656e 7469 6e67 2061 e representing a\n+00022a30: 2066 6965 6c64 2061 6e64 2061 2063 6f6d field and a com\n+00022a40: 7069 6c65 2d74 696d 6520 6769 7665 6e20 pile-time given \n+00022a50: 6e75 6d62 652e 2e2e 3c2f 6469 763e 3c2f numbe...
    .
    .
    <\n+00022b40: 6120 6872 6566 3d22 6130 3033 3839 2e68 a href=\"a00389.h\n+00022b50: 746d 6c22 3e70 726f 6d6f 7469 6f6e 7472 tml\">promotiontr\n+00022b60: 6169 7473 2e68 683c 2f61 3e3c 2f64 6976 aits.hh
    Compute type\n+00022b90: 206f 6620 7468 6520 7265 7375 6c74 206f of the result o\n+00022ba0: 6620 616e 2061 7269 7468 6d65 7469 6320 f an arithmetic \n+00022bb0: 6f70 6572 6174 696f 6e20 696e 766f 6c76 operation involv\n+00022bc0: 696e 6720 7477 6f20 6469 6666 6572 656e ing two differen\n+00022bd0: 7420 6e75 6d62 6572 2074 7970 6573 2e3c t number types.<\n+00022be0: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .
    #\n+00022cb0: 6465 6669 6e65 2044 554e 455f 4153 5345 define DUNE_ASSE\n+00022cc0: 5254 5f42 4f55 4e44 5328 636f 6e64 293c RT_BOUNDS(cond)<\n+00022cd0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    If DUNE_\n+00022cf0: 4348 4543 4b5f 424f 554e 4453 2069 7320 CHECK_BOUNDS is \n+00022d00: 6465 6669 6e65 643a 2063 6865 636b 2069 defined: check i\n+00022d10: 6620 636f 6e64 6974 696f 6e20 636f 6e64 f condition cond\n+00022d20: 2068 6f6c 6473 3b20 6f74 6865 7277 6973 holds; otherwis\n+00022d30: 652c 2064 6f20 6e6f 7468 696e 672e 3c2f e, do nothing.
    Defini\n+00022d60: 7469 6f6e 3c2f 623e 2062 6f75 6e64 7363 tion boundsc\n+00022d70: 6865 636b 696e 672e 6868 3a33 303c 2f64 hecking.hh:30
    .
    \n+00022dd0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 std::ostream &a\n+00022e60: 6d70 3b20 6f70 6572 6174 6f72 266c 743b mp; operator<\n+00022e70: 266c 743b 2873 7464 3a3a 6f73 7472 6561 <(std::ostrea\n+00022e80: 6d20 2661 6d70 3b73 2c20 636f 6e73 7420 m &s, const \n+00022e90: 6269 6775 6e73 6967 6e65 6469 6e74 266c bigunsignedint&l\n+00022ea0: 743b 206b 2026 6774 3b20 2661 6d70 3b78 t; k > &x\n+00022eb0: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    Def\n+00022ed0: 696e 6974 696f 6e3c 2f62 3e20 6269 6775 inition bigu\n+00022ee0: 6e73 6967 6e65 6469 6e74 2e68 683a 3237 nsignedint.hh:27\n+00022ef0: 383c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 8
    .typename Overlo\n+00022fd0: 6164 733a 3a53 6361 6c61 7254 7970 6526 ads::ScalarType&\n+00022fe0: 6c74 3b20 7374 643a 3a64 6563 6179 5f74 lt; std::decay_t\n+00022ff0: 266c 743b 2056 2026 6774 3b20 2667 743b < V > >\n+00023000: 3a3a 7479 7065 2053 6361 6c61 723c 2f64 ::type Scalar
    Element ty\n+00023030: 7065 206f 6620 736f 6d65 2053 494d 4420 pe of some SIMD \n+00023040: 7479 7065 2e3c 2f64 6976 3e3c 6469 7620 type.
    Definition \n+00023070: 7369 6d64 2f69 6e74 6572 6661 6365 2e68 simd/interface.h\n+00023080: 683a 3233 353c 2f64 6976 3e3c 2f64 6976 h:235
    .
    \n+00023100: 4475 6e65 206e 616d 6573 7061 6365 2e3c Dune namespace.<\n+00023110: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+00023130: 6974 696f 6e3c 2f62 3e20 616c 6967 6e65 ition aligne\n+00023140: 6461 6c6c 6f63 6174 6f72 2e68 683a 3133 dallocator.hh:13\n+00023150: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n+000232d0: 6361 6c63 756c 6174 6573 2072 6574 203d calculates ret =\n+000232e0: 206d 6174 7269 7820 2a20 783c 2f64 6976 matrix * x
    Definitio\n+00023310: 6e3c 2f62 3e20 6465 6e73 656d 6174 7269 n densematri\n+00023320: 782e 6868 3a31 3136 393c 2f64 6976 3e3c x.hh:1169
    <\n+00023330: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n+00023390: 6120 6872 6566 3d22 6130 3034 3336 2e68 a href=\"a00436.h\n+000233a0: 746d 6c23 6136 3539 3736 3362 6265 6434 tml#a659763bbed4\n+000233b0: 3764 3933 6230 6130 3364 3964 6332 6434 7d93b0a03d9dc2d4\n+000233c0: 3963 3666 3022 3e44 756e 653a 3a46 4d61 9c6f0\">Dune::FMa\n+000233d0: 7472 6978 4865 6c70 3a3a 6d75 6c74 5472 trixHelp::multTr\n+000233e0: 616e 7370 6f73 6564 3c2f 613e 3c2f 6469 ansposed
    static Fie\n+00023410: 6c64 5665 6374 6f72 266c 743b 204b 2c20 ldVector< K, \n+00023420: 636f 6c73 2026 6774 3b20 6d75 6c74 5472 cols > multTr\n+00023430: 616e 7370 6f73 6564 2863 6f6e 7374 2046 ansposed(const F\n+00023440: 6965 6c64 4d61 7472 6978 266c 743b 204b ieldMatrix< K\n+00023450: 2c20 726f 7773 2c20 636f 6c73 2026 6774 , rows, cols >\n+00023460: 3b20 2661 6d70 3b6d 6174 7269 782c 2063 ; &matrix, c\n+00023470: 6f6e 7374 2046 6965 6c64 5665 6374 6f72 onst FieldVector\n+00023480: 266c 743b 204b 2c20 726f 7773 2026 6774 < K, rows >\n+00023490: 3b20 2661 6d70 3b78 293c 2f64 6976 3e3c ; &x)
    <\n+000234a0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+000234b0: 223e 6361 6c63 756c 6174 6573 2072 6574 \">calculates ret\n+000234c0: 203d 206d 6174 7269 785e 5420 2a20 783c = matrix^T * x<\n+000234d0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+000234f0: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n+00023500: 782e 6868 3a38 3338 3c2f 6469 763e 3c2f x.hh:838
    .
    Dune::FMat\n+000235b0: 7269 7848 656c 703a 3a69 6e76 6572 744d rixHelp::invertM\n+000235c0: 6174 7269 785f 7265 7454 7261 6e73 706f atrix_retTranspo\n+000235d0: 7365 643c 2f61 3e3c 2f64 6976 3e3c 6469 sed
    static K invert\n+00023600: 4d61 7472 6978 5f72 6574 5472 616e 7370 Matrix_retTransp\n+00023610: 6f73 6564 2863 6f6e 7374 2046 6965 6c64 osed(const Field\n+00023620: 4d61 7472 6978 266c 743b 204b 2c20 312c Matrix< K, 1,\n+00023630: 2031 2026 6774 3b20 2661 6d70 3b6d 6174 1 > &mat\n+00023640: 7269 782c 2046 6965 6c64 4d61 7472 6978 rix, FieldMatrix\n+00023650: 266c 743b 204b 2c20 312c 2031 2026 6774 < K, 1, 1 >\n+00023660: 3b20 2661 6d70 3b69 6e76 6572 7365 293c ; &inverse)<\n+00023670: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    invert s\n+00023690: 6361 6c61 7220 7769 7468 6f75 7420 6368 calar without ch\n+000236a0: 616e 6769 6e67 2074 6865 206f 7269 6769 anging the origi\n+000236b0: 6e61 6c20 6d61 7472 6978 3c2f 6469 763e nal matrix
    \n+000236c0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n+000236e0: 3c2f 623e 2066 6d61 7472 6978 2e68 683a fmatrix.hh:\n+000236f0: 3638 303c 2f64 6976 3e3c 2f64 6976 3e0a 680
    .\n+00023700: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    stat\n+000237d0: 6963 2076 6f69 6420 6d75 6c74 4d61 7472 ic void multMatr\n+000237e0: 6978 2863 6f6e 7374 2046 6965 6c64 4d61 ix(const FieldMa\n+000237f0: 7472 6978 266c 743b 204b 2c20 6d2c 206e trix< K, m, n\n+00023800: 2026 6774 3b20 2661 6d70 3b41 2c20 636f > &A, co\n+00023810: 6e73 7420 4669 656c 644d 6174 7269 7826 nst FieldMatrix&\n+00023820: 6c74 3b20 4b2c 206e 2c20 7020 2667 743b lt; K, n, p >\n+00023830: 2026 616d 703b 422c 2046 6965 6c64 4d61 &B, FieldMa\n+00023840: 7472 6978 266c 743b 204b 2c20 6d2c 2070 trix< K, m, p\n+00023850: 2026 6774 3b20 2661 6d70 3b72 6574 293c > &ret)<\n+00023860: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    calculat\n+00023880: 6573 2072 6574 203d 2041 202a 2042 3c2f es ret = A * B
    Defini\n+000238b0: 7469 6f6e 3c2f 623e 2066 6d61 7472 6978 tion fmatrix\n+000238c0: 2e68 683a 3737 393c 2f64 6976 3e3c 2f64 .hh:779
    .
    static K inver\n+000239b0: 744d 6174 7269 7828 636f 6e73 7420 4669 tMatrix(const Fi\n+000239c0: 656c 644d 6174 7269 7826 6c74 3b20 4b2c eldMatrix< K,\n+000239d0: 2031 2c20 3120 2667 743b 2026 616d 703b 1, 1 > &\n+000239e0: 6d61 7472 6978 2c20 4669 656c 644d 6174 matrix, FieldMat\n+000239f0: 7269 7826 6c74 3b20 4b2c 2031 2c20 3120 rix< K, 1, 1 \n+00023a00: 2667 743b 2026 616d 703b 696e 7665 7273 > &invers\n+00023a10: 6529 3c2f 6469 763e 3c64 6976 2063 6c61 e)
    inver\n+00023a30: 7420 7363 616c 6172 2077 6974 686f 7574 t scalar without\n+00023a40: 2063 6861 6e67 696e 6720 7468 6520 6f72 changing the or\n+00023a50: 6967 696e 616c 206d 6174 7269 783c 2f64 iginal matrix
    Definit\n+00023a80: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n+00023a90: 6868 3a36 3731 3c2f 6469 763e 3c2f 6469 hh:671
    .
    Dune::FMatri\n+00023b40: 7848 656c 703a 3a6d 756c 743c 2f61 3e3c xHelp::mult<\n+00023b50: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    static \n+00023b70: 4669 656c 6456 6563 746f 7226 6c74 3b20 FieldVector< \n+00023b80: 4b2c 2072 6f77 7320 2667 743b 206d 756c K, rows > mul\n+00023b90: 7428 636f 6e73 7420 4669 656c 644d 6174 t(const FieldMat\n+00023ba0: 7269 7826 6c74 3b20 4b2c 2072 6f77 732c rix< K, rows,\n+00023bb0: 2063 6f6c 7320 2667 743b 2026 616d 703b cols > &\n+00023bc0: 6d61 7472 6978 2c20 636f 6e73 7420 4669 matrix, const Fi\n+00023bd0: 656c 6456 6563 746f 7226 6c74 3b20 4b2c eldVector< K,\n+00023be0: 2063 6f6c 7320 2667 743b 2026 616d 703b cols > &\n+00023bf0: 7829 3c2f 6469 763e 3c64 6976 2063 6c61 x)
    calcu\n+00023c10: 6c61 7465 7320 7265 7420 3d20 6d61 7472 lates ret = matr\n+00023c20: 6978 202a 2078 3c2f 6469 763e 3c64 6976 ix * x
    <\n+00023c40: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n+00023c50: 2066 6d61 7472 6978 2e68 683a 3832 393c fmatrix.hh:829<\n+00023c60: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .static void mu\n+00023d50: 6c74 5472 616e 7370 6f73 6564 4d61 7472 ltTransposedMatr\n+00023d60: 6978 2863 6f6e 7374 2046 6965 6c64 4d61 ix(const FieldMa\n+00023d70: 7472 6978 266c 743b 204b 2c20 726f 7773 trix< K, rows\n+00023d80: 2c20 636f 6c73 2026 6774 3b20 2661 6d70 , cols > &\n+00023d90: 3b6d 6174 7269 782c 2046 6965 6c64 4d61 ;matrix, FieldMa\n+00023da0: 7472 6978 266c 743b 204b 2c20 636f 6c73 trix< K, cols\n+00023db0: 2c20 636f 6c73 2026 6774 3b20 2661 6d70 , cols > &\n+00023dc0: 3b72 6574 293c 2f64 6976 3e3c 6469 7620 ;ret)
    ca\n+00023de0: 6c63 756c 6174 6573 2072 6574 3d20 415f lculates ret= A_\n+00023df0: 742a 413c 2f64 6976 3e3c 6469 7620 636c t*A
    D\n+00023e10: 6566 696e 6974 696f 6e3c 2f62 3e20 666d efinition fm\n+00023e20: 6174 7269 782e 6868 3a37 3938 3c2f 6469 atrix.hh:798
    .
    s\n+00023f10: 7461 7469 6320 766f 6964 206d 756c 7441 tatic void multA\n+00023f20: 7373 6967 6e54 7261 6e73 706f 7365 6428 ssignTransposed(\n+00023f30: 636f 6e73 7420 4669 656c 644d 6174 7269 const FieldMatri\n+00023f40: 7826 6c74 3b20 4b2c 2072 6f77 732c 2063 x< K, rows, c\n+00023f50: 6f6c 7320 2667 743b 2026 616d 703b 6d61 ols > &ma\n+00023f60: 7472 6978 2c20 636f 6e73 7420 4669 656c trix, const Fiel\n+00023f70: 6456 6563 746f 7226 6c74 3b20 4b2c 2072 dVector< K, r\n+00023f80: 6f77 7320 2667 743b 2026 616d 703b 782c ows > &x,\n+00023f90: 2046 6965 6c64 5665 6374 6f72 266c 743b FieldVector<\n+00023fa0: 204b 2c20 636f 6c73 2026 6774 3b20 2661 K, cols > &a\n+00023fb0: 6d70 3b72 6574 293c 2f64 6976 3e3c 6469 mp;ret)
    \n+00023fd0: 6361 6c63 756c 6174 6573 2072 6574 203d calculates ret =\n+00023fe0: 206d 6174 7269 785e 5420 2a20 783c 2f64 matrix^T * x
    Definit\n+00024010: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n+00024020: 6868 3a38 3135 3c2f 6469 763e 3c2f 6469 hh:815
    .
    A \n+000240b0: 6465 6e73 6520 6e20 7820 6d20 6d61 7472 dense n x m matr\n+000240c0: 6978 2e3c 2f64 6976 3e3c 6469 7620 636c ix.
    D\n+000240e0: 6566 696e 6974 696f 6e3c 2f62 3e20 6465 efinition de\n+000240f0: 6e73 656d 6174 7269 782e 6868 3a31 3430 nsematrix.hh:140\n+00024100: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .void mtv(const\n+000241e0: 2058 2026 616d 703b 782c 2059 2026 616d X &x, Y &am\n+000241f0: 703b 7929 2063 6f6e 7374 3c2f 6469 763e p;y) const
    \n+00024200: 3c64 6976 2063 6c61 7373 3d22 7474 646f
    y = A^T x
    Definiti\n+00024240: 6f6e 3c2f 623e 2064 656e 7365 6d61 7472 on densematr\n+00024250: 6978 2e68 683a 3338 373c 2f64 6976 3e3c ix.hh:387
    <\n+00024260: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n+000242c0: 6120 6872 6566 3d22 6130 3134 3030 2e68 a href=\"a01400.h\n+000242d0: 746d 6c23 6135 6434 3339 3561 6563 3163 tml#a5d4395aec1c\n+000242e0: 6330 3538 3065 6439 3635 3165 3962 3030 c0580ed9651e9b00\n+000242f0: 3433 3462 3722 3e44 756e 653a 3a44 656e 434b7\">Dune::Den\n+00024300: 7365 4d61 7472 6978 266c 743b 2046 6965 seMatrix< Fie\n+00024310: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n+00024320: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n+00024330: 2667 743b 3a3a 4d3c 2f61 3e3c 2f64 6976 >::M
    constexpr s\n+00024360: 697a 655f 7479 7065 204d 2829 2063 6f6e ize_type M() con\n+00024370: 7374 3c2f 6469 763e 3c64 6976 2063 6c61 st
    numbe\n+00024390: 7220 6f66 2063 6f6c 756d 6e73 3c2f 6469 r of columns
    Definiti\n+000243c0: 6f6e 3c2f 623e 2064 656e 7365 6d61 7472 on densematr\n+000243d0: 6978 2e68 683a 3730 333c 2f64 6976 3e3c ix.hh:703
    <\n+000243e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n+00024440: 6120 6872 6566 3d22 6130 3134 3030 2e68 a href=\"a01400.h\n+00024450: 746d 6c23 6136 3563 3861 6638 6538 6666 tml#a65c8af8e8ff\n+00024460: 3232 3135 3563 3238 3663 3961 3765 6230 22155c286c9a7eb0\n+00024470: 3335 3438 3222 3e44 756e 653a 3a44 656e 35482\">Dune::Den\n+00024480: 7365 4d61 7472 6978 266c 743b 2046 6965 seMatrix< Fie\n+00024490: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n+000244a0: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n+000244b0: 2667 743b 3a3a 7269 6768 746d 756c 7469 >::rightmulti\n+000244c0: 706c 793c 2f61 3e3c 2f64 6976 3e3c 6469 ply
    FieldMatrix<\n+000244f0: 204b 2c20 524f 5753 2c20 434f 4c53 2026 K, ROWS, COLS &\n+00024500: 6774 3b20 2661 6d70 3b20 7269 6768 746d gt; & rightm\n+00024510: 756c 7469 706c 7928 636f 6e73 7420 4465 ultiply(const De\n+00024520: 6e73 654d 6174 7269 7826 6c74 3b20 4d32 nseMatrix< M2\n+00024530: 2026 6774 3b20 2661 6d70 3b4d 293c 2f64 > &M)
    Multiplies\n+00024560: 204d 2066 726f 6d20 7468 6520 7269 6768 M from the righ\n+00024570: 7420 746f 2074 6869 7320 6d61 7472 6978 t to this matrix\n+00024580: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
    Def\n+000245a0: 696e 6974 696f 6e3c 2f62 3e20 6465 6e73 inition dens\n+000245b0: 656d 6174 7269 782e 6868 3a36 3435 3c2f ematrix.hh:645
    .
    \n+00024610: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 <\n+000246b0: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n+000246c0: 6922 3e64 6572 6976 6564 5f74 7970 6520 i\">derived_type \n+000246d0: 2661 6d70 3b20 6f70 6572 6174 6f72 2f3d & operator/=\n+000246e0: 2863 6f6e 7374 2066 6965 6c64 5f74 7970 (const field_typ\n+000246f0: 6520 2661 6d70 3b6b 293c 2f64 6976 3e3c e &k)
    <\n+00024700: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+00024710: 223e 7665 6374 6f72 2073 7061 6365 2064 \">vector space d\n+00024720: 6976 6973 696f 6e20 6279 2073 6361 6c61 ivision by scala\n+00024730: 723c 2f64 6976 3e3c 6469 7620 636c 6173 r
    Def\n+00024750: 696e 6974 696f 6e3c 2f62 3e20 6465 6e73 inition dens\n+00024760: 656d 6174 7269 782e 6868 3a33 3239 3c2f ematrix.hh:329
    .
    \n+000247c0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 <\n+00024860: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n+00024870: 6922 3e64 6572 6976 6564 5f74 7970 6520 i\">derived_type \n+00024880: 2661 6d70 3b20 6f70 6572 6174 6f72 2a3d & operator*=\n+00024890: 2863 6f6e 7374 2066 6965 6c64 5f74 7970 (const field_typ\n+000248a0: 6520 2661 6d70 3b6b 293c 2f64 6976 3e3c e &k)
    <\n+000248b0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+000248c0: 223e 7665 6374 6f72 2073 7061 6365 206d \">vector space m\n+000248d0: 756c 7469 706c 6963 6174 696f 6e20 7769 ultiplication wi\n+000248e0: 7468 2073 6361 6c61 723c 2f64 6976 3e3c th scalar
    <\n+000248f0: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n+00024900: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n+00024910: 2f62 3e20 6465 6e73 656d 6174 7269 782e /b> densematrix.\n+00024920: 6868 3a33 3231 3c2f 6469 763e 3c2f 6469 hh:321
    .
    .\n+00024bd0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    static const\n+00024bf0: 6578 7072 2069 6e74 2062 6c6f 636b 6c65 expr int blockle\n+00024c00: 7665 6c3c 2f64 6976 3e3c 6469 7620 636c vel
    The \n+00024c20: 6e75 6d62 6572 206f 6620 626c 6f63 6b20 number of block \n+00024c30: 6c65 7665 6c73 2077 6520 636f 6e74 6169 levels we contai\n+00024c40: 6e2e 2054 6869 7320 6973 2074 6865 206c n. This is the l\n+00024c50: 6561 662c 2074 6861 7420 6973 2c20 312e eaf, that is, 1.\n+00024c60: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n+00024c80: 6e69 7469 6f6e 3c2f 623e 2064 656e 7365 nition dense\n+00024c90: 6d61 7472 6978 2e68 683a 3137 383c 2f64 matrix.hh:178
    .\n+00024da0: 5472 6169 7473 3a3a 726f 775f 7479 7065 Traits::row_type\n+00024db0: 2072 6f77 5f74 7970 653c 2f64 6976 3e3c row_type
    <\n+00024dc0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+00024dd0: 223e 5468 6520 7479 7065 2075 7365 6420 \">The type used \n+00024de0: 746f 2072 6570 7265 7365 6e74 2061 2072 to represent a r\n+00024df0: 6f77 2028 6d75 7374 2066 756c 6669 6c6c ow (must fulfill\n+00024e00: 2074 6865 2044 756e 653a 3a44 656e 7365 the Dune::Dense\n+00024e10: 5665 6374 6f72 2069 6e74 6572 6661 6365 Vector interface\n+00024e20: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    Def\n+00024e40: 696e 6974 696f 6e3c 2f62 3e20 6465 6e73 inition dens\n+00024e50: 656d 6174 7269 782e 6868 3a31 3639 3c2f ematrix.hh:169
    .
    \n+00024eb0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 Traits::size_t\n+00024f70: 7970 6520 7369 7a65 5f74 7970 653c 2f64 ype size_type
    The type u\n+00024fa0: 7365 6420 666f 7220 7468 6520 696e 6465 sed for the inde\n+00024fb0: 7820 6163 6365 7373 2061 6e64 2073 697a x access and siz\n+00024fc0: 6520 6f70 6572 6174 696f 6e2e 3c2f 6469 e operation.
    Definiti\n+00024ff0: 6f6e 3c2f 623e 2064 656e 7365 6d61 7472 on densematr\n+00025000: 6978 2e68 683a 3136 363c 2f64 6976 3e3c ix.hh:166
    <\n+00025010: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n+00025070: 6120 6872 6566 3d22 6130 3134 3030 2e68 a href=\"a01400.h\n+00025080: 746d 6c23 6164 3839 3134 6266 3431 3434 tml#ad8914bf4144\n+00025090: 3936 3765 3130 3931 6534 6530 3231 3565 967e1091e4e0215e\n+000250a0: 6665 3330 3522 3e44 756e 653a 3a44 656e fe305\">Dune::Den\n+000250b0: 7365 4d61 7472 6978 266c 743b 2046 6965 seMatrix< Fie\n+000250c0: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n+000250d0: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n+000250e0: 2667 743b 3a3a 636f 6e73 745f 726f 775f >::const_row_\n+000250f0: 7265 6665 7265 6e63 653c 2f61 3e3c 2f64 reference
    Traits::c\n+00025120: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n+00025130: 6365 2063 6f6e 7374 5f72 6f77 5f72 6566 ce const_row_ref\n+00025140: 6572 656e 6365 3c2f 6469 763e 3c64 6976 erence
    T\n+00025160: 6865 2074 7970 6520 7573 6564 2074 6f20 he type used to \n+00025170: 7265 7072 6573 656e 7420 6120 7265 6665 represent a refe\n+00025180: 7265 6e63 6520 746f 2061 2063 6f6e 7374 rence to a const\n+00025190: 616e 7420 726f 7720 2875 7375 616c 6c79 ant row (usually\n+000251a0: 2063 6f6e 7374 2072 6f77 5f74 7970 6520 const row_type \n+000251b0: 2661 6d70 3b29 3c2f 6469 763e 3c64 6976 &)
    <\n+000251d0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition
    \n+000251e0: 2064 656e 7365 6d61 7472 6978 2e68 683a densematrix.hh:\n+000251f0: 3137 353c 2f64 6976 3e3c 2f64 6976 3e0a 175
    .\n+00025200: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    Trait\n+00025300: 733a 3a72 6f77 5f72 6566 6572 656e 6365 s::row_reference\n+00025310: 2072 6f77 5f72 6566 6572 656e 6365 3c2f row_reference\n+00025520: 7665 6374 6f72 2073 7061 6365 2061 6464 vector space add\n+00025530: 6974 696f 6e3c 2f64 6976 3e3c 6469 7620 ition
    Definition \n+00025560: 6465 6e73 656d 6174 7269 782e 6868 3a32 densematrix.hh:2\n+00025570: 3839 3c2f 6469 763e 3c2f 6469 763e 0a3c 89
    .<\n+00025580: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n+00025590: 6964 3d22 6161 3031 3430 385f 6874 6d6c id=\"aa01408_html\n+000255a0: 223e 3c64 6976 2063 6c61 7373 3d22 7474 \">
    A dens\n+00025600: 6520 6e20 7820 6d20 6d61 7472 6978 2e3c e n x m matrix.<\n+00025610: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+00025630: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n+00025640: 782e 6868 3a31 3137 3c2f 6469 763e 3c2f x.hh:117
    .
    s\n+00025720: 7461 7469 6320 636f 6e73 7465 7870 7220 tatic constexpr \n+00025730: 7369 7a65 5f74 7970 6520 6d61 745f 636f size_type mat_co\n+00025740: 6c73 2829 3c2f 6469 763e 3c64 6976 2063 ls()
    \n+00025760: 4465 6669 6e69 7469 6f6e 3c2f 623e 2066 Definition f\n+00025770: 6d61 7472 6978 2e68 683a 3336 373c 2f64 matrix.hh:367
    .
    <\n+000257d0: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n+000257e0: 6522 3e3c 6120 6872 6566 3d22 6130 3134 e\">Dune:\n+00025820: 3a46 6965 6c64 4d61 7472 6978 3a3a 4669 :FieldMatrix::Fi\n+00025830: 656c 644d 6174 7269 783c 2f61 3e3c 2f64 eldMatrix
    constexpr\n+00025860: 2046 6965 6c64 4d61 7472 6978 2829 3d64 FieldMatrix()=d\n+00025870: 6566 6175 6c74 3c2f 6469 763e 3c64 6976 efault
    D\n+00025890: 6566 6175 6c74 2063 6f6e 7374 7275 6374 efault construct\n+000258a0: 6f72 2e3c 2f64 6976 3e3c 2f64 6976 3e0a or.
    .\n+000258b0: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    Dune::FieldMatr\n+00025950: 6978 3a3a 636f 6e73 745f 726f 775f 7265 ix::const_row_re\n+00025960: 6665 7265 6e63 653c 2f61 3e3c 2f64 6976 ference
    Base::const\n+00025990: 5f72 6f77 5f72 6566 6572 656e 6365 2063 _row_reference c\n+000259a0: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n+000259b0: 6365 3c2f 6469 763e 3c64 6976 2063 6c61 ce
    De\n+000259d0: 6669 6e69 7469 6f6e 3c2f 623e 2066 6d61 finition fma\n+000259e0: 7472 6978 2e68 683a 3133 313c 2f64 6976 trix.hh:131
    .<\n+00025ab0: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n+00025ac0: 6922 3e46 6965 6c64 4d61 7472 6978 2026 i\">FieldMatrix &\n+00025ad0: 616d 703b 206f 7065 7261 746f 723d 2863 amp; operator=(c\n+00025ae0: 6f6e 7374 2046 6965 6c64 4d61 7472 6978 onst FieldMatrix\n+00025af0: 266c 743b 2054 2c20 524f 5753 2c20 434f < T, ROWS, CO\n+00025b00: 4c53 2026 6774 3b20 2661 6d70 3b78 293c LS > &x)<\n+00025b10: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    copy ass\n+00025b30: 6967 6e6d 656e 7420 6672 6f6d 2046 6965 ignment from Fie\n+00025b40: 6c64 4d61 7472 6978 206f 7665 7220 6120 ldMatrix over a \n+00025b50: 6469 6666 6572 656e 7420 6669 656c 643c different field<\n+00025b60: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+00025b80: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n+00025b90: 782e 6868 3a31 3631 3c2f 6469 763e 3c2f x.hh:161
    .
    Dune::Fiel\n+00025c40: 644d 6174 7269 783a 3a72 6967 6874 6d75 dMatrix::rightmu\n+00025c50: 6c74 6970 6c79 616e 793c 2f61 3e3c 2f64 ltiplyany
    FieldMatr\n+00025c80: 6978 266c 743b 204b 2c20 726f 7773 2c20 ix< K, rows, \n+00025c90: 6c20 2667 743b 2072 6967 6874 6d75 6c74 l > rightmult\n+00025ca0: 6970 6c79 616e 7928 636f 6e73 7420 4669 iplyany(const Fi\n+00025cb0: 656c 644d 6174 7269 7826 6c74 3b20 4b2c eldMatrix< K,\n+00025cc0: 2063 6f6c 732c 206c 2026 6774 3b20 2661 cols, l > &a\n+00025cd0: 6d70 3b4d 2920 636f 6e73 743c 2f64 6976 mp;M) const
    Multiplies M\n+00025d00: 2066 726f 6d20 7468 6520 7269 6768 7420 from the right \n+00025d10: 746f 2074 6869 7320 6d61 7472 6978 2c20 to this matrix, \n+00025d20: 7468 6973 206d 6174 7269 7820 6973 206e this matrix is n\n+00025d30: 6f74 206d 6f64 6966 6965 642e 3c2f 6469 ot modified.
    Definiti\n+00025d60: 6f6e 3c2f 623e 2066 6d61 7472 6978 2e68 on fmatrix.h\n+00025d70: 683a 3335 313c 2f64 6976 3e3c 2f64 6976 h:351
    .
    .\n+00025f60: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Base::size_t\n+00025f80: 7970 6520 7369 7a65 5f74 7970 653c 2f64 ype size_type
    Definit\n+00025fb0: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n+00025fc0: 6868 3a31 3237 3c2f 6469 763e 3c2f 6469 hh:127
    .
    \n+00026090: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    FieldMatrix&\n+000260b0: 6c74 3b20 4b2c 206c 2c20 636f 6c73 2026 lt; K, l, cols &\n+000260c0: 6774 3b20 6c65 6674 6d75 6c74 6970 6c79 gt; leftmultiply\n+000260d0: 616e 7928 636f 6e73 7420 4669 656c 644d any(const FieldM\n+000260e0: 6174 7269 7826 6c74 3b20 4b2c 206c 2c20 atrix< K, l, \n+000260f0: 726f 7773 2026 6774 3b20 2661 6d70 3b4d rows > &M\n+00026100: 2920 636f 6e73 743c 2f64 6976 3e3c 6469 ) const
    \n+00026120: 4d75 6c74 6970 6c69 6573 204d 2066 726f Multiplies M fro\n+00026130: 6d20 7468 6520 6c65 6674 2074 6f20 7468 m the left to th\n+00026140: 6973 206d 6174 7269 782c 2074 6869 7320 is matrix, this \n+00026150: 6d61 7472 6978 2069 7320 6e6f 7420 6d6f matrix is not mo\n+00026160: 6469 6669 6564 2e3c 2f64 6976 3e3c 6469 dified.
    \n+00026180: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition fmatrix.hh:316\n+000261a0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .M\n+000262e0: 756c 7469 706c 6965 7320 4d20 6672 6f6d ultiplies M from\n+000262f0: 2074 6865 2072 6967 6874 2074 6f20 7468 the right to th\n+00026300: 6973 206d 6174 7269 782e 3c2f 6469 763e is matrix.
    \n+00026310: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n+00026330: 3c2f 623e 2066 6d61 7472 6978 2e68 683a fmatrix.hh:\n+00026340: 3333 343c 2f64 6976 3e3c 2f64 6976 3e0a 334
    .\n+00026350: 3c64 6976 2063 6c61 7373 3d22 7474 6322 .\n+00026480: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    frien\n+00026550: 6420 6175 746f 206f 7065 7261 746f 722a d auto operator*\n+00026560: 2863 6f6e 7374 2046 6965 6c64 4d61 7472 (const FieldMatr\n+00026570: 6978 2026 616d 703b 6d61 7472 6978 2c20 ix &matrix, \n+00026580: 5363 616c 6172 2073 6361 6c61 7229 3c2f Scalar scalar)
    vector sp\n+000265b0: 6163 6520 6d75 6c74 6970 6c69 6361 7469 ace multiplicati\n+000265c0: 6f6e 2077 6974 6820 7363 616c 6172 3c2f on with scalar
    Defini\n+000265f0: 7469 6f6e 3c2f 623e 2066 6d61 7472 6978 tion fmatrix\n+00026600: 2e68 683a 3231 323c 2f64 6976 3e3c 2f64 .hh:212
    .
    F\n+000266e0: 6965 6c64 4d61 7472 6978 2026 616d 703b ieldMatrix &\n+000266f0: 206f 7065 7261 746f 723d 2846 6965 6c64 operator=(Field\n+00026700: 4d61 7472 6978 266c 743b 2054 2c20 726f Matrix< T, ro\n+00026710: 7773 2c20 636f 6c73 2026 6774 3b20 636f ws, cols > co\n+00026720: 6e73 7420 2661 6d70 3b29 3d64 656c 6574 nst &)=delet\n+00026730: 653c 2f64 6976 3e3c 6469 7620 636c 6173 e
    no cop\n+00026750: 7920 6173 7369 676e 6d65 6e74 2066 726f y assignment fro\n+00026760: 6d20 4669 656c 644d 6174 7269 7820 6f66 m FieldMatrix of\n+00026770: 2064 6966 6665 7265 6e74 2073 697a 653c different size<\n+00026780: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .
    Base:\n+00026860: 3a72 6f77 5f72 6566 6572 656e 6365 2072 :row_reference r\n+00026870: 6f77 5f72 6566 6572 656e 6365 3c2f 6469 ow_reference
    Definiti\n+000268a0: 6f6e 3c2f 623e 2066 6d61 7472 6978 2e68 on fmatrix.h\n+000268b0: 683a 3133 303c 2f64 6976 3e3c 2f64 6976 h:130
    .
    ro\n+00026990: 775f 7265 6665 7265 6e63 6520 6d61 745f w_reference mat_\n+000269a0: 6163 6365 7373 2873 697a 655f 7479 7065 access(size_type\n+000269b0: 2069 293c 2f64 6976 3e3c 6469 7620 636c i)
    D\n+000269d0: 6566 696e 6974 696f 6e3c 2f62 3e20 666d efinition fm\n+000269e0: 6174 7269 782e 6868 3a33 3639 3c2f 6469 atrix.hh:369
    .
    s\n+00026ac0: 7461 7469 6320 636f 6e73 7465 7870 7220 tatic constexpr \n+00026ad0: 696e 7420 726f 7773 3c2f 6469 763e 3c64 int rows
    The number of r\n+00026b00: 6f77 732e 3c2f 6469 763e 3c64 6976 2063 ows.
    \n+00026b20: 4465 6669 6e69 7469 6f6e 3c2f 623e 2066 Definition f\n+00026b30: 6d61 7472 6978 2e68 683a 3132 333c 2f64 matrix.hh:123
    .
    <\n+00026b90: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n+00026ba0: 6522 3e3c 6120 6872 6566 3d22 6130 3134 e\">Dune:\n+00026be0: 3a46 6965 6c64 4d61 7472 6978 3a3a 7472 :FieldMatrix::tr\n+00026bf0: 616e 7370 6f73 6564 3c2f 613e 3c2f 6469 ansposed
    FieldMatri\n+00026c20: 7826 6c74 3b20 4b2c 2043 4f4c 532c 2052 x< K, COLS, R\n+00026c30: 4f57 5320 2667 743b 2074 7261 6e73 706f OWS > transpo\n+00026c40: 7365 6428 2920 636f 6e73 743c 2f64 6976 sed() const
    Return trans\n+00026c70: 706f 7365 6420 6f66 2074 6865 206d 6174 posed of the mat\n+00026c80: 7269 7820 6173 2046 6965 6c64 4d61 7472 rix as FieldMatr\n+00026c90: 6978 2e3c 2f64 6976 3e3c 6469 7620 636c ix.
    D\n+00026cb0: 6566 696e 6974 696f 6e3c 2f62 3e20 666d efinition fm\n+00026cc0: 6174 7269 782e 6868 3a31 3732 3c2f 6469 atrix.hh:172
    .<\n+00026d90: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n+00026da0: 6922 3e73 7461 7469 6320 636f 6e73 7465 i\">static conste\n+00026db0: 7870 7220 7369 7a65 5f74 7970 6520 6d61 xpr size_type ma\n+00026dc0: 745f 726f 7773 2829 3c2f 6469 763e 3c64 t_rows()
    Definition fmatrix.hh:36\n+00026e00: 363c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6
    .C\n+00026f50: 6f6e 7374 7275 6374 6f72 2069 6e69 7469 onstructor initi\n+00026f60: 616c 697a 696e 6720 7468 6520 6d61 7472 alizing the matr\n+00026f70: 6978 2066 726f 6d20 6120 6c69 7374 206f ix from a list o\n+00026f80: 6620 7665 6374 6f72 2e3c 2f64 6976 3e3c f vector.
    <\n+00026f90: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n+00026fa0: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n+00026fb0: 2f62 3e20 666d 6174 7269 782e 6868 3a31 /b> fmatrix.hh:1\n+00026fc0: 3430 3c2f 6469 763e 3c2f 6469 763e 0a3c 40
    .<\n+00026fd0: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n+00026fe0: 6964 3d22 6161 3031 3430 385f 6874 6d6c id=\"aa01408_html\n+00026ff0: 5f61 6332 3831 3666 3164 3036 3766 3533 _ac2816f1d067f53\n+00027000: 3333 3636 3239 3763 3035 3366 3037 3039 3366297c053f0709\n+00027010: 3962 223e 3c64 6976 2063 6c61 7373 3d22 9b\">
    \n+00027060: 4475 6e65 3a3a 4669 656c 644d 6174 7269 Dune::FieldMatri\n+00027070: 783a 3a63 6f6c 733c 2f61 3e3c 2f64 6976 x::cols
    static cons\n+000270a0: 7465 7870 7220 696e 7420 636f 6c73 3c2f texpr int cols
    The numbe\n+000270d0: 7220 6f66 2063 6f6c 756d 6e73 2e3c 2f64 r of columns.
    Definit\n+00027100: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n+00027110: 6868 3a31 3235 3c2f 6469 763e 3c2f 6469 hh:125
    .
    fr\n+000271f0: 6965 6e64 2061 7574 6f20 6f70 6572 6174 iend auto operat\n+00027200: 6f72 2f28 636f 6e73 7420 4669 656c 644d or/(const FieldM\n+00027210: 6174 7269 7820 2661 6d70 3b6d 6174 7269 atrix &matri\n+00027220: 782c 2053 6361 6c61 7220 7363 616c 6172 x, Scalar scalar\n+00027230: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    vector\n+00027250: 2073 7061 6365 2064 6976 6973 696f 6e20 space division \n+00027260: 6279 2073 6361 6c61 723c 2f64 6976 3e3c by scalar
    <\n+00027270: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n+00027280: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n+00027290: 2f62 3e20 666d 6174 7269 782e 6868 3a32 /b> fmatrix.hh:2\n+000272a0: 3430 3c2f 6469 763e 3c2f 6469 763e 0a3c 40
    .<\n+000272b0: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n+000272c0: 6964 3d22 6161 3031 3430 385f 6874 6d6c id=\"aa01408_html\n+000272d0: 5f61 6536 3033 3366 3231 3764 3264 6531 _ae6033f217d2de1\n+000272e0: 6337 6330 6464 6431 3038 3435 3966 6638 c7c0ddd108459ff8\n+000272f0: 6163 223e 3c64 6976 2063 6c61 7373 3d22 ac\">
    friend\n+00027380: 2061 7574 6f20 6f70 6572 6174 6f72 2b28 auto operator+(\n+00027390: 636f 6e73 7420 4669 656c 644d 6174 7269 const FieldMatri\n+000273a0: 7820 2661 6d70 3b6d 6174 7269 7841 2c20 x &matrixA, \n+000273b0: 636f 6e73 7420 4669 656c 644d 6174 7269 const FieldMatri\n+000273c0: 7826 6c74 3b20 4f74 6865 7253 6361 6c61 x< OtherScala\n+000273d0: 722c 2052 4f57 532c 2043 4f4c 5320 2667 r, ROWS, COLS &g\n+000273e0: 743b 2026 616d 703b 6d61 7472 6978 4229 t; &matrixB)\n+000273f0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    vector \n+00027410: 7370 6163 6520 6164 6469 7469 6f6e 20e2 space addition .\n+00027420: 8093 2074 776f 2d61 7267 756d 656e 7420 .. two-argument \n+00027430: 7665 7273 696f 6e3c 2f64 6976 3e3c 6469 version
    \n+00027450: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition fmatrix.hh:183\n+00027470: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .
    Du\n+00027510: 6e65 3a3a 4669 656c 644d 6174 7269 783a ne::FieldMatrix:\n+00027520: 3a6f 7065 7261 746f 723d 3c2f 613e 3c2f :operator=
    FieldMat\n+00027550: 7269 7820 2661 6d70 3b20 6f70 6572 6174 rix & operat\n+00027560: 6f72 3d28 636f 6e73 7420 4669 656c 644d or=(const FieldM\n+00027570: 6174 7269 7820 2661 6d70 3b29 3d64 6566 atrix &)=def\n+00027580: 6175 6c74 3c2f 6469 763e 3c64 6976 2063 ault
    cop\n+000275a0: 7920 6173 7369 676e 6d65 6e74 206f 7065 y assignment ope\n+000275b0: 7261 746f 723c 2f64 6976 3e3c 2f64 6976 rator
    .
    vect\n+00027720: 6f72 2073 7061 6365 2073 7562 7472 6163 or space subtrac\n+00027730: 7469 6f6e 20e2 8093 2074 776f 2d61 7267 tion ... two-arg\n+00027740: 756d 656e 7420 7665 7273 696f 6e3c 2f64 ument version
    Definit\n+00027770: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n+00027780: 6868 3a31 3937 3c2f 6469 763e 3c2f 6469 hh:197
    .
    c\n+00027860: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n+00027870: 6365 206d 6174 5f61 6363 6573 7328 7369 ce mat_access(si\n+00027880: 7a65 5f74 7970 6520 6929 2063 6f6e 7374 ze_type i) const\n+00027890: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n+000278b0: 6e69 7469 6f6e 3c2f 623e 2066 6d61 7472 nition fmatr\n+000278c0: 6978 2e68 683a 3337 353c 2f64 6976 3e3c ix.hh:375
    <\n+000278d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    vector space ou\n+00027960: 7420 6f66 2061 2074 656e 736f 7220 7072 t of a tensor pr\n+00027970: 6f64 7563 7420 6f66 2066 6965 6c64 732e oduct of fields.\n+00027980: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n+000279a0: 6e69 7469 6f6e 3c2f 623e 2066 7665 6374 nition fvect\n+000279b0: 6f72 2e68 683a 3935 3c2f 6469 763e 3c2f or.hh:95
    .
    Dune::Dens\n+00027a60: 654d 6174 5665 6354 7261 6974 7326 6c74 eMatVecTraits<\n+00027a70: 3b20 4669 656c 644d 6174 7269 7826 6c74 ; FieldMatrix<\n+00027a80: 3b20 4b2c 2052 4f57 532c 2043 4f4c 5320 ; K, ROWS, COLS \n+00027a90: 2667 743b 2026 6774 3b3a 3a63 6f6e 7461 > >::conta\n+00027aa0: 696e 6572 5f74 7970 653c 2f61 3e3c 2f64 iner_type
    std::arra\n+00027ad0: 7926 6c74 3b20 726f 775f 7479 7065 2c20 y< row_type, \n+00027ae0: 524f 5753 2026 6774 3b20 636f 6e74 6169 ROWS > contai\n+00027af0: 6e65 725f 7479 7065 3c2f 6469 763e 3c64 ner_type
    Definition fmatrix.hh:95\n+00027b30: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n+00027cb0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    K\n+00027db0: 2076 616c 7565 5f74 7970 653c 2f64 6976 value_type
    Definitio\n+00027de0: 6e3c 2f62 3e20 666d 6174 7269 782e 6868 n fmatrix.hh\n+00027df0: 3a39 363c 2f64 6976 3e3c 2f64 6976 3e0a :96
    .\n+00027e00: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    Dune::DenseMatV\n+00027ea0: 6563 5472 6169 7473 266c 743b 2046 6965 ecTraits< Fie\n+00027eb0: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n+00027ec0: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n+00027ed0: 2667 743b 3a3a 636f 6e73 745f 726f 775f >::const_row_\n+00027ee0: 7265 6665 7265 6e63 653c 2f61 3e3c 2f64 reference
    const row\n+00027f10: 5f74 7970 6520 2661 6d70 3b20 636f 6e73 _type & cons\n+00027f20: 745f 726f 775f 7265 6665 7265 6e63 653c t_row_reference<\n+00027f30: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+00027f50: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n+00027f60: 782e 6868 3a39 333c 2f64 6976 3e3c 2f64 x.hh:93
    .
    Definition \n+000280c0: 666d 6174 7269 782e 6868 3a39 303c 2f64 fmatrix.hh:90
    .
    <\n+00028120: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n+00028130: 6522 3e3c 6120 6872 6566 3d22 6130 3137 e\">Dune:\n+00028170: 3a44 656e 7365 4d61 7456 6563 5472 6169 :DenseMatVecTrai\n+00028180: 7473 266c 743b 2046 6965 6c64 4d61 7472 ts< FieldMatr\n+00028190: 6978 266c 743b 204b 2c20 524f 5753 2c20 ix< K, ROWS, \n+000281a0: 434f 4c53 2026 6774 3b20 2667 743b 3a3a COLS > >::\n+000281b0: 7369 7a65 5f74 7970 653c 2f61 3e3c 2f64 size_type
    container\n+000281e0: 5f74 7970 653a 3a73 697a 655f 7479 7065 _type::size_type\n+000281f0: 2073 697a 655f 7479 7065 3c2f 6469 763e size_type
    \n+00028200: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n+00028220: 3c2f 623e 2066 6d61 7472 6978 2e68 683a fmatrix.hh:\n+00028230: 3937 3c2f 6469 763e 3c2f 6469 763e 0a3c 97
    .<\n+00028240: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n+00028250: 6964 3d22 6161 3031 3733 325f 6874 6d6c id=\"aa01732_html\n+00028260: 5f61 6366 3564 3334 6637 3736 3561 3931 _acf5d34f7765a91\n+00028270: 6137 3837 3661 6436 6664 3663 3637 6434 a7876ad6fd6c67d4\n+00028280: 3131 223e 3c64 6976 2063 6c61 7373 3d22 11\">\n+00028340: 726f 775f 7479 7065 2026 616d 703b 2072 row_type & r\n+00028350: 6f77 5f72 6566 6572 656e 6365 3c2f 6469 ow_reference
    Definiti\n+00028380: 6f6e 3c2f 623e 2066 6d61 7472 6978 2e68 on fmatrix.h\n+00028390: 683a 3932 3c2f 6469 763e 3c2f 6469 763e h:92
    \n+000283a0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    Dune::FieldTra\n+00028440: 6974 7326 6c74 3b20 4669 656c 644d 6174 its< FieldMat\n+00028450: 7269 7826 6c74 3b20 4b2c 2052 4f57 532c rix< K, ROWS,\n+00028460: 2043 4f4c 5320 2667 743b 2026 6774 3b3a COLS > >:\n+00028470: 3a66 6965 6c64 5f74 7970 653c 2f61 3e3c :field_type<\n+00028480: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    FieldTr\n+000284a0: 6169 7473 266c 743b 204b 2026 6774 3b3a aits< K >:\n+000284b0: 3a66 6965 6c64 5f74 7970 6520 6669 656c :field_type fiel\n+000284c0: 645f 7479 7065 3c2f 6469 763e 3c64 6976 d_type
    <\n+000284e0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n+000284f0: 2066 6d61 7472 6978 2e68 683a 3130 333c fmatrix.hh:103<\n+00028500: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .<\n+000285f0: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n+00028600: 6922 3e46 6965 6c64 5472 6169 7473 266c i\">FieldTraits&l\n+00028610: 743b 204b 2026 6774 3b3a 3a72 6561 6c5f t; K >::real_\n+00028620: 7479 7065 2072 6561 6c5f 7479 7065 3c2f type real_type
    Defini\n+00028650: 7469 6f6e 3c2f 623e 2066 6d61 7472 6978 tion fmatrix\n+00028660: 2e68 683a 3130 343c 2f64 6976 3e3c 2f64 .hh:104
    .
    <\n+000286f0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n+00028700: 2066 7472 6169 7473 2e68 683a 3236 3c2f ftraits.hh:26
    .
    \n+00028760: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
    Dune\n+000287b0: 3a3a 4669 656c 6454 7261 6974 733a 3a66 ::FieldTraits::f\n+000287c0: 6965 6c64 5f74 7970 653c 2f61 3e3c 2f64 ield_type
    T field_t\n+000287f0: 7970 653c 2f64 6976 3e3c 6469 7620 636c ype
    expo\n+00028810: 7274 2074 6865 2074 7970 6520 7265 7072 rt the type repr\n+00028820: 6573 656e 7469 6e67 2074 6865 2066 6965 esenting the fie\n+00028830: 6c64 3c2f 6469 763e 3c64 6976 2063 6c61 ld
    De\n+00028850: 6669 6e69 7469 6f6e 3c2f 623e 2066 7472 finition ftr\n+00028860: 6169 7473 2e68 683a 3238 3c2f 6469 763e aits.hh:28
    \n+00028870: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .T real_type
    export the\n+00028970: 2074 7970 6520 7265 7072 6573 656e 7469 type representi\n+00028980: 6e67 2074 6865 2072 6561 6c20 7479 7065 ng the real type\n+00028990: 206f 6620 7468 6520 6669 656c 643c 2f64 of the field
    Definit\n+000289c0: 696f 6e3c 2f62 3e20 6674 7261 6974 732e ion ftraits.\n+000289d0: 6868 3a33 303c 2f64 6976 3e3c 2f64 6976 hh:30
    .
    \n+00028a50: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n+00028a70: 3c2f 623e 206d 6174 7665 6374 7261 6974 matvectrait\n+00028a80: 732e 6868 3a33 313c 2f64 6976 3e3c 2f64 s.hh:31
    .
    Dune::Promo\n+00028b30: 7469 6f6e 5472 6169 7473 3a3a 5072 6f6d tionTraits::Prom\n+00028b40: 6f74 6564 5479 7065 3c2f 613e 3c2f 6469 otedType
    decltype(s\n+00028b70: 7464 3a3a 6465 636c 7661 6c26 6c74 3b20 td::declval< \n+00028b80: 5431 2026 6774 3b28 292b 7374 643a 3a64 T1 >()+std::d\n+00028b90: 6563 6c76 616c 266c 743b 2054 3220 2667 eclval< T2 &g\n+00028ba0: 743b 2829 2920 5072 6f6d 6f74 6564 5479 t;()) PromotedTy\n+00028bb0: 7065 3c2f 6469 763e 3c64 6976 2063 6c61 pe
    De\n+00028bd0: 6669 6e69 7469 6f6e 3c2f 623e 2070 726f finition pro\n+00028be0: 6d6f 7469 6f6e 7472 6169 7473 2e68 683a motiontraits.hh:\n+00028bf0: 3238 3c2f 6469 763e 3c2f 6469 763e 0a3c 28
    .<\n+00028c00: 2f64 6976 3e3c 212d 2d20 6672 6167 6d65 /div>
    ..
    .Gen\n+00028c80: 6572 6174 6564 2062 7926 2331 3630 3b3c erated by <\n+00028c90: 6120 6872 6566 3d22 6874 7470 733a 2f2f a href=\"https://\n+00028ca0: 7777 772e 646f 7879 6765 6e2e 6f72 672f www.doxygen.org/\n+00028cb0: 696e 6465 782e 6874 6d6c 223e 3c69 6d67 index.html\"> 1.\n+00028d10: 392e 380a 3c2f 736d 616c 6c3e 3c2f 6164 9.8...<\n+00028d30: 2f68 746d 6c3e 0a /html>.\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,1059 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-keywords.hh\n+fmatrix.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 (C) 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 (C) 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-18#if __cpp_inline_variables >= 201606\n-_\b1_\b9#define DUNE_INLINE_VARIABLE inline\n-20#else\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_FMATRIX_HH\n+6#define DUNE_FMATRIX_HH\n+7\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/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\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/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+17#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+18#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+19#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+20#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+21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b._\bh_\bh>\n 22\n-25#define DUNE_INLINE_VARIABLE\n-26#endif\n-27\n+23namespace _\bD_\bu_\bn_\be\n+24{\n+25\n+26 namespace Impl\n+27 {\n 28\n-29#if __cpp_constexpr >= 201304\n-_\b3_\b0#define DUNE_GENERALIZED_CONSTEXPR constexpr\n-31#else\n+29 template\n+30 class ColumnVectorView\n+31 {\n+32 public:\n 33\n-36#define DUNE_GENERALIZED_CONSTEXPR\n-37#endif\n-38\n-39\n-40#endif // DUNE_COMMON_KEYWORDS_HH\n+34 using value_type = typename M::value_type;\n+35 using size_type = typename M::size_type;\n+36\n+37 constexpr ColumnVectorView(M& matrix, size_type col) :\n+38 matrix_(matrix),\n+39 col_(col)\n+40 {}\n+41\n+42 constexpr size_type N () const {\n+43 return matrix_.N();\n+44 }\n+45\n+46 template and not std::is_const_v, int> = 0>\n+48 constexpr value_type& operator[] (size_type row) {\n+49 return matrix_[row][col_];\n+50 }\n+51\n+52 constexpr const value_type& operator[] (size_type row) const {\n+53 return matrix_[row][col_];\n+54 }\n+55\n+56 protected:\n+57 M& matrix_;\n+58 const size_type col_;\n+59 };\n+60\n+61 }\n+62\n+63 template\n+64 struct FieldTraits< Impl::ColumnVectorView >\n+65 {\n+66 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+67 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+68 };\n+69\n+81 template< class K, int ROWS, int COLS = ROWS > class FieldMatrix;\n+82\n+83\n+84 template< class K, int ROWS, int COLS >\n+_\b8_\b5 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n+86 {\n+_\b8_\b7 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b> _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n+88\n+89 // each row is implemented by a field vector\n+_\b9_\b0 typedef _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bC_\bO_\bL_\bS_\b> _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+91\n+_\b9_\b2 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be &_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b9_\b3 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+94\n+_\b9_\b5 typedef std::array _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be;\n+_\b9_\b6 typedef K _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b9_\b7 typedef typename container_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+98 };\n+99\n+100 template< class K, int ROWS, int COLS >\n+_\b1_\b0_\b1 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n+102 {\n+_\b1_\b0_\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+_\b1_\b0_\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+105 };\n+106\n+115 template\n+_\b1_\b1_\b6 class _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx : public _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< FieldMatrix >\n+117 {\n+118 std::array< FieldVector, ROWS > _data;\n+119 typedef _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b> > _\bB_\ba_\bs_\be;\n+120 public:\n+121\n+_\b1_\b2_\b3 constexpr static int _\br_\bo_\bw_\bs = ROWS;\n+_\b1_\b2_\b5 constexpr static int _\bc_\bo_\bl_\bs = COLS;\n+126\n+_\b1_\b2_\b7 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+_\b1_\b2_\b8 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+129\n+_\b1_\b3_\b0 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b1_\b3_\b1 typedef 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 _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+132\n+133 //===== constructors\n+_\b1_\b3_\b6 constexpr _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx() = default;\n+137\n+_\b1_\b4_\b0 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(std::initializer_list<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bc_\bo_\bl_\bs_\b> > const &l) {\n+141 assert(l.size() == _\br_\bo_\bw_\bs); // Actually, this is not needed any more!\n+142 std::copy_n(l.begin(), std::min(static_cast(ROWS),\n+143 l.size()),\n+144 _data.begin());\n+145 }\n+146\n+147 template ::value>>\n+_\b1_\b4_\b9 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(T const& rhs)\n+150 {\n+151 *this = rhs;\n+152 }\n+153\n+154 using Base::operator=;\n+155\n+_\b1_\b5_\b7 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx&) = default;\n+158\n+160 template\n+_\b1_\b6_\b1 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b>& x)\n+162 {\n+163 _data = x._data;\n+164 return *this;\n+165 }\n+166\n+168 template \n+_\b1_\b6_\b9 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b> const&) = delete;\n+170\n+_\b1_\b7_\b2 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bC_\bO_\bL_\bS_\b,_\b _\bR_\bO_\bW_\bS_\b> _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n+173 {\n+174 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bC_\bO_\bL_\bS_\b,_\b _\bR_\bO_\bW_\bS_\b> AT;\n+175 for( int i = 0; i < ROWS; ++i )\n+176 for( int j = 0; j < COLS; ++j )\n+177 AT[j][i] = (*this)[i][j];\n+178 return AT;\n+179 }\n+180\n+182 template \n+_\b1_\b8_\b3 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+184 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b>& matrixB)\n+185 {\n+186 _\bF_\bi_\be_\bl_\bd_\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,ROWS,COLS> result;\n+187\n+188 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n+189 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n+190 result[i][j] = matrixA[i][j] + matrixB[i][j];\n+191\n+192 return result;\n+193 }\n+194\n+196 template \n+_\b1_\b9_\b7 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+198 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b>& matrixB)\n+199 {\n+200 _\bF_\bi_\be_\bl_\bd_\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,ROWS,COLS> result;\n+201\n+202 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n+203 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n+204 result[i][j] = matrixA[i][j] - matrixB[i][j];\n+205\n+206 return result;\n+207 }\n+208\n+210 template ::value, int> = 0>\n+_\b2_\b1_\b2 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n+213 {\n+214 _\bF_\bi_\be_\bl_\bd_\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,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,ROWS,COLS>\n+result;\n+215\n+216 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n+217 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n+218 result[i][j] = matrix[i][j] * scalar;\n+219\n+220 return result;\n+221 }\n+222\n+224 template ::value, int> = 0>\n+_\b2_\b2_\b6 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( Scalar scalar, const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+227 {\n+228 _\bF_\bi_\be_\bl_\bd_\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,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,ROWS,COLS>\n+result;\n+229\n+230 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n+231 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n+232 result[i][j] = scalar * matrix[i][j];\n+233\n+234 return result;\n+235 }\n+236\n+238 template ::value, int> = 0>\n+_\b2_\b4_\b0 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n+241 {\n+242 _\bF_\bi_\be_\bl_\bd_\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,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,ROWS,COLS>\n+result;\n+243\n+244 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n+245 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n+246 result[i][j] = matrix[i][j] / scalar;\n+247\n+248 return result;\n+249 }\n+250\n+253 template \n+_\b2_\b5_\b4 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+255 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b,_\b _\bC_\bO_\bL_\bS_\b,_\b _\bo_\bt_\bh_\be_\br_\bC_\bo_\bl_\bs_\b>& matrixB)\n+256 {\n+257 _\bF_\bi_\be_\bl_\bd_\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,ROWS,otherCols> result;\n+258\n+259 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < matrixA._\bm_\ba_\bt_\b__\br_\bo_\bw_\bs(); ++i)\n+260 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < matrixB._\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs(); ++j)\n+261 {\n+262 result[i][j] = 0;\n+263 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k = 0; k < matrixA._\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs(); ++k)\n+264 result[i][j] += matrixA[i][k] * matrixB[k][j];\n+265 }\n+266\n+267 return result;\n+268 }\n+269\n+276 template \n+278 and not Impl::IsFieldMatrix_v\n+279 , int> = 0>\n+_\b2_\b8_\b0 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+281 const OtherMatrix& matrixB)\n+282 {\n+283 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n+_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+284 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\br_\bo_\bw_\bs_\b _\b,_\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs_\b> result;\n+285 for (std::size_t j=0; j<_\br_\bo_\bw_\bs; ++j)\n+286 matrixB._\bm_\bt_\bv(matrixA[j], result[j]);\n+287 return result;\n+288 }\n+289\n+296 template \n+298 and not Impl::IsFieldMatrix_v\n+299 , int> = 0>\n+_\b3_\b0_\b0 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const OtherMatrix& matrixA,\n+301 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixB)\n+302 {\n+303 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n+_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+304 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs_\b,_\b _\bc_\bo_\bl_\bs_\b> result;\n+305 for (std::size_t j=0; j<_\bc_\bo_\bl_\bs; ++j)\n+306 {\n+307 auto B_j = Impl::ColumnVectorView(matrixB, j);\n+308 auto result_j = Impl::ColumnVectorView(result, j);\n+309 matrixA.mv(B_j, result_j);\n+310 }\n+311 return result;\n+312 }\n+313\n+315 template\n+_\b3_\b1_\b6 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> _\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (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+317 {\n+318 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> C;\n+319\n+320 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b3_\b4 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\b,_\bc_\b>& _\bM)\n+335 {\n+336 static_assert(r == c, \"Cannot rightmultiply with non-square matrix\");\n+337 static_assert(r == _\bc_\bo_\bl_\bs, \"Size mismatch\");\n+338 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b> C(*this);\n+339\n+340 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs; i++)\n+341 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs; j++) {\n+342 (*this)[i][j] = 0;\n+343 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k<_\bc_\bo_\bl_\bs; k++)\n+344 (*this)[i][j] += C[i][k]*_\bM[k][j];\n+345 }\n+346 return *this;\n+347 }\n+348\n+350 template\n+_\b3_\b5_\b1 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bl_\b> _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b,_\bl_\b>& _\bM)\n+const\n+352 {\n+353 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bl_\b> C;\n+354\n+355 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs; i++) {\n+356 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n+386 class FieldMatrix : public DenseMatrix< FieldMatrix >\n+387 {\n+388 FieldVector _data;\n+389 typedef DenseMatrix< FieldMatrix > Base;\n+390 public:\n+391 // standard constructor and everything is sufficient ...\n+392\n+393 //===== type definitions and constants\n+394\n+396 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+397\n+400 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n+401\n+402 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+403\n+404 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+405 typedef 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 _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+406\n+409 constexpr static int _\br_\bo_\bw_\bs = 1;\n+412 constexpr static int _\bc_\bo_\bl_\bs = 1;\n+413\n+414 //===== constructors\n+417 constexpr _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx() = default;\n+418\n+421 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(std::initializer_list<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\b1_\b>> const &l)\n+422 {\n+423 std::copy_n(l.begin(), std::min(static_cast< std::size_t >( 1 ), l.size()),\n+&_data);\n+424 }\n+425\n+426 template ::value>>\n+428 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(T const& rhs)\n+429 {\n+430 *this = rhs;\n+431 }\n+432\n+433 using Base::operator=;\n+434\n+436 FieldMatrix _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n+437 {\n+438 return *this;\n+439 }\n+440\n+442 template \n+443 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+444 const FieldMatrix& matrixB)\n+445 {\n+446 return FieldMatrix::\n+PromotedType,1,1>{matrixA[0][0] + matrixB[0][0]};\n+447 }\n+448\n+450 template ::value, int> = 0>\n+452 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix,\n+453 const Scalar& scalar)\n+454 {\n+455 return FieldMatrix::PromotedType,1,1>\n+{matrix[0][0] + scalar};\n+456 }\n+457\n+459 template ::value, int> = 0>\n+461 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const Scalar& scalar,\n+462 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+463 {\n+464 return FieldMatrix::PromotedType,1,1>\n+{scalar + matrix[0][0]};\n+465 }\n+466\n+468 template \n+469 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+470 const FieldMatrix& matrixB)\n+471 {\n+472 return FieldMatrix::\n+PromotedType,1,1>{matrixA[0][0] - matrixB[0][0]};\n+473 }\n+474\n+476 template ::value, int> = 0>\n+478 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix,\n+479 const Scalar& scalar)\n+480 {\n+481 return FieldMatrix::PromotedType,1,1>\n+{matrix[0][0] - scalar};\n+482 }\n+483\n+485 template ::value, int> = 0>\n+487 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const Scalar& scalar,\n+488 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+489 {\n+490 return FieldMatrix::PromotedType,1,1>\n+{scalar - matrix[0][0]};\n+491 }\n+492\n+494 template ::value, int> = 0>\n+496 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n+497 {\n+498 return FieldMatrix::PromotedType,1,1>\n+{matrix[0][0] * scalar};\n+499 }\n+500\n+502 template ::value, int> = 0>\n+504 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( Scalar scalar, const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+505 {\n+506 return FieldMatrix::PromotedType,1,1>\n+{scalar * matrix[0][0]};\n+507 }\n+508\n+510 template ::value, int> = 0>\n+512 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n+513 {\n+514 return FieldMatrix::PromotedType,1,1>\n+{matrix[0][0] / scalar};\n+515 }\n+516\n+517 //===== solve\n+518\n+521 template \n+522 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+523 const FieldMatrix& matrixB)\n+524 {\n+525 FieldMatrix::\n+PromotedType,1,otherCols> result;\n+526\n+527 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < matrixB.mat_cols(); ++j)\n+528 result[0][j] = matrixA[0][0] * matrixB[0][j];\n+529\n+530 return result;\n+531 }\n+532\n+539 template \n+541 and not Impl::IsFieldMatrix_v\n+542 and (OtherMatrix::rows==1)\n+543 , int> = 0>\n+544 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n+545 const OtherMatrix& matrixB)\n+546 {\n+547 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n+_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+548 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\br_\bo_\bw_\bs_\b _\b,_\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs_\b> result;\n+549 for (std::size_t j=0; j<_\br_\bo_\bw_\bs; ++j)\n+550 matrixB.mtv(matrixA[j], result[j]);\n+551 return result;\n+552 }\n+553\n+560 template \n+562 and not Impl::IsFieldMatrix_v\n+563 and (OtherMatrix::cols==1)\n+564 , int> = 0>\n+565 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const OtherMatrix& matrixA,\n+566 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixB)\n+567 {\n+568 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n+_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n+569 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs_\b,_\b _\bc_\bo_\bl_\bs_\b> result;\n+570 for (std::size_t j=0; j<_\bc_\bo_\bl_\bs; ++j)\n+571 {\n+572 auto B_j = Impl::ColumnVectorView(matrixB, j);\n+573 auto result_j = Impl::ColumnVectorView(result, j);\n+574 matrixA.mv(B_j, result_j);\n+575 }\n+576 return result;\n+577 }\n+578\n+580 template\n+581 FieldMatrix _\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (const FieldMatrix& _\bM) const\n+582 {\n+583 FieldMatrix C;\n+584 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n+598 FieldMatrix _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (const FieldMatrix& _\bM) const\n+599 {\n+600 FieldMatrix C;\n+601\n+602 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n+659 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const FieldMatrix& a)\n+660 {\n+661 s << a[0][0];\n+662 return s;\n+663 }\n+664\n+665#endif // DOXYGEN\n+666\n+_\b6_\b6_\b7 namespace FMatrixHelp {\n+668\n+670 template \n+_\b6_\b7_\b1 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b> &matrix,\n+_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b> &inverse)\n+672 {\n+673 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+674 inverse[0][0] = real_type(1.0)/matrix[0][0];\n+675 return matrix[0][0];\n+676 }\n+677\n+679 template \n+_\b6_\b8_\b0 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>\n+&matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b> &inverse)\n+681 {\n+682 return _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix,inverse);\n+683 }\n+684\n+685\n+687 template \n+_\b6_\b8_\b8 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b> &matrix,\n+_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b> &inverse)\n+689 {\n+690 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+691 // code generated by maple\n+692 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);\n+693 K det_1 = real_type(1.0)/det;\n+694 inverse[0][0] = matrix[1][1] * det_1;\n+695 inverse[0][1] = - matrix[0][1] * det_1;\n+696 inverse[1][0] = - matrix[1][0] * det_1;\n+697 inverse[1][1] = matrix[0][0] * det_1;\n+698 return det;\n+699 }\n+700\n+703 template \n+_\b7_\b0_\b4 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b>\n+&matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b> &inverse)\n+705 {\n+706 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+707 // code generated by maple\n+708 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);\n+709 K det_1 = real_type(1.0)/det;\n+710 inverse[0][0] = matrix[1][1] * det_1;\n+711 inverse[1][0] = - matrix[0][1] * det_1;\n+712 inverse[0][1] = - matrix[1][0] * det_1;\n+713 inverse[1][1] = matrix[0][0] * det_1;\n+714 return det;\n+715 }\n+716\n+718 template \n+_\b7_\b1_\b9 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b> &matrix,\n+_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b> &inverse)\n+720 {\n+721 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+722 // code generated by maple\n+723 K t4 = matrix[0][0] * matrix[1][1];\n+724 K t6 = matrix[0][0] * matrix[1][2];\n+725 K t8 = matrix[0][1] * matrix[1][0];\n+726 K t10 = matrix[0][2] * matrix[1][0];\n+727 K t12 = matrix[0][1] * matrix[2][0];\n+728 K t14 = matrix[0][2] * matrix[2][0];\n+729\n+730 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+\n+731 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);\n+732 K t17 = real_type(1.0)/det;\n+733\n+734 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2]\n+[1])*t17;\n+735 inverse[0][1] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2]\n+[1])*t17;\n+736 inverse[0][2] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1]\n+[1])*t17;\n+737 inverse[1][0] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2]\n+[0])*t17;\n+738 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;\n+739 inverse[1][2] = -(t6-t10) * t17;\n+740 inverse[2][0] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0])\n+* t17;\n+741 inverse[2][1] = -(matrix[0][0] * matrix[2][1] - t12) * t17;\n+742 inverse[2][2] = (t4-t8) * t17;\n+743\n+744 return det;\n+745 }\n+746\n+748 template \n+_\b7_\b4_\b9 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b>\n+&matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b> &inverse)\n+750 {\n+751 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+752 // code generated by maple\n+753 K t4 = matrix[0][0] * matrix[1][1];\n+754 K t6 = matrix[0][0] * matrix[1][2];\n+755 K t8 = matrix[0][1] * matrix[1][0];\n+756 K t10 = matrix[0][2] * matrix[1][0];\n+757 K t12 = matrix[0][1] * matrix[2][0];\n+758 K t14 = matrix[0][2] * matrix[2][0];\n+759\n+760 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+\n+761 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);\n+762 K t17 = real_type(1.0)/det;\n+763\n+764 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2]\n+[1])*t17;\n+765 inverse[1][0] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2]\n+[1])*t17;\n+766 inverse[2][0] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1]\n+[1])*t17;\n+767 inverse[0][1] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2]\n+[0])*t17;\n+768 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;\n+769 inverse[2][1] = -(t6-t10) * t17;\n+770 inverse[0][2] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0])\n+* t17;\n+771 inverse[1][2] = -(matrix[0][0] * matrix[2][1] - t12) * t17;\n+772 inverse[2][2] = (t4-t8) * t17;\n+773\n+774 return det;\n+775 }\n+776\n+778 template< class K, int m, int n, int p >\n+_\b7_\b7_\b9 static inline void _\bm_\bu_\bl_\bt_\bM_\ba_\bt_\br_\bi_\bx ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &A,\n+780 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bp_\b _\b> &B,\n+781 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bp_\b _\b> &ret )\n+782 {\n+783 typedef typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bp_\b _\b> :: size_type size_type;\n+784\n+785 for( size_type i = 0; i < m; ++i )\n+786 {\n+787 for( size_type j = 0; j < p; ++j )\n+788 {\n+789 ret[ i ][ j ] = K( 0 );\n+790 for( size_type k = 0; k < n; ++k )\n+791 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];\n+792 }\n+793 }\n+794 }\n+795\n+797 template \n+_\b7_\b9_\b8 static inline void _\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\br_\bi_\bx(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, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b,_\bc_\bo_\bl_\bs_\b>& ret)\n+799 {\n+800 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+801\n+802 for(size_type i=0; i\n+_\b8_\b1_\b5 static inline void _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd( 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+816 {\n+817 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+818\n+819 for(size_type i=0; i\n+_\b8_\b2_\b9 static inline _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> _\bm_\bu_\bl_\bt(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,_\bc_\bo_\bl_\bs_\b> & x)\n+830 {\n+831 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> ret;\n+832 multAssign(matrix,x,ret);\n+833 return ret;\n+834 }\n+835\n+837 template \n+_\b8_\b3_\b8 static inline _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b> _\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd(const\n+_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b> &matrix, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> & x)\n+839 {\n+840 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b> ret;\n+841 _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd( matrix, x, ret );\n+842 return ret;\n+843 }\n+844\n+845 } // end namespace FMatrixHelp\n+846\n+849} // end namespace\n+850\n+851#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\"\n+852#endif\n+_\bm_\ba_\bt_\br_\bi_\bx_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b._\bh_\bh\n+_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b._\bh_\bh\n+Various precision settings for calculations with FieldMatrix and FieldVector.\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\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_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\n+Eigenvalue computations for the FieldMatrix class.\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_\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+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\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_\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:_\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br\n+typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n+Element type of some SIMD type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\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_\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:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+static FieldVector< K, cols > multTransposed(const FieldMatrix< K, rows, cols >\n+&matrix, const FieldVector< K, rows > &x)\n+calculates ret = matrix^T * x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:838\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+static K invertMatrix_retTransposed(const FieldMatrix< K, 1, 1 > &matrix,\n+FieldMatrix< K, 1, 1 > &inverse)\n+invert scalar without changing the original matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:680\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+static void multMatrix(const FieldMatrix< K, m, n > &A, const FieldMatrix< K,\n+n, p > &B, FieldMatrix< K, m, p > &ret)\n+calculates ret = A * B\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:779\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+static K invertMatrix(const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1,\n+1 > &inverse)\n+invert scalar without changing the original matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:671\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt\n+static FieldVector< K, rows > mult(const FieldMatrix< K, rows, cols > &matrix,\n+const FieldVector< K, cols > &x)\n+calculates ret = matrix * x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:829\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+static void multTransposedMatrix(const FieldMatrix< K, rows, cols > &matrix,\n+FieldMatrix< K, cols, cols > &ret)\n+calculates ret= A_t*A\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:798\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+static void multAssignTransposed(const FieldMatrix< K, rows, cols > &matrix,\n+const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)\n+calculates ret = matrix^T * x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:815\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_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n+FieldMatrix< K, ROWS, COLS > & 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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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:_\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:_\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs\n+static constexpr size_type mat_cols()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:367\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+constexpr FieldMatrix()=default\n+Default constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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+Base::const_row_reference const_row_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+FieldMatrix & operator=(const FieldMatrix< T, ROWS, COLS > &x)\n+copy assignment from FieldMatrix over a different field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by\n+FieldMatrix< K, rows, l > rightmultiplyany(const FieldMatrix< K, cols, l > &M)\n+const\n+Multiplies M from the right to this matrix, this matrix is not modified.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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 fmatrix.hh:128\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_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by\n+FieldMatrix< K, l, cols > leftmultiplyany(const FieldMatrix< K, l, rows > &M)\n+const\n+Multiplies M from the left to this matrix, this matrix is not modified.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:316\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n+FieldMatrix & rightmultiply(const FieldMatrix< K, r, c > &M)\n+Multiplies M from the right to this matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:334\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+FieldMatrix(T const &rhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+friend auto operator*(const FieldMatrix &matrix, Scalar scalar)\n+vector space multiplication with scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:212\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+FieldMatrix & operator=(FieldMatrix< T, rows, cols > const &)=delete\n+no copy assignment from FieldMatrix of different size\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+Base::row_reference row_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n+row_reference mat_access(size_type i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:369\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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 fmatrix.hh:123\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n+FieldMatrix< K, COLS, ROWS > transposed() const\n+Return transposed of the matrix as FieldMatrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:172\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\br_\bo_\bw_\bs\n+static constexpr size_type mat_rows()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:366\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+FieldMatrix(std::initializer_list< Dune::FieldVector< K, cols > > const &l)\n+Constructor initializing the matrix from a list of vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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 fmatrix.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/\n+friend auto operator/(const FieldMatrix &matrix, Scalar scalar)\n+vector space division by scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:240\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n+friend auto operator+(const FieldMatrix &matrixA, const FieldMatrix<\n+OtherScalar, ROWS, COLS > &matrixB)\n+vector space addition \u00e2\u0080\u0093 two-argument version\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:183\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+FieldMatrix & operator=(const FieldMatrix &)=default\n+copy assignment operator\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n+friend auto operator-(const FieldMatrix &matrixA, const FieldMatrix<\n+OtherScalar, ROWS, COLS > &matrixB)\n+vector space subtraction \u00e2\u0080\u0093 two-argument version\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:197\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n+const_row_reference mat_access(size_type i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:375\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:95\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be\n+std::array< row_type, ROWS > container_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:95\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n+FieldMatrix< K, ROWS, COLS > derived_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:87\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:96\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:93\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+FieldVector< K, COLS > row_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:90\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:97\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:92\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_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:103\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_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:104\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:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be\n+decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn promotiontraits.hh:28\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/a00287.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00287.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: interfaces.hh File Reference\n+dune-common: scalarmatrixview.hh File Reference\n \n \n \n \n \n \n \n@@ -70,40 +70,41 @@\n
    \n \n
    \n
    \n
    \n \n-
    interfaces.hh File Reference
    \n+
    scalarmatrixview.hh File Reference
    \n
    \n
    \n \n-

    Provides interfaces for detection of specific behavior. \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-Classes

    struct  Dune::Cloneable
     An interface class for cloneable objects. 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+

    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,24 +1,28 @@\n dune-common\u00a02.9.0\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+_\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-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 *\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+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/a00287_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00287_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: scalarmatrixview.hh Source File\n \n \n \n \n \n \n \n@@ -74,45 +74,198 @@\n \n
    \n \n
    \n
    \n
    \n-
    interfaces.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 (C) 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_COMMON_SCALARMATRIXVIEW_HH
    \n+
    6#define DUNE_COMMON_SCALARMATRIXVIEW_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-
    \n-
    26 virtual ~Cloneable()
    \n-
    27 {}
    \n-
    \n-
    28
    \n-
    29 };
    \n-
    \n-
    30
    \n-
    31} // end namespace Dune
    \n-
    32#endif
    \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+
    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+
    Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
    \n+
    Traits for type conversions and type information.
    \n+
    Implements a matrix constructed from a given type representing a field and compile-time given number ...
    \n+
    Macro for wrapping boundary checks.
    \n+
    Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
    \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-
    An interface class for cloneable objects.
    Definition interfaces.hh:16
    \n-
    virtual ~Cloneable()
    Destructor.
    Definition interfaces.hh:26
    \n-
    virtual Cloneable * clone() const =0
    Clones the object clone needs to be redefined by an implementation class, with the return type covari...
    \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:501
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,45 +1,232 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-interfaces.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 (C) 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_COMMON_SCALARMATRIXVIEW_HH\n+6#define DUNE_COMMON_SCALARMATRIXVIEW_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()\n-27 {}\n-28\n-29 };\n-30\n-31} // end namespace Dune\n-32#endif\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+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+_\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+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\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+_\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_\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+_\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:_\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()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn interfaces.hh:26\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:_\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:501\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/a00290.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00290.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: debugstream.hh File Reference\n+dune-common: boundschecking.hh File Reference\n \n \n \n \n \n \n \n@@ -70,64 +70,33 @@\n
    \n \n
    \n
    \n
    \n \n-
    debugstream.hh File Reference
    \n+Macros
    \n+
    boundschecking.hh File Reference
    \n
    \n
    \n \n-

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

    Macro for wrapping boundary checks. \n More...

    \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-Classes

    struct  Dune::greater_or_equal< current, threshold >
     Greater or equal template test. More...
     
    struct  Dune::common_bits< current, mask >
     activate if current and mask have common bits switched on. More...
     
    class  Dune::DebugStreamError
     standard exception for the debugstream More...
     
    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...
     
    \n-\n-\n-\n-\n-

    \n-Namespaces

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

    \n-Typedefs

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

    \n+Macros

    #define DUNE_ASSERT_BOUNDS(cond)
     If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
     
    \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+

    Macro for wrapping boundary checks.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,47 +1,20 @@\n dune-common\u00a02.9.0\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+_\bM_\ba_\bc_\br_\bo_\bs\n+boundschecking.hh File Reference\n+Macro for wrapping boundary checks. _\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-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_\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- 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- 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-\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+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(cond)\n+\u00a0 If DUNE_CHECK_BOUNDS is defined: check if condition c\bco\bon\bnd\bd holds;\n+ otherwise, do nothing.\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+Macro for wrapping boundary checks.\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/a00290_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00290_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: boundschecking.hh Source File\n \n \n \n \n \n \n \n@@ -74,333 +74,44 @@\n \n
    \n \n
    \n
    \n
    \n-
    debugstream.hh
    \n+
    boundschecking.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 (C) 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 (C) 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_BOUNDSCHECKING_HH
    \n+
    4#define DUNE_BOUNDSCHECKING_HH
    \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-
    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-
    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-
    \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-
    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-
    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+
    7
    \n+
    19#ifndef DUNE_ASSERT_BOUNDS
    \n+
    20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN)
    \n+
    21
    \n+
    \n+
    30#define DUNE_ASSERT_BOUNDS(cond) \\
    \n+
    31 do { \\
    \n+
    32 if (!(cond)) \\
    \n+
    33 DUNE_THROW(Dune::RangeError, "Index out of bounds."); \\
    \n+
    34 } while (false)
    \n+
    \n+
    35
    \n+
    36#else
    \n+
    37#define DUNE_ASSERT_BOUNDS(cond)
    \n+
    38#endif
    \n+
    39#endif
    \n+
    40
    \n+
    41/* @} */
    \n+
    42
    \n+
    43#endif // DUNE_BOUNDSCHECKING_HH
    \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,375 +1,37 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-debugstream.hh\n+boundschecking.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_BOUNDSCHECKING_HH\n+4#define DUNE_BOUNDSCHECKING_HH\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-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-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 // 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-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+6#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+7\n+19#ifndef DUNE_ASSERT_BOUNDS\n+20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN)\n+21\n+_\b3_\b0#define DUNE_ASSERT_BOUNDS(cond) \\\n+31 do { \\\n+32 if (!(cond)) \\\n+33 DUNE_THROW(Dune::RangeError, \"Index out of bounds.\"); \\\n+34 } while (false)\n+35\n+36#else\n+37#define DUNE_ASSERT_BOUNDS(cond)\n+38#endif\n+39#endif\n+40\n+41/* @} */\n+42\n+43#endif // DUNE_BOUNDSCHECKING_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:_\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:_\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/a00293.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00293.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: typeutilities.hh File Reference\n+dune-common: singleton.hh File Reference\n \n \n \n \n \n \n \n@@ -71,53 +71,40 @@\n \n
    \n
    \n
    \n \n-
    typeutilities.hh File Reference
    \n+Namespaces
    \n+
    singleton.hh File Reference
    \n
    \n
    \n \n-

    Utilities for type computations, constraining overloads, ... \n+

    Useful wrapper for creating singletons. \n More...

    \n-
    #include <cstddef>
    \n-#include <type_traits>
    \n-#include <tuple>
    \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::PriorityTag< priority >
     Helper class for tagging priorities. More...
     
    struct  Dune::PriorityTag< 0 >
     Helper class for tagging priorities. More...
    class  Dune::Singleton< T >
     An adapter to turn a class into a singleton. More...
     
    \n \n \n \n \n-

    \n Namespaces

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

    \n-Typedefs

    template<class This , class... T>
    using Dune::disableCopyMove = std::enable_if_t< not Impl::disableCopyMoveHelper< This, T... >::value, int >
     Helper to disable constructor as copy and move constructor.
     
    \n

    Detailed Description

    \n-

    Utilities for type computations, constraining overloads, ...

    \n-
    Author
    Carsten Gr\u00e4ser
    \n+

    Useful wrapper for creating singletons.

    \n+

    Inspired by the article CodeGuru: A Leak-Free Singleton 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,36 +1,24 @@\n dune-common\u00a02.9.0\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-typeutilities.hh File Reference\n-Utilities for type computations, constraining overloads, ... _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+singleton.hh File Reference\n+Useful wrapper for creating singletons. _\bM_\bo_\br_\be_\b._\b._\b.\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 _\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:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b _\bp_\br_\bi_\bo_\br_\bi_\bt_\by_\b _\b>\n-\u00a0 Helper class for tagging priorities. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b _\b0_\b _\b>\n-\u00a0 Helper class for tagging priorities. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b<_\b _\bT_\b _\b>\n+\u00a0 An adapter to turn a class into a singleton. _\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-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bi_\bs_\ba_\bb_\bl_\be_\bC_\bo_\bp_\by_\bM_\bo_\bv_\be = std::enable_if_t< not Impl::\n- disableCopyMoveHelper< This, T... >::value, int >\n-\u00a0 Helper to disable constructor as copy and move constructor.\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 type computations, constraining overloads, ...\n- Author\n- Carsten Gr\u00c3\u00a4ser\n+Useful wrapper for creating singletons.\n+Inspired by the article _\bC_\bo_\bd_\be_\bG_\bu_\br_\bu_\b:_\b _\bA_\b _\bL_\be_\ba_\bk_\b-_\bF_\br_\be_\be_\b _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b _\bc_\bl_\ba_\bs_\bs\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/a00293_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: typeutilities.hh Source File\n+dune-common: singleton.hh Source File\n \n \n \n \n \n \n \n@@ -74,77 +74,62 @@\n \n
    \n \n
    \n
    \n
    \n-
    typeutilities.hh
    \n+
    singleton.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 (C) 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_TYPEUTILITIES_HH
    \n-
    6#define DUNE_COMMON_TYPEUTILITIES_HH
    \n+
    5#ifndef DUNE_SINGLETON_HH
    \n+
    6#define DUNE_SINGLETON_HH
    \n
    7
    \n-
    8#include <cstddef>
    \n-
    9#include <type_traits>
    \n-
    10#include <tuple>
    \n-
    11
    \n-
    12
    \n-
    13namespace Dune {
    \n-
    14
    \n-
    22 namespace Impl
    \n-
    23 {
    \n-
    24
    \n-
    25 template<class This, class... T>
    \n-
    26 struct disableCopyMoveHelper : public std::is_base_of<This, std::tuple_element_t<0, std::tuple<std::decay_t<T>...>>>
    \n-
    27 {};
    \n-
    28
    \n-
    29 template<class This>
    \n-
    30 struct disableCopyMoveHelper<This> : public std::false_type
    \n-
    31 {};
    \n-
    32
    \n-
    33 } // namespace Impl
    \n-
    34
    \n-
    35
    \n-
    44 template<class This, class... T>
    \n-
    45 using disableCopyMove = std::enable_if_t< not Impl::disableCopyMoveHelper<This, T...>::value, int>;
    \n-
    46
    \n-
    47
    \n-
    48
    \n-
    71 template<std::size_t priority>
    \n-
    \n-
    72 struct PriorityTag : public PriorityTag<priority-1>
    \n-
    73 {
    \n-
    74 static constexpr std::size_t value = priority;
    \n+\n+
    9
    \n+
    17namespace Dune
    \n+
    18{
    \n+
    54 template<class T>
    \n+
    \n+\n+
    56 {
    \n+
    57 protected:
    \n+
    58 /* @brief Protected constructor. */
    \n+
    59 Singleton() = default;
    \n+
    60
    \n+
    61 public:
    \n+
    62
    \n+
    63 Singleton(const Singleton&) = delete;
    \n+
    64 void operator=(const Singleton&) = delete;
    \n+
    65
    \n+
    \n+\n+
    71 {
    \n+
    72 static T instance_;
    \n+
    73 return instance_;
    \n+
    74 }
    \n+
    \n
    75 };
    \n
    \n
    76
    \n-
    85 template<>
    \n-
    \n-
    86 struct PriorityTag<0>
    \n-
    87 {
    \n-
    88 static constexpr std::size_t value = 0;
    \n-
    89 };
    \n-
    \n-
    90
    \n-
    91
    \n-
    92
    \n-
    93} // namespace Dune
    \n-
    94
    \n-
    95
    \n-
    96
    \n-
    97#endif // DUNE_COMMON_TYPEUTILITIES_HH
    \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+
    77} // namespace Dune
    \n+
    78
    \n+
    79#endif
    \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
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \n-
    static constexpr std::size_t value
    Definition typeutilities.hh:74
    \n+
    An adapter to turn a class into a singleton.
    Definition singleton.hh:56
    \n+
    Singleton()=default
    \n+
    Singleton(const Singleton &)=delete
    \n+
    void operator=(const Singleton &)=delete
    \n+
    static DUNE_EXPORT T & instance()
    Get the instance of the singleton.
    Definition singleton.hh:70
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,79 +1,66 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-typeutilities.hh\n+singleton.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 (C) 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_TYPEUTILITIES_HH\n-6#define DUNE_COMMON_TYPEUTILITIES_HH\n+5#ifndef DUNE_SINGLETON_HH\n+6#define DUNE_SINGLETON_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-12\n-13namespace _\bD_\bu_\bn_\be {\n-14\n-22 namespace Impl\n-23 {\n-24\n-25 template\n-26 struct disableCopyMoveHelper : public std::is_base_of...>>>\n-27 {};\n-28\n-29 template\n-30 struct disableCopyMoveHelper : public std::false_type\n-31 {};\n-32\n-33 } // namespace Impl\n-34\n-35\n-44 template\n-_\b4_\b5 using _\bd_\bi_\bs_\ba_\bb_\bl_\be_\bC_\bo_\bp_\by_\bM_\bo_\bv_\be = std::enable_if_t< not Impl::\n-disableCopyMoveHelper::value, int>;\n-46\n-47\n-48\n-71 template\n-_\b7_\b2 struct _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg : public _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg\n-73 {\n-_\b7_\b4 static constexpr std::size_t _\bv_\ba_\bl_\bu_\be = priority;\n+8#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+9\n+17namespace _\bD_\bu_\bn_\be\n+18{\n+54 template\n+_\b5_\b5 class _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn\n+56 {\n+57 protected:\n+58 /* @brief Protected constructor. */\n+_\b5_\b9 _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn() = default;\n+60\n+61 public:\n+62\n+_\b6_\b3 _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn(const _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn&) = delete;\n+_\b6_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn&) = delete;\n+65\n+_\b7_\b0 _\bD_\bU_\bN_\bE_\b__\bE_\bX_\bP_\bO_\bR_\bT static T& _\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be()\n+71 {\n+72 static T instance_;\n+73 return instance_;\n+74 }\n 75 };\n 76\n-85 template<>\n-_\b8_\b6 struct _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg<0>\n-87 {\n-_\b8_\b8 static constexpr std::size_t _\bv_\ba_\bl_\bu_\be = 0;\n-89 };\n-90\n-91\n-92\n-93} // namespace Dune\n-94\n-95\n-96\n-97#endif // DUNE_COMMON_TYPEUTILITIES_HH\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+77} // namespace Dune\n+78\n+79#endif\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\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_\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:_\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static constexpr std::size_t value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typeutilities.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn\n+An adapter to turn a class into a singleton.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn singleton.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn\n+Singleton()=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn\n+Singleton(const Singleton &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+void operator=(const Singleton &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be\n+static DUNE_EXPORT T & instance()\n+Get the instance of the singleton.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn singleton.hh:70\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/a00296.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00296.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: typetraits.hh File Reference\n+dune-common: keywords.hh File Reference\n \n \n \n \n \n \n \n@@ -70,136 +70,63 @@\n
    \n \n
    \n
    \n
    \n \n-
    typetraits.hh File Reference
    \n+Macros
    \n+
    keywords.hh File Reference
    \n
    \n
    \n \n-

    Traits for type conversions and type information. \n+

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

    \n-
    #include <complex>
    \n-#include <type_traits>
    \n-#include <utility>
    \n-#include <vector>
    \n-
    \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-Classes

    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::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-Namespaces

    namespace  Dune
     Dune namespace.
     
    \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-Functions

    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+Macros

    #define DUNE_INLINE_VARIABLE   inline
     
    #define DUNE_GENERALIZED_CONSTEXPR   constexpr
     
    \n

    Detailed Description

    \n-

    Traits for type conversions and type information.

    \n-
    Author
    Markus Blatt, Christian Engwer
    \n-
    \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+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_GENERALIZED_CONSTEXPR

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_GENERALIZED_CONSTEXPR   constexpr
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_INLINE_VARIABLE

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_INLINE_VARIABLE   inline
    \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,121 +1,29 @@\n dune-common\u00a02.9.0\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-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 \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 _\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:_\bE_\bm_\bp_\bt_\by\n-\u00a0 Just an empty class. _\bM_\bo_\br_\be_\b._\b._\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\u00a0\u00a0\u00a0inline\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:_\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-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\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+#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\u00a0\u00a0\u00a0constexpr\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+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+*\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_G\bGE\bEN\bNE\bER\bRA\bAL\bLI\bIZ\bZE\bED\bD_\b_C\bCO\bON\bNS\bST\bTE\bEX\bXP\bPR\bR *\b**\b**\b**\b**\b*\n+#define DUNE_GENERALIZED_CONSTEXPR\u00a0\u00a0\u00a0constexpr\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_I\bIN\bNL\bLI\bIN\bNE\bE_\b_V\bVA\bAR\bRI\bIA\bAB\bBL\bLE\bE *\b**\b**\b**\b**\b*\n+#define DUNE_INLINE_VARIABLE\u00a0\u00a0\u00a0inline\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/a00296_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: typetraits.hh Source File\n+dune-common: keywords.hh Source File\n \n \n \n \n \n \n \n@@ -74,411 +74,39 @@\n \n
    \n \n
    \n
    \n
    \n-
    typetraits.hh
    \n+
    keywords.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 (C) 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_TYPETRAITS_HH
    \n-
    6#define DUNE_TYPETRAITS_HH
    \n-
    7
    \n-
    8#include <complex>
    \n-
    9#include <type_traits>
    \n-
    10#include <utility>
    \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#ifndef DOXYGEN
    \n-
    225
    \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-
    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 template <class Type>
    \n-\n-
    298
    \n-
    300 template <class Type>
    \n-\n-
    302
    \n-
    303
    \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-
    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-
    354 template<class T>
    \n-
    \n-\n-
    356 public decltype(Impl::isTupleOrDerived(std::declval<T*>(), true))
    \n-
    357 {};
    \n-
    \n-
    358
    \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-
    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
    \n-
    401 template<typename... T>
    \n-
    \n-
    402 struct SizeOf
    \n-
    403 : public std::integral_constant<std::size_t,sizeof...(T)>
    \n-
    404 {};
    \n-
    \n-
    405
    \n-
    406
    \n-
    407#ifndef DOXYGEN
    \n-
    408
    \n-
    409 namespace Impl {
    \n-
    410
    \n-
    411 template<class T, T...>
    \n-
    412 struct IntegerSequenceHelper;
    \n-
    413
    \n-
    414 // Helper struct to compute the i-th entry of a std::integer_sequence
    \n-
    415 //
    \n-
    416 // This could also be implemented using std::get<index>(std::make_tuple(t...)).
    \n-
    417 // However, the gcc-6 implementation of std::make_tuple increases the instantiation
    \n-
    418 // depth by 15 levels for each argument, such that the maximal instantiation depth
    \n-
    419 // is easily hit, especially with clang where it is set to 256.
    \n-
    420 template<class T, T head, T... tail>
    \n-
    421 struct IntegerSequenceHelper<T, head, tail...>
    \n-
    422 {
    \n-
    423
    \n-
    424 // get first entry
    \n-
    425 static constexpr auto get(std::integral_constant<std::size_t, 0>)
    \n-
    426 {
    \n-
    427 return std::integral_constant<T, head>();
    \n-
    428 }
    \n-
    429
    \n-
    430 // call get with first entry cut off and decremented index
    \n-
    431 template<std::size_t index,
    \n-
    432 std::enable_if_t<(index > 0) and (index < sizeof...(tail)+1), int> = 0>
    \n-
    433 static constexpr auto get(std::integral_constant<std::size_t, index>)
    \n-
    434 {
    \n-
    435 return IntegerSequenceHelper<T, tail...>::get(std::integral_constant<std::size_t, index-1>());
    \n-
    436 }
    \n-
    437
    \n-
    438 // use static assertion if index exceeds size
    \n-
    439 template<std::size_t index,
    \n-
    440 std::enable_if_t<(index >= sizeof...(tail)+1), int> = 0>
    \n-
    441 static constexpr auto get(std::integral_constant<std::size_t, index>)
    \n-
    442 {
    \n-
    443 static_assert(index < sizeof...(tail)+1, "index used in IntegerSequenceEntry exceed size");
    \n-
    444 }
    \n-
    445 };
    \n-
    446
    \n-
    447 } // end namespace Impl
    \n-
    448
    \n-
    449#endif // DOXYGEN
    \n-
    450
    \n-
    451
    \n-
    461 template<class T, T... t, std::size_t index>
    \n-
    \n-
    462 constexpr auto integerSequenceEntry(std::integer_sequence<T, t...> /*seq*/, std::integral_constant<std::size_t, index> i)
    \n-
    463 {
    \n-
    464 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry exceed size");
    \n-
    465 return Impl::IntegerSequenceHelper<T, t...>::get(i);
    \n-
    466 }
    \n-
    \n-
    467
    \n-
    468
    \n-
    475 template<class IntegerSequence, std::size_t index>
    \n-\n-
    477
    \n-
    478#ifndef DOXYGEN
    \n-
    479
    \n-
    480 template<class T, T... t, std::size_t i>
    \n-
    481 struct IntegerSequenceEntry<std::integer_sequence<T, t...>, i>
    \n-
    482 : public decltype(Impl::IntegerSequenceHelper<T, t...>::get(std::integral_constant<std::size_t, i>()))
    \n-
    483 {};
    \n-
    484
    \n-
    485#endif // DOXYGEN
    \n-
    486
    \n-
    500 template<class T>
    \n-
    501 struct AutonomousValueType { using type = T; };
    \n-
    502
    \n-
    504 template<class T>
    \n-\n-
    506
    \n-
    508 template<class T>
    \n-\n-
    510
    \n-
    512 template<class T>
    \n-\n-
    514
    \n-
    516 template<class T>
    \n-
    517 struct AutonomousValueType<volatile T> : AutonomousValueType<T> {};
    \n-
    518
    \n-
    520 template<>
    \n-
    \n-
    521 struct AutonomousValueType<std::vector<bool>::reference>
    \n-
    522 {
    \n-
    523 using type = bool;
    \n-
    524 };
    \n-
    \n-
    525
    \n-
    527 template<class T>
    \n-
    528 struct AutonomousValueType<volatile const T> : AutonomousValueType<T> {};
    \n-
    529
    \n-
    557 template<class T>
    \n-\n-
    559
    \n-
    641 template<class T>
    \n-
    \n-\n-
    643 {
    \n-
    644 return v;
    \n-
    645 }
    \n-
    \n-
    646
    \n-
    648}
    \n-
    649#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:462
    \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:642
    \n-
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:558
    \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-
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
    Definition propertymap.hh:84
    \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-
    Compute size of variadic type list.
    Definition typetraits.hh:404
    \n-
    Get entry of std::integer_sequence.
    Definition typetraits.hh:476
    \n-
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:501
    \n-
    T type
    Definition typetraits.hh:501
    \n-\n+Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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+
    18#if __cpp_inline_variables >= 201606
    \n+
    19#define DUNE_INLINE_VARIABLE inline
    \n+
    20#else
    \n+
    22
    \n+
    25#define DUNE_INLINE_VARIABLE
    \n+
    26#endif
    \n+
    27
    \n+
    28
    \n+
    29#if __cpp_constexpr >= 201304
    \n+
    30#define DUNE_GENERALIZED_CONSTEXPR constexpr
    \n+
    31#else
    \n+
    33
    \n+
    36#define DUNE_GENERALIZED_CONSTEXPR
    \n+
    37#endif
    \n+
    38
    \n+
    39
    \n+
    40#endif // DUNE_COMMON_KEYWORDS_HH
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,462 +1,33 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-typetraits.hh\n+keywords.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 (C) DUNE Project contributors, see file\n+1// SPDX-FileCopyrightInfo: Copyright (C) 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_TYPETRAITS_HH\n-6#define DUNE_TYPETRAITS_HH\n-7\n-8#include \n-9#include \n-10#include \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#ifndef DOXYGEN\n-225\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-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-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-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-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-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-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-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\n-401 template\n-_\b4_\b0_\b2 struct _\bS_\bi_\bz_\be_\bO_\bf\n-403 : public std::integral_constant\n-404 {};\n-405\n-406\n-407#ifndef DOXYGEN\n-408\n-409 namespace Impl {\n-410\n-411 template\n-412 struct IntegerSequenceHelper;\n-413\n-414 // Helper struct to compute the i-th entry of a std::integer_sequence\n-415 //\n-416 // This could also be implemented using std::get(std::make_tuple\n-(t...)).\n-417 // However, the gcc-6 implementation of std::make_tuple increases the\n-instantiation\n-418 // depth by 15 levels for each argument, such that the maximal\n-instantiation depth\n-419 // is easily hit, especially with clang where it is set to 256.\n-420 template\n-421 struct IntegerSequenceHelper\n-422 {\n-423\n-424 // get first entry\n-425 static constexpr auto _\bg_\be_\bt(std::integral_constant)\n-426 {\n-427 return std::integral_constant();\n-428 }\n-429\n-430 // call get with first entry cut off and decremented index\n-431 template 0) and (index < sizeof...(tail)+1), int> = 0>\n-433 static constexpr auto get(std::integral_constant)\n-434 {\n-435 return IntegerSequenceHelper::get(std::integral_constant());\n-436 }\n-437\n-438 // use static assertion if index exceeds size\n-439 template= sizeof...(tail)+1), int> = 0>\n-441 static constexpr auto _\bg_\be_\bt(std::integral_constant)\n-442 {\n-443 static_assert(index < sizeof...(tail)+1, \"index used in\n-IntegerSequenceEntry exceed size\");\n-444 }\n-445 };\n-446\n-447 } // end namespace Impl\n-448\n-449#endif // DOXYGEN\n-450\n-451\n-461 template\n-_\b4_\b6_\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-463 {\n-464 static_assert(index < sizeof...(t), \"index used in IntegerSequenceEntry\n-exceed size\");\n-465 return Impl::IntegerSequenceHelper::get(i);\n-466 }\n-467\n-468\n-475 template\n-_\b4_\b7_\b6 struct _\bI_\bn_\bt_\be_\bg_\be_\br_\bS_\be_\bq_\bu_\be_\bn_\bc_\be_\bE_\bn_\bt_\br_\by;\n-477\n-478#ifndef DOXYGEN\n-479\n-480 template\n-481 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-482 : public decltype(Impl::IntegerSequenceHelper::get(std::\n-integral_constant()))\n-483 {};\n-484\n-485#endif // DOXYGEN\n-486\n-500 template\n-_\b5_\b0_\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-502\n-504 template\n-_\b5_\b0_\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-506\n-508 template\n-_\b5_\b0_\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-510\n-512 template\n-_\b5_\b1_\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-514\n-516 template\n-_\b5_\b1_\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-518\n-520 template<>\n-_\b5_\b2_\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-522 {\n-_\b5_\b2_\b3 using _\bt_\by_\bp_\be = bool;\n-524 };\n-525\n-527 template\n-_\b5_\b2_\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-529\n-557 template\n-_\b5_\b5_\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-559\n-641 template\n-_\b6_\b4_\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-643 {\n-644 return v;\n-645 }\n-646\n-648}\n-649#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:462\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:642\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:558\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\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-Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const\n-Key &key)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:84\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:_\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:404\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:476\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:501\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:501\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:523\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+18#if __cpp_inline_variables >= 201606\n+_\b1_\b9#define DUNE_INLINE_VARIABLE inline\n+20#else\n+22\n+25#define DUNE_INLINE_VARIABLE\n+26#endif\n+27\n+28\n+29#if __cpp_constexpr >= 201304\n+_\b3_\b0#define DUNE_GENERALIZED_CONSTEXPR constexpr\n+31#else\n+33\n+36#define DUNE_GENERALIZED_CONSTEXPR\n+37#endif\n+38\n+39\n+40#endif // DUNE_COMMON_KEYWORDS_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/a00299.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00299.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: matvectraits.hh File Reference\n+dune-common: exceptions.cc File Reference\n \n \n \n \n \n \n \n@@ -70,38 +70,26 @@\n
    \n \n
    \n
    \n
    \n \n-
    matvectraits.hh File Reference
    \n+
    exceptions.cc File Reference
    \n
    \n
    \n-\n-

    Documentation of the traits classes you need to write for each implementation of DenseVector or DenseMatrix. \n-More...

    \n-\n-

    Go to the source code of this file.

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

    \n-Classes

    struct  Dune::DenseMatVecTraits< T >
     
    \n+
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-

    Detailed Description

    \n-

    Documentation of the traits classes you need to write for each implementation of DenseVector or DenseMatrix.

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,23 +1,15 @@\n dune-common\u00a02.9.0\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-matvectraits.hh File Reference\n-Documentation of the traits classes you need to write for each implementation\n-of DenseVector or DenseMatrix. _\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:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+exceptions.cc File Reference\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 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-Documentation of the traits classes you need to write for each implementation\n-of DenseVector or DenseMatrix.\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/a00302.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00302.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: path.cc File Reference\n+dune-common: classname.hh File Reference\n \n \n \n \n \n \n \n@@ -72,57 +72,47 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    path.cc File Reference
    \n+
    classname.hh File Reference
    \n
    \n
    \n \n-

    Utilities for handling filesystem paths. \n+

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

    \n-
    #include <algorithm>
    \n-#include <iterator>
    \n+
    #include <cstdlib>
    \n+#include <memory>
    \n #include <string>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/stringutility.hh>
    \n-#include <dune/common/path.hh>
    \n-
    \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-\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
     
    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-

    Utilities for handling filesystem paths.

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

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

    \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,34 @@\n dune-common\u00a02.9.0\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+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 <_\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 \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-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+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-Utilities for handling filesystem paths.\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+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/a00305.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00305.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: promotiontraits.hh File Reference\n+dune-common: stringutility.hh File Reference\n \n \n \n \n \n \n \n@@ -70,43 +70,57 @@\n
    \n \n
    \n
    \n
    \n \n-
    promotiontraits.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    stringutility.hh File Reference
    \n
    \n
    \n \n-

    Compute type of the result of an arithmetic operation involving two different number types. \n+

    Miscellaneous helper stuff. \n More...

    \n-
    #include <utility>
    \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-\n-

    \n-Classes

    struct  Dune::PromotionTraits< T1, T2 >
     Compute type of the result of an arithmetic operation involving two different number types. More...
     
    struct  Dune::PromotionTraits< T1, T1 >
     
    \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 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

    Detailed Description

    \n-

    Compute type of the result of an arithmetic operation involving two different number types.

    \n-
    Author
    Matthias Wohlmuth
    \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,30 +1,41 @@\n dune-common\u00a02.9.0\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-promotiontraits.hh File Reference\n-Compute type of the result of an arithmetic operation involving two different\n-number types. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \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-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_\b1_\b,_\b _\bT_\b2_\b _\b>\n-\u00a0 Compute type of the result of an arithmetic operation involving two\n- different number types. _\bM_\bo_\br_\be_\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 _\bT_\b1_\b,_\b _\bT_\b1_\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:_\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-Compute type of the result of an arithmetic operation involving two different\n-number types.\n- Author\n- Matthias Wohlmuth\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/a00305_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: promotiontraits.hh Source File\n+dune-common: stringutility.hh Source File\n \n \n \n \n \n \n \n@@ -74,49 +74,109 @@\n \n
    \n \n
    \n
    \n
    \n-
    promotiontraits.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 (C) 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_PROMOTIONTRAITS_HH
    \n-
    6#define DUNE_PROMOTIONTRAITS_HH
    \n+
    5#ifndef DUNE_COMMON_STRINGUTILITY_HH
    \n+
    6#define DUNE_COMMON_STRINGUTILITY_HH
    \n
    7
    \n-
    8#include <utility>
    \n-
    9
    \n-
    10namespace Dune {
    \n-
    25 template <typename T1, typename T2>
    \n-
    \n-\n-
    27 {
    \n-
    28 typedef decltype(std::declval<T1>()+std::declval<T2>()) PromotedType;
    \n-
    29 };
    \n-
    \n-
    30
    \n-
    31 // Specialization for the case of two equal types
    \n-
    32 // One should think that the generic template should handle this case as well.
    \n-
    33 // However, the fvectortest.cc unit test fails without it if ENABLE_GMP is set.
    \n-
    34 template <typename T1>
    \n-
    35 struct PromotionTraits<T1,T1> { typedef T1 PromotedType; };
    \n-
    36
    \n-
    38} // end namespace
    \n-
    39
    \n-
    40
    \n-
    41#endif // DUNE_PROMOTIONTRAITS_HH
    \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+
    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+
    42
    \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 // 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+
    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+
    113}
    \n+
    114
    \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-
    Compute type of the result of an arithmetic operation involving two different number types.
    Definition promotiontraits.hh:27
    \n-
    decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType
    Definition promotiontraits.hh:28
    \n-
    T1 PromotedType
    Definition promotiontraits.hh:35
    \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,52 +1,117 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-promotiontraits.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 (C) 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_PROMOTIONTRAITS_HH\n-6#define DUNE_PROMOTIONTRAITS_HH\n+5#ifndef DUNE_COMMON_STRINGUTILITY_HH\n+6#define DUNE_COMMON_STRINGUTILITY_HH\n 7\n-8#include \n-9\n-10namespace _\bD_\bu_\bn_\be {\n-25 template \n-_\b2_\b6 struct _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs\n-27 {\n-_\b2_\b8 typedef decltype(std::declval()+std::declval()) _\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n-29 };\n-30\n-31 // Specialization for the case of two equal types\n-32 // One should think that the generic template should handle this case as\n-well.\n-33 // However, the fvectortest.cc unit test fails without it if ENABLE_GMP is\n-set.\n-34 template \n-_\b3_\b5 struct _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs { typedef T1 _\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be; };\n-36\n-38} // end namespace\n-39\n-40\n-41#endif // DUNE_PROMOTIONTRAITS_HH\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+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+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+85 // if buffer was large enough return result as string\n+86 if (r 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()+std::declval< T2 >()) PromotedType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn promotiontraits.hh:28\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_\b1_\b,_\b _\bT_\b1_\b _\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be\n-T1 PromotedType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn promotiontraits.hh:35\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/a00308.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00308.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: stdthread.cc File Reference\n+dune-common: path.cc File Reference\n \n \n \n \n \n \n \n@@ -72,34 +72,57 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    stdthread.cc File Reference
    \n+
    path.cc File Reference
    \n
    \n
    \n-
    #include <cstdlib>
    \n-#include <iostream>
    \n-#include <mutex>
    \n-#include <ostream>
    \n-#include <dune/common/stdthread.hh>
    \n+\n+

    Utilities for handling filesystem paths. \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 \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 Functions

    void Dune::doAssertCallOnce (const char *file, int line, const char *function)
     
    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-
    \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+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-us-ascii\n+utf-8\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,22 +1,46 @@\n dune-common\u00a02.9.0\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-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+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+#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 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-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+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+ 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 ===============================================================================\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/a00311.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00311.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: iteratorrange.hh File Reference\n+dune-common: streamoperators.hh File Reference\n \n \n \n \n \n \n \n@@ -70,34 +70,52 @@\n
    \n \n
    \n
    \n
    \n \n-
    iteratorrange.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    streamoperators.hh File Reference
    \n
    \n
    \n \n+

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

    \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-\n-\n-\n-\n-

    \n-Classes

    class  Dune::IteratorRange< Iterator >
     Simple range between a begin and an end iterator. 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+Functions

    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-
    \n+

    Detailed Description

    \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,19 +1,35 @@\n dune-common\u00a02.9.0\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+_\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-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-\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+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+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/a00311_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00311_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: streamoperators.hh Source File\n \n \n \n \n \n \n \n@@ -74,84 +74,83 @@\n \n
    \n \n
    \n
    \n
    \n-
    iteratorrange.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 (C) 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-
    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+
    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-
    \n-\n-
    43 {}
    \n-
    \n-
    44
    \n-
    \n-\n-
    47 {
    \n-
    48 return _begin;
    \n-
    49 }
    \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-
    50
    \n+
    49
    \n+
    51 template<typename Stream, typename T, std::size_t N>
    \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+
    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:268
    \n+
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,90 +1,81 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-iteratorrange.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 (C) 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-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+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-_\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+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 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+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:268\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:_\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 ===============================================================================\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/a00314.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00314.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: precision.hh File Reference\n+dune-common: parametertreeparser.hh File Reference\n \n \n \n \n \n \n \n@@ -72,38 +72,48 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    precision.hh File Reference
    \n+
    parametertreeparser.hh File Reference
    \n
    \n
    \n \n-

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

    Various parser methods to get data into a ParameterTree object. \n More...

    \n-
    #include <stdlib.h>
    \n+
    #include <istream>
    \n+#include <string>
    \n+#include <vector>
    \n+#include <dune/common/parametertree.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 Classes

    class  Dune::FMatrixPrecision< ctype >
     Precisions for calculations with FieldMatrix and FieldVector. More...
    class  Dune::ParameterTreeParserError
     report parser error while reading ParameterTree More...
     
    class  Dune::HelpRequest
     exception thrown if the user wants to see help string More...
     
    class  Dune::ParameterTreeParser
     Parsers to set up a ParameterTree from various input sources. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    Various precision settings for calculations with FieldMatrix and FieldVector.

    \n+

    Various parser methods to get data into a ParameterTree object.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,24 +1,33 @@\n dune-common\u00a02.9.0\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-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+parametertreeparser.hh File Reference\n+Various parser methods to get data into a ParameterTree object. _\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/_\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/_\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:_\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+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\bE_\br_\br_\bo_\br\n+\u00a0 report parser error while reading _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bH_\be_\bl_\bp_\bR_\be_\bq_\bu_\be_\bs_\bt\n+\u00a0 exception thrown if the user wants to see help string _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br\n+\u00a0 Parsers to set up a _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be from various input sources. _\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-Various precision settings for calculations with FieldMatrix and FieldVector.\n+Various parser methods to get data into a ParameterTree object.\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/a00314_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: precision.hh Source File\n+dune-common: parametertreeparser.hh Source File\n \n \n \n \n \n \n \n@@ -74,62 +74,92 @@\n \n
    \n \n
    \n
    \n
    \n-
    precision.hh
    \n+
    parametertreeparser.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 (C) 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_PRECISION_HH
    \n-
    6#define DUNE_PRECISION_HH
    \n+
    5#ifndef DUNE_PARAMETER_PARSER_HH
    \n+
    6#define DUNE_PARAMETER_PARSER_HH
    \n
    7
    \n-
    12#include <stdlib.h>
    \n-
    13
    \n-
    14namespace Dune {
    \n+
    12#include <istream>
    \n+
    13#include <string>
    \n+
    14#include <vector>
    \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+\n+\n+
    18
    \n+
    19namespace Dune {
    \n+
    20
    \n+\n+
    28 class HelpRequest : public Exception {};
    \n+
    29
    \n+
    \n+\n+
    35 {
    \n+
    36
    \n+
    37 static std::string ltrim(const std::string& s);
    \n+
    38 static std::string rtrim(const std::string& s);
    \n+
    39
    \n+
    40 public:
    \n+
    41
    \n+
    85
    \n+
    96 static void readINITree(std::istream& in, ParameterTree& pt,
    \n+
    97 bool overwrite);
    \n+
    98
    \n+
    105 static Dune::ParameterTree readINITree(std::istream& in);
    \n+
    106
    \n+
    107
    \n+
    120 static void readINITree(std::istream& in, ParameterTree& pt,
    \n+
    121 const std::string srcname = "stream",
    \n+
    122 bool overwrite = true);
    \n+
    123
    \n+
    124
    \n+
    135 static void readINITree(std::string file, ParameterTree& pt, bool overwrite = true);
    \n+
    136
    \n+
    143 static Dune::ParameterTree readINITree(const std::string& file);
    \n+
    144
    \n+
    146
    \n+
    158 static void readOptions(int argc, char* argv [], ParameterTree& pt);
    \n+
    159
    \n+
    177 static void readNamedOptions(int argc, char* argv[],
    \n+
    178 ParameterTree& pt,
    \n+
    179 std::vector<std::string> keywords,
    \n+
    180 unsigned int required = std::numeric_limits<unsigned int>::max(),
    \n+
    181 bool allow_more = true,
    \n+
    182 bool overwrite = true,
    \n+
    183 std::vector<std::string> help = std::vector<std::string>());
    \n+
    184
    \n+
    185 private:
    \n+
    186 static std::string generateHelpString(std::string progname, std::vector<std::string> keywords, unsigned int required, std::vector<std::string> help);
    \n+
    187 };
    \n+
    \n+
    188
    \n+
    189} // end namespace Dune
    \n+
    190
    \n+
    191#endif // DUNE_PARAMETER_PARSER_HH
    \n+
    A hierarchical structure of string parameters.
    \n+
    A few common exception classes.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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+
    Base class for Dune-Exceptions.
    Definition exceptions.hh:96
    \n+
    Default exception class for range errors.
    Definition exceptions.hh:254
    \n+
    Hierarchical structure of string parameters.
    Definition parametertree.hh:37
    \n+
    report parser error while reading ParameterTree
    Definition parametertreeparser.hh:22
    \n+
    exception thrown if the user wants to see help string
    Definition parametertreeparser.hh:28
    \n+
    Parsers to set up a ParameterTree from various input sources.
    Definition parametertreeparser.hh:35
    \n+
    static void readOptions(int argc, char *argv[], ParameterTree &pt)
    parse command line options and build hierarchical ParameterTree structure
    Definition parametertreeparser.cc:159
    \n+
    static void readINITree(std::istream &in, ParameterTree &pt, bool overwrite)
    parse C++ stream
    Definition parametertreeparser.cc:74
    \n+
    static void readNamedOptions(int argc, char *argv[], ParameterTree &pt, std::vector< std::string > keywords, unsigned int required=std::numeric_limits< unsigned int >::max(), bool allow_more=true, bool overwrite=true, std::vector< std::string > help=std::vector< std::string >())
    read [named] command line options and build hierarchical ParameterTree structure
    Definition parametertreeparser.cc:175
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,60 +1,116 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-precision.hh\n+parametertreeparser.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 (C) 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_PRECISION_HH\n-6#define DUNE_PRECISION_HH\n+5#ifndef DUNE_PARAMETER_PARSER_HH\n+6#define DUNE_PARAMETER_PARSER_HH\n 7\n-12#include \n-13\n-14namespace _\bD_\bu_\bn_\be {\n+12#include \n+13#include \n+14#include \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+16#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+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\n+19namespace _\bD_\bu_\bn_\be {\n+20\n+_\b2_\b2 class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\bE_\br_\br_\bo_\br : public _\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br {};\n+_\b2_\b8 class _\bH_\be_\bl_\bp_\bR_\be_\bq_\bu_\be_\bs_\bt : public _\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn {};\n+29\n+_\b3_\b4 class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br\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+36\n+37 static std::string ltrim(const std::string& s);\n+38 static std::string rtrim(const std::string& s);\n+39\n+40 public:\n+41\n+85\n+96 static void _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::istream& in, _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt,\n+97 bool overwrite);\n+98\n+105 static _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::istream& in);\n+106\n+107\n+120 static void _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::istream& in, _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt,\n+121 const std::string srcname = \"stream\",\n+122 bool overwrite = true);\n+123\n+124\n+135 static void _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(std::string file, _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt, bool overwrite\n+= true);\n+136\n+143 static _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be(const std::string& file);\n+144\n+146\n+158 static void _\br_\be_\ba_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs(int argc, char* argv [], _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt);\n+159\n+177 static void _\br_\be_\ba_\bd_\bN_\ba_\bm_\be_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs(int argc, char* argv[],\n+178 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& pt,\n+179 std::vector keywords,\n+180 unsigned int required = std::numeric_limits::max(),\n+181 bool allow_more = true,\n+182 bool overwrite = true,\n+183 std::vector help = std::vector());\n+184\n+185 private:\n+186 static std::string generateHelpString(std::string progname, std::\n+vector keywords, unsigned int required, std::vector\n+help);\n+187 };\n+188\n+189} // end namespace Dune\n+190\n+191#endif // DUNE_PARAMETER_PARSER_HH\n+_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bt_\br_\be_\be_\b._\bh_\bh\n+A hierarchical structure of string parameters.\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\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_\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+_\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+_\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_\bP_\ba_\br_\bs_\be_\br_\bE_\br_\br_\bo_\br\n+report parser error while reading ParameterTree\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bH_\be_\bl_\bp_\bR_\be_\bq_\bu_\be_\bs_\bt\n+exception thrown if the user wants to see help string\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br\n+Parsers to set up a ParameterTree from various input sources.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\b:_\b:_\br_\be_\ba_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n+static void readOptions(int argc, char *argv[], ParameterTree &pt)\n+parse command line options and build hierarchical ParameterTree structure\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.cc:159\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\b:_\b:_\br_\be_\ba_\bd_\bI_\bN_\bI_\bT_\br_\be_\be\n+static void readINITree(std::istream &in, ParameterTree &pt, bool overwrite)\n+parse C++ stream\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.cc:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be_\bP_\ba_\br_\bs_\be_\br_\b:_\b:_\br_\be_\ba_\bd_\bN_\ba_\bm_\be_\bd_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n+static void readNamedOptions(int argc, char *argv[], ParameterTree &pt, std::\n+vector< std::string > keywords, unsigned int required=std::numeric_limits<\n+unsigned int >::max(), bool allow_more=true, bool overwrite=true, std::vector<\n+std::string > help=std::vector< std::string >())\n+read [named] command line options and build hierarchical ParameterTree\n+structure\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parametertreeparser.cc:175\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/a00317.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00317.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: fmatrixev.cc File Reference\n+dune-common: sllist.hh File Reference\n \n \n \n \n \n \n \n@@ -70,43 +70,60 @@\n
    \n \n
    \n
    \n
    \n
    \n-Macros
    \n-
    fmatrixev.cc File Reference
    \n+Classes |\n+Namespaces |\n+Functions
    \n+
    sllist.hh File Reference
    \n
    \n
    \n-
    #include <iostream>
    \n-#include <cmath>
    \n-#include <cassert>
    \n-#include <dune/common/exceptions.hh>
    \n-
    \n-\n-\n-\n-

    \n-Macros

    #define DUNE_FMATRIXEIGENVALUES_CC
     
    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_FMATRIXEIGENVALUES_CC

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_FMATRIXEIGENVALUES_CC
    \n-
    \n \n+

    Implements a singly linked list together with the necessary iterators. \n+More...

    \n+
    #include <memory>
    \n+#include <cassert>
    \n+#include "iteratorfacades.hh"
    \n+#include <ostream>
    \n
    \n-
    \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+Classes

    class  Dune::SLList< T, A >
     A single linked list. More...
     
    class  Dune::SLListIterator< T, A >
     A mutable iterator for the SLList. More...
     
    class  Dune::SLListConstIterator< T, A >
     A constant iterator for the SLList. More...
     
    class  Dune::SLListModifyIterator< T, A >
     A mutable iterator for the SLList. More...
     
    \n+\n+\n+\n+\n+

    \n+Namespaces

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

    \n+Functions

    template<typename T , typename A >
    std::ostream & Dune::operator<< (std::ostream &os, const SLList< T, A > &sllist)
     
    \n+

    Detailed Description

    \n+

    Implements a singly linked list together with the necessary iterators.

    \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,20 +1,43 @@\n dune-common\u00a02.9.0\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-fmatrixev.cc 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+sllist.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn\n+Implements a singly linked list together with the necessary iterators. _\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-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bF_\bM_\bA_\bT_\bR_\bI_\bX_\bE_\bI_\bG_\bE_\bN_\bV_\bA_\bL_\bU_\bE_\bS_\b__\bC_\bC\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_F\bFM\bMA\bAT\bTR\bRI\bIX\bXE\bEI\bIG\bGE\bEN\bNV\bVA\bAL\bLU\bUE\bES\bS_\b_C\bCC\bC *\b**\b**\b**\b**\b*\n-#define DUNE_FMATRIXEIGENVALUES_CC\n+#include \"_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\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_\bL_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 A single linked list. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bL_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 A mutable iterator for the _\bS_\bL_\bL_\bi_\bs_\bt. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 A constant iterator for the _\bS_\bL_\bL_\bi_\bs_\bt. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 A mutable iterator for the _\bS_\bL_\bL_\bi_\bs_\bt. _\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 _\bS_\bL_\bL_\bi_\bs_\bt< T, A >\n+ &sllist)\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 singly linked list together with the necessary iterators.\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/a00320.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00320.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: proxymemberaccess.hh File Reference\n+dune-common: power.hh File Reference\n \n \n \n \n \n \n \n@@ -70,42 +70,43 @@\n
    \n \n
    \n
    \n
    \n \n-
    proxymemberaccess.hh File Reference
    \n+Classes |\n+Namespaces
    \n+
    power.hh File Reference
    \n
    \n
    \n \n-

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

    Various implementations of the power function for run-time and static arguments. \n More...

    \n-
    #include <type_traits>
    \n-#include <utility>
    \n+
    #include <dune/common/math.hh>
    \n
    \n

    Go to the source code of this file.

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

    \n+Classes

    struct  Dune::StaticPower< b, p >
     Calculates b^p at compile time. More...
     
    struct  Dune::Power< p >
     Compute power for a run-time base and a compile-time integer exponent. More...
     
    \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+

    Various implementations of the power function for run-time and static arguments.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,28 +1,29 @@\n dune-common\u00a02.9.0\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-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+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+power.hh File Reference\n+Various implementations of the power function for run-time and static\n+arguments. _\bM_\bo_\br_\be_\b._\b._\b.\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bP_\bo_\bw_\be_\br_\b<_\b _\bb_\b,_\b _\bp_\b _\b>\n+\u00a0 Calculates b^p at compile time. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\b<_\b _\bp_\b _\b>\n+\u00a0 Compute power for a run-time base and a compile-time integer exponent.\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-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+Various implementations of the power function for run-time and static\n+arguments.\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/a00320_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: proxymemberaccess.hh Source File\n+dune-common: power.hh Source File\n \n \n \n \n \n \n \n@@ -74,107 +74,63 @@\n \n
    \n \n
    \n
    \n
    \n-
    proxymemberaccess.hh
    \n+
    power.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 (C) 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+
    5#ifndef DUNE_COMMON_POWER_HH
    \n+
    6#define DUNE_COMMON_POWER_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+
    8#warning The header power.hh is deprecated. Use power from math.hh instead.
    \n+
    9
    \n+
    14#include <dune/common/math.hh>
    \n+
    15
    \n+
    16namespace Dune {
    \n+
    17
    \n+
    26 template <int b, int p>
    \n+
    \n+\n+
    28 {
    \n+
    30 static constexpr int power = Dune::power(b,p);
    \n+
    31 };
    \n+
    \n+
    32
    \n+
    33
    \n+
    40 template <int p>
    \n+
    \n+
    41 struct Power
    \n+
    42 {
    \n+
    43 template <typename T>
    \n+
    \n+
    44 static constexpr auto eval(const T & a)
    \n+
    45 {
    \n+
    46 return power(a,p);
    \n+
    47 }
    \n+
    \n+
    48 };
    \n+
    \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+
    50}
    \n+
    51
    \n+
    52#endif
    \n+
    Some useful basic math stuff.
    \n+
    static constexpr int power
    power stores b^p
    Definition power.hh:30
    \n+
    static constexpr auto eval(const T &a)
    Definition power.hh:44
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    constexpr Base power(Base m, Exponent p)
    Power method for integer exponents.
    Definition math.hh:75
    \n+
    Calculates b^p at compile time.
    Definition power.hh:28
    \n+
    Compute power for a run-time base and a compile-time integer exponent.
    Definition power.hh:42
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,110 +1,66 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-proxymemberaccess.hh\n+power.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 (C) 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_PROXYMEMBERACCESS_HH\n-6#define DUNE_COMMON_PROXYMEMBERACCESS_HH\n+5#ifndef DUNE_COMMON_POWER_HH\n+6#define DUNE_COMMON_POWER_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+8#warning The header power.hh is deprecated. Use power from math.hh instead.\n+9\n+14#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n+15\n+16namespace _\bD_\bu_\bn_\be {\n+17\n+26 template \n+_\b2_\b7 struct _\bS_\bt_\ba_\bt_\bi_\bc_\bP_\bo_\bw_\be_\br\n+28 {\n+_\b3_\b0 static constexpr int _\bp_\bo_\bw_\be_\br = _\bD_\bu_\bn_\be_\b:_\b:_\bp_\bo_\bw_\be_\br(b,p);\n+31 };\n+32\n+33\n+40 template \n+_\b4_\b1 struct _\bP_\bo_\bw_\be_\br\n+42 {\n+43 template \n+_\b4_\b4 static constexpr auto _\be_\bv_\ba_\bl(const T & a)\n+45 {\n+46 return _\bp_\bo_\bw_\be_\br(a,p);\n+47 }\n+48 };\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+50}\n+51\n+52#endif\n+_\bm_\ba_\bt_\bh_\b._\bh_\bh\n+Some useful basic math stuff.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\ba_\bt_\bi_\bc_\bP_\bo_\bw_\be_\br_\b:_\b:_\bp_\bo_\bw_\be_\br\n+static constexpr int power\n+power stores b^p\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn power.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\b:_\b:_\be_\bv_\ba_\bl\n+static constexpr auto eval(const T &a)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn power.hh:44\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_\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:_\bS_\bt_\ba_\bt_\bi_\bc_\bP_\bo_\bw_\be_\br\n+Calculates b^p at compile time.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn power.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br\n+Compute power for a run-time base and a compile-time integer exponent.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn power.hh:42\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/a00323.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00323.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parametertree.hh File Reference\n+dune-common: genericiterator.hh File Reference\n \n \n \n \n \n \n \n@@ -72,68 +72,58 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    parametertree.hh File Reference
    \n+
    genericiterator.hh File Reference
    \n
    \n
    \n \n-

    A hierarchical structure of string parameters. \n+

    Implements a generic iterator class for writing stl conformant iterators. \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 <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+
    #include <dune/common/iteratorfacades.hh>
    \n+#include <cassert>
    \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 Classes

    class  Dune::ParameterTree
     Hierarchical structure of string parameters. More...
    struct  Dune::const_reference< R >
     Get the 'const' version of a reference to a mutable object. More...
     
    struct  Dune::ParameterTree::Parser< std::basic_string< char, traits, Allocator > >
    struct  Dune::const_reference< const R >
     
    struct  Dune::ParameterTree::Parser< bool >
    struct  Dune::const_reference< R & >
     
    struct  Dune::ParameterTree::Parser< bool >::ToLower
    struct  Dune::const_reference< const R & >
     
    struct  Dune::ParameterTree::Parser< FieldVector< T, n > >
    struct  Dune::mutable_reference< R >
     get the 'mutable' version of a reference to a const object More...
     
    struct  Dune::ParameterTree::Parser< std::array< T, n > >
    struct  Dune::mutable_reference< const R >
     
    struct  Dune::ParameterTree::Parser< std::bitset< n > >
    struct  Dune::mutable_reference< R & >
     
    struct  Dune::ParameterTree::Parser< std::vector< T, A > >
    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...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

    A hierarchical structure of string parameters.

    \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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,54 +1,46 @@\n dune-common\u00a02.9.0\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-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 <_\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/_\bc_\bl_\ba_\bs_\bs_\bn_\ba_\bm_\be_\b._\bh_\bh>\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 _\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_\bT_\br_\be_\be\n-\u00a0 Hierarchical structure of string parameters. _\bM_\bo_\br_\be_\b._\b._\b.\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 \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+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 \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+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 \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+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 \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+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 \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+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:_\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+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:_\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+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 \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+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 ===============================================================================\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/a00323_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: parametertree.hh Source File\n+dune-common: genericiterator.hh Source File\n \n \n \n \n \n \n \n@@ -74,345 +74,239 @@\n \n
    \n \n
    \n
    \n
    \n-
    parametertree.hh
    \n+
    genericiterator.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 (C) 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_PARAMETERTREE_HH
    \n-
    6#define DUNE_PARAMETERTREE_HH
    \n+
    5#ifndef DUNE_GENERICITERATOR_HH
    \n+
    6#define DUNE_GENERICITERATOR_HH
    \n
    7
    \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 public:
    \n-
    44
    \n-
    47 typedef std::vector<std::string> KeyVector;
    \n-
    48
    \n-\n-
    52
    \n-
    53
    \n-
    61 bool hasKey(const std::string& key) const;
    \n-
    62
    \n-
    63
    \n-
    71 bool hasSub(const std::string& sub) const;
    \n-
    72
    \n-
    73
    \n-
    82 std::string& operator[] (const std::string& key);
    \n-
    83
    \n-
    84
    \n-
    94 const std::string& operator[] (const std::string& key) const;
    \n-
    95
    \n-
    96
    \n-
    104 void report(std::ostream& stream = std::cout,
    \n-
    105 const std::string& prefix = "") const;
    \n-
    106
    \n-
    107
    \n-
    113 ParameterTree& sub(const std::string& sub);
    \n-
    114
    \n-
    115
    \n-
    122 const ParameterTree& sub(const std::string& sub, bool fail_if_missing = false) const;
    \n-
    123
    \n-
    124
    \n-
    133 std::string get(const std::string& key, const std::string& defaultValue) const;
    \n-
    134
    \n-
    145 std::string get(const std::string& key, const char* defaultValue) const;
    \n-
    146
    \n-
    147
    \n-
    157 template<typename T>
    \n-
    \n-
    158 T get(const std::string& key, const T& defaultValue) const {
    \n-
    159 if(hasKey(key))
    \n-
    160 return get<T>(key);
    \n-
    161 else
    \n-
    162 return defaultValue;
    \n-
    163 }
    \n-
    \n-
    164
    \n-
    173 template <class T>
    \n-
    \n-
    174 T get(const std::string& key) const {
    \n-
    175 if(not hasKey(key))
    \n-
    176 DUNE_THROW(Dune::RangeError, "Key '" << key
    \n-
    177 << "' not found in ParameterTree (prefix " + prefix_ + ")");
    \n-
    178 try {
    \n-
    179 return Parser<T>::parse((*this)[key]);
    \n-
    180 }
    \n-
    181 catch(const RangeError& e) {
    \n-
    182 // rethrow the error and add more information
    \n-
    183 DUNE_THROW(RangeError, "Cannot parse value \\"" << (*this)[key]
    \n-
    184 << "\\" for key \\"" << prefix_ << "." << key << "\\""
    \n-
    185 << e.what());
    \n-
    186 }
    \n-
    187 }
    \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+
    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+
    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+
    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-
    196 const KeyVector& getValueKeys() const;
    \n-
    197
    \n-
    198
    \n-
    206 const KeyVector& getSubKeys() const;
    \n-
    207
    \n-
    208 protected:
    \n-
    209
    \n-
    210 static const ParameterTree empty_;
    \n-
    211
    \n-
    212 std::string prefix_;
    \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+
    203
    \n+
    \n+
    211 GenericIterator(const MutableIterator& other) : container_(other.container_), position_(other.position_)
    \n+
    212 {}
    \n+
    \n
    213
    \n-\n-\n-
    216
    \n-
    217 std::map<std::string, std::string> values_;
    \n-
    218 std::map<std::string, ParameterTree> subs_;
    \n-
    219
    \n-
    220 static std::string ltrim(const std::string& s);
    \n-
    221 static std::string rtrim(const std::string& s);
    \n-
    222 static std::vector<std::string> split(const std::string & s);
    \n-
    223
    \n-
    224 // parse into a fixed-size range of iterators
    \n-
    225 template<class Iterator>
    \n-
    \n-
    226 static void parseRange(const std::string &str,
    \n-
    227 Iterator it, const Iterator &end)
    \n-
    228 {
    \n-
    229 typedef typename std::iterator_traits<Iterator>::value_type Value;
    \n-
    230 std::istringstream s(str);
    \n-
    231 // make sure we are in locale "C"
    \n-
    232 s.imbue(std::locale::classic());
    \n-
    233 std::size_t n = 0;
    \n-
    234 for(; it != end; ++it, ++n) {
    \n-
    235 s >> *it;
    \n-
    236 if(!s)
    \n-
    237 DUNE_THROW(RangeError, "as a range of items of type "
    \n-
    238 << className<Value>()
    \n-
    239 << " (" << n << " items were extracted successfully)");
    \n-
    240 }
    \n-
    241 Value dummy;
    \n-
    242 s >> dummy;
    \n-
    243 // now extraction should have failed, and eof should be set
    \n-
    244 if(not s.fail() or not s.eof())
    \n-
    245 DUNE_THROW(RangeError, "as a range of "
    \n-
    246 << n << " items of type "
    \n-
    247 << className<Value>() << " (more items than the range can hold)");
    \n+
    \n+
    223 GenericIterator(const ConstIterator& other) : container_(other.container_), position_(other.position_)
    \n+
    224 {}
    \n+
    \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-
    \n-
    250
    \n-
    251 template<typename T>
    \n-
    252 struct ParameterTree::Parser {
    \n-
    253 static T parse(const std::string& str) {
    \n-
    254 T val;
    \n-
    255 std::istringstream s(str);
    \n-
    256 // make sure we are in locale "C"
    \n-
    257 s.imbue(std::locale::classic());
    \n-
    258 s >> val;
    \n-
    259 if(!s)
    \n-
    260 DUNE_THROW(RangeError, " as a " << className<T>());
    \n-
    261 char dummy;
    \n-
    262 s >> dummy;
    \n-
    263 // now extraction should have failed, and eof should be set
    \n-
    264 if ((! s.fail()) || (! s.eof()))
    \n-
    265 DUNE_THROW(RangeError, " as a " << className<T>());
    \n-
    266 return val;
    \n-
    267 }
    \n-
    268 };
    \n-
    269
    \n-
    270 // "How do I convert a string into a wstring in C++?" "Why, that very simple
    \n-
    271 // son. You just need a these hundred lines of code."
    \n-
    272 // Instead im going to restrict myself to string with charT=char here.
    \n-
    273 template<typename traits, typename Allocator>
    \n-
    \n-
    274 struct ParameterTree::Parser<std::basic_string<char, traits, Allocator> > {
    \n-
    275 static std::basic_string<char, traits, Allocator>
    \n-
    \n-
    276 parse(const std::string& str) {
    \n-
    277 std::string trimmed = ltrim(rtrim(str));
    \n-
    278 return std::basic_string<char, traits, Allocator>(trimmed.begin(),
    \n-
    279 trimmed.end());
    \n-
    280 }
    \n-
    \n-
    281 };
    \n-
    \n-
    282
    \n-
    283 template<>
    \n-
    \n-
    284 struct ParameterTree::Parser< bool > {
    \n-
    \n-
    285 struct ToLower {
    \n-
    \n-
    286 char operator()(char c)
    \n-
    287 {
    \n-
    288 return std::tolower(c, std::locale::classic());
    \n-
    289 }
    \n-
    \n-
    290 };
    \n-
    \n-
    291
    \n-
    292 static bool
    \n-
    \n-
    293 parse(const std::string& str) {
    \n-
    294 std::string ret = str;
    \n-
    295
    \n-
    296 std::transform(ret.begin(), ret.end(), ret.begin(), ToLower());
    \n-
    297
    \n-
    298 if (ret == "yes" || ret == "true")
    \n-
    299 return true;
    \n-
    300
    \n-
    301 if (ret == "no" || ret == "false")
    \n-
    302 return false;
    \n-
    303
    \n-
    304 return (Parser<int>::parse(ret) != 0);
    \n-
    305 }
    \n-
    \n-
    306 };
    \n-
    \n-
    307
    \n-
    308 template<typename T, int n>
    \n-
    \n-
    309 struct ParameterTree::Parser<FieldVector<T, n> > {
    \n-
    310 static FieldVector<T, n>
    \n-
    \n-
    311 parse(const std::string& str) {
    \n-\n-
    313 parseRange(str, val.begin(), val.end());
    \n-
    314 return val;
    \n-
    315 }
    \n-
    \n-
    316 };
    \n-
    \n-
    317
    \n-
    318 template<typename T, std::size_t n>
    \n-
    \n-
    319 struct ParameterTree::Parser<std::array<T, n> > {
    \n-
    320 static std::array<T, n>
    \n-
    \n-
    321 parse(const std::string& str) {
    \n-
    322 std::array<T, n> val;
    \n-
    323 parseRange(str, val.begin(), val.end());
    \n-
    324 return val;
    \n-
    325 }
    \n-
    \n-
    326 };
    \n-
    \n-
    327
    \n-
    328 template<std::size_t n>
    \n-
    \n-
    329 struct ParameterTree::Parser<std::bitset<n> > {
    \n-
    330 static std::bitset<n>
    \n-
    \n-
    331 parse(const std::string& str) {
    \n-
    332 std::bitset<n> val;
    \n-
    333 std::vector<std::string> sub = split(str);
    \n-
    334 if (sub.size() != n)
    \n-
    335 DUNE_THROW(RangeError, "as a bitset<" << n << "> "
    \n-
    336 << "because of unmatching size " << sub.size());
    \n-
    337 for (std::size_t i=0; i<n; ++i) {
    \n-
    338 val[i] = ParameterTree::Parser<bool>::parse(sub[i]);
    \n-
    339 }
    \n-
    340 return val;
    \n-
    341 }
    \n-
    \n-
    342 };
    \n-
    \n-
    343
    \n-
    344 template<typename T, typename A>
    \n-
    \n-
    345 struct ParameterTree::Parser<std::vector<T, A> > {
    \n-
    346 static std::vector<T, A>
    \n-
    \n-
    347 parse(const std::string& str) {
    \n-
    348 std::vector<std::string> sub = split(str);
    \n-
    349 std::vector<T, A> vec;
    \n-
    350 for (unsigned int i=0; i<sub.size(); ++i) {
    \n-
    351 T val = ParameterTree::Parser<T>::parse(sub[i]);
    \n-
    352 vec.push_back(val);
    \n-
    353 }
    \n-
    354 return vec;
    \n-
    355 }
    \n-
    \n-
    356 };
    \n-
    \n-
    357
    \n-
    358} // end namespace Dune
    \n-
    359
    \n-
    360#endif // DUNE_PARAMETERTREE_HH
    \n-
    A free function to provide the demangled class name of a given object or type as a string.
    \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-
    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+
    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+
    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
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    vector space out of a tensor product of fields.
    Definition fvector.hh:95
    \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:214
    \n-
    std::map< std::string, ParameterTree > subs_
    Definition parametertree.hh:218
    \n-
    static const ParameterTree empty_
    Definition parametertree.hh:210
    \n-
    static std::string rtrim(const std::string &s)
    Definition parametertree.cc:210
    \n-
    std::string get(const std::string &key, const std::string &defaultValue) const
    get value as string
    Definition parametertree.cc:185
    \n-
    static std::string ltrim(const std::string &s)
    Definition parametertree.cc:201
    \n-
    void report(std::ostream &stream=std::cout, const std::string &prefix="") const
    print distinct substructure to stream
    Definition parametertree.cc:29
    \n-
    std::vector< std::string > KeyVector
    storage for key lists
    Definition parametertree.hh:47
    \n-
    static void parseRange(const std::string &str, Iterator it, const Iterator &end)
    Definition parametertree.hh:226
    \n-
    ParameterTree()
    Create new empty ParameterTree.
    Definition parametertree.cc:24
    \n-
    std::string & operator[](const std::string &key)
    get value reference for key
    Definition parametertree.cc:150
    \n-
    KeyVector subKeys_
    Definition parametertree.hh:215
    \n-
    ParameterTree & sub(const std::string &sub)
    get substructure by name
    Definition parametertree.cc:103
    \n-
    bool hasKey(const std::string &key) const
    test for key
    Definition parametertree.cc:48
    \n-
    const KeyVector & getSubKeys() const
    get substructure keys
    Definition parametertree.cc:240
    \n-
    T get(const std::string &key) const
    Get value.
    Definition parametertree.hh:174
    \n-
    bool hasSub(const std::string &sub) const
    test for substructure
    Definition parametertree.cc:76
    \n-
    std::map< std::string, std::string > values_
    Definition parametertree.hh:217
    \n-
    T get(const std::string &key, const T &defaultValue) const
    get value converted to a certain type
    Definition parametertree.hh:158
    \n-
    std::string prefix_
    Definition parametertree.hh:212
    \n-
    static std::vector< std::string > split(const std::string &s)
    Definition parametertree.cc:219
    \n-
    const KeyVector & getValueKeys() const
    get value keys
    Definition parametertree.cc:235
    \n-
    static std::basic_string< char, traits, Allocator > parse(const std::string &str)
    Definition parametertree.hh:276
    \n-
    static bool parse(const std::string &str)
    Definition parametertree.hh:293
    \n-
    char operator()(char c)
    Definition parametertree.hh:286
    \n-
    static FieldVector< T, n > parse(const std::string &str)
    Definition parametertree.hh:311
    \n-
    static std::array< T, n > parse(const std::string &str)
    Definition parametertree.hh:321
    \n-
    static std::bitset< n > parse(const std::string &str)
    Definition parametertree.hh:331
    \n-
    static std::vector< T, A > parse(const std::string &str)
    Definition parametertree.hh:347
    \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:434
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,404 +1,267 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-parametertree.hh\n+genericiterator.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 (C) 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_PARAMETERTREE_HH\n-6#define DUNE_PARAMETERTREE_HH\n+5#ifndef DUNE_GENERICITERATOR_HH\n+6#define DUNE_GENERICITERATOR_HH\n 7\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 public:\n-44\n-_\b4_\b7 typedef std::vector _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br;\n-48\n-51 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be();\n-52\n-53\n-61 bool _\bh_\ba_\bs_\bK_\be_\by(const std::string& key) const;\n-62\n-63\n-71 bool _\bh_\ba_\bs_\bS_\bu_\bb(const std::string& _\bs_\bu_\bb) const;\n-72\n-73\n-82 std::string& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (const std::string& key);\n-83\n-84\n-94 const std::string& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (const std::string& key) const;\n-95\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-104 void _\br_\be_\bp_\bo_\br_\bt(std::ostream& stream = std::cout,\n-105 const std::string& prefix = \"\") const;\n-106\n-107\n-113 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be& _\bs_\bu_\bb(const std::string& _\bs_\bu_\bb);\n-114\n-115\n-122 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-123\n-124\n-133 std::string _\bg_\be_\bt(const std::string& key, const std::string& defaultValue)\n-const;\n-134\n-145 std::string _\bg_\be_\bt(const std::string& key, const char* defaultValue) const;\n-146\n-147\n-157 template\n-_\b1_\b5_\b8 T _\bg_\be_\bt(const std::string& key, const T& defaultValue) const {\n-159 if(_\bh_\ba_\bs_\bK_\be_\by(key))\n-160 return get(key);\n-161 else\n-162 return defaultValue;\n-163 }\n-164\n-173 template \n-_\b1_\b7_\b4 T _\bg_\be_\bt(const std::string& key) const {\n-175 if(not _\bh_\ba_\bs_\bK_\be_\by(key))\n-176 _\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-177 << \"' not found in ParameterTree (prefix \" + _\bp_\br_\be_\bf_\bi_\bx_\b_ + \")\");\n-178 try {\n-179 return Parser::parse((*this)[key]);\n-180 }\n-181 catch(const _\bR_\ba_\bn_\bg_\be_\bE_\br_\br_\bo_\br& e) {\n-182 // rethrow the error and add more information\n-183 _\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-184 << \"\\\" for key \\\"\" << _\bp_\br_\be_\bf_\bi_\bx_\b_ << \".\" << key << \"\\\"\"\n-185 << e._\bw_\bh_\ba_\bt());\n-186 }\n-187 }\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+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+IteratorFacade=_\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 IteratorFacade,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+IteratorFacade>;\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+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+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-196 const _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br& _\bg_\be_\bt_\bV_\ba_\bl_\bu_\be_\bK_\be_\by_\bs() const;\n-197\n-198\n-206 const _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br& _\bg_\be_\bt_\bS_\bu_\bb_\bK_\be_\by_\bs() const;\n-207\n-208 protected:\n-209\n-_\b2_\b1_\b0 static const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bT_\br_\be_\be _\be_\bm_\bp_\bt_\by_\b_;\n-211\n-_\b2_\b1_\b2 std::string _\bp_\br_\be_\bf_\bi_\bx_\b_;\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+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 213\n-_\b2_\b1_\b4 _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br _\bv_\ba_\bl_\bu_\be_\bK_\be_\by_\bs_\b_;\n-_\b2_\b1_\b5 _\bK_\be_\by_\bV_\be_\bc_\bt_\bo_\br _\bs_\bu_\bb_\bK_\be_\by_\bs_\b_;\n-216\n-_\b2_\b1_\b7 std::map _\bv_\ba_\bl_\bu_\be_\bs_\b_;\n-_\b2_\b1_\b8 std::map _\bs_\bu_\bb_\bs_\b_;\n-219\n-220 static std::string _\bl_\bt_\br_\bi_\bm(const std::string& s);\n-221 static std::string _\br_\bt_\br_\bi_\bm(const std::string& s);\n-222 static std::vector _\bs_\bp_\bl_\bi_\bt(const std::string & s);\n-223\n-224 // parse into a fixed-size range of iterators\n-225 template\n-_\b2_\b2_\b6 static void _\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(const std::string &str,\n-227 Iterator it, const Iterator &end)\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+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 typedef typename std::iterator_traits::value_type Value;\n-230 std::istringstream s(str);\n-231 // make sure we are in locale \"C\"\n-232 s.imbue(std::locale::classic());\n-233 std::size_t n = 0;\n-234 for(; it != end; ++it, ++n) {\n-235 s >> *it;\n-236 if(!s)\n-237 _\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-238 << className()\n-239 << \" (\" << n << \" items were extracted successfully)\");\n-240 }\n-241 Value dummy;\n-242 s >> dummy;\n-243 // now extraction should have failed, and eof should be set\n-244 if(not s.fail() or not s.eof())\n-245 _\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-246 << n << \" items of type \"\n-247 << className() << \" (more items than the range can hold)\");\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\n-251 template\n-252 struct ParameterTree::Parser {\n-253 static T parse(const std::string& str) {\n-254 T val;\n-255 std::istringstream s(str);\n-256 // make sure we are in locale \"C\"\n-257 s.imbue(std::locale::classic());\n-258 s >> val;\n-259 if(!s)\n-260 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \" as a \" << className());\n-261 char dummy;\n-262 s >> dummy;\n-263 // now extraction should have failed, and eof should be set\n-264 if ((! s.fail()) || (! s.eof()))\n-265 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(RangeError, \" as a \" << className());\n-266 return val;\n-267 }\n-268 };\n-269\n-270 // \"How do I convert a string into a wstring in C++?\" \"Why, that very\n-simple\n-271 // son. You just need a these hundred lines of code.\"\n-272 // Instead im going to restrict myself to string with charT=char here.\n-273 template\n-_\b2_\b7_\b4 struct ParameterTree::Parser<_\bs_\bt_\bd::basic_string > {\n-275 static std::basic_string\n-_\b2_\b7_\b6 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n-277 std::string trimmed = _\bl_\bt_\br_\bi_\bm(_\br_\bt_\br_\bi_\bm(str));\n-278 return std::basic_string(trimmed.begin(),\n-279 trimmed.end());\n-280 }\n-281 };\n-282\n-283 template<>\n-_\b2_\b8_\b4 struct ParameterTree::Parser< bool > {\n-_\b2_\b8_\b5 struct ToLower {\n-_\b2_\b8_\b6 char _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(char c)\n-287 {\n-288 return std::tolower(c, std::locale::classic());\n-289 }\n-290 };\n-291\n-292 static bool\n-_\b2_\b9_\b3 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n-294 std::string ret = str;\n-295\n-296 std::transform(ret.begin(), ret.end(), ret.begin(), ToLower());\n-297\n-298 if (ret == \"yes\" || ret == \"true\")\n-299 return true;\n-300\n-301 if (ret == \"no\" || ret == \"false\")\n-302 return false;\n-303\n-304 return (Parser::parse(ret) != 0);\n-305 }\n-306 };\n-307\n-308 template\n-_\b3_\b0_\b9 struct ParameterTree::Parser<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br > {\n-310 static _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bn_\b>\n-_\b3_\b1_\b1 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n-312 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bn_\b> val;\n-313 _\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(str, val._\bb_\be_\bg_\bi_\bn(), val._\be_\bn_\bd());\n-314 return val;\n-315 }\n-316 };\n-317\n-318 template\n-_\b3_\b1_\b9 struct ParameterTree::Parser<_\bs_\bt_\bd::array > {\n-320 static std::array\n-_\b3_\b2_\b1 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n-322 std::array val;\n-323 _\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(str, val.begin(), val.end());\n-324 return val;\n-325 }\n-326 };\n-327\n-328 template\n-_\b3_\b2_\b9 struct ParameterTree::Parser<_\bs_\bt_\bd::bitset > {\n-330 static std::bitset\n-_\b3_\b3_\b1 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n-332 std::bitset val;\n-333 std::vector _\bs_\bu_\bb = _\bs_\bp_\bl_\bi_\bt(str);\n-334 if (_\bs_\bu_\bb.size() != n)\n-335 _\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-336 << \"because of unmatching size \" << _\bs_\bu_\bb.size());\n-337 for (std::size_t i=0; i::parse(_\bs_\bu_\bb[i]);\n-339 }\n-340 return val;\n-341 }\n-342 };\n-343\n-344 template\n-_\b3_\b4_\b5 struct ParameterTree::Parser<_\bs_\bt_\bd::vector > {\n-346 static std::vector\n-_\b3_\b4_\b7 _\bp_\ba_\br_\bs_\be(const std::string& str) {\n-348 std::vector _\bs_\bu_\bb = _\bs_\bp_\bl_\bi_\bt(str);\n-349 std::vector vec;\n-350 for (unsigned int i=0; i<_\bs_\bu_\bb.size(); ++i) {\n-351 T val = ParameterTree::Parser::parse(_\bs_\bu_\bb[i]);\n-352 vec.push_back(val);\n-353 }\n-354 return vec;\n-355 }\n-356 };\n-357\n-358} // end namespace Dune\n-359\n-360#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-_\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:_\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+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+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 _\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_\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:95\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:214\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:218\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:210\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:210\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:185\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:201\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:29\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:47\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:226\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:24\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:150\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:215\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:103\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:48\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:240\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:174\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:76\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:217\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:158\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:212\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:219\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:235\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:276\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:293\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:286\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:311\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:321\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:331\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:347\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:434\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/a00326.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00326.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: timer.hh File Reference\n+dune-common: debugallocator.hh File Reference\n \n \n \n \n \n \n \n@@ -69,41 +69,19 @@\n \n
    \n \n
    \n
    \n
    \n- \n-
    timer.hh File Reference
    \n+
    debugallocator.hh File Reference
    \n
    \n
    \n \n-

    A simple timing class. \n-More...

    \n-
    #include <chrono>
    \n-
    \n

    Go to the source code of this file.

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

    \n-Classes

    class  Dune::Timer
     A simple stop watch. More...
     
    \n-\n-\n-\n-\n-

    \n-Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-

    Detailed Description

    \n-

    A simple timing class.

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,24 +1,10 @@\n dune-common\u00a02.9.0\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-timer.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn\n-A simple timing class. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n+debugallocator.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-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\bi_\bm_\be_\br\n-\u00a0 A simple stop watch. _\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-A simple timing 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/a00326_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: timer.hh Source File\n+dune-common: debugallocator.hh Source File\n \n \n \n \n \n \n \n@@ -74,157 +74,345 @@\n \n
    \n \n
    \n
    \n
    \n-
    timer.hh
    \n+
    debugallocator.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 (C) 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_TIMER_HH
    \n-
    6#define DUNE_TIMER_HH
    \n+
    5#ifndef DUNE_DEBUG_ALLOCATOR_HH
    \n+
    6#define DUNE_DEBUG_ALLOCATOR_HH
    \n
    7
    \n-
    8#ifndef TIMER_USE_STD_CLOCK
    \n-
    9// headers for std::chrono
    \n-
    10#include <chrono>
    \n-
    11#else
    \n-
    12// headers for std::clock
    \n-
    13#include <ctime>
    \n-
    14#endif
    \n-
    15
    \n-
    16namespace Dune {
    \n-
    17
    \n-
    \n-
    42 class Timer
    \n-
    43 {
    \n-
    44 public:
    \n+
    8#if __has_include(<sys/mman.h>)
    \n+
    9
    \n+
    10#include <sys/mman.h>
    \n+
    11#define HAVE_SYS_MMAN_H 1
    \n+
    12#define HAVE_MPROTECT 1
    \n+
    13
    \n+
    14#include <exception>
    \n+
    15#include <typeinfo>
    \n+
    16#include <vector>
    \n+
    17#include <iostream>
    \n+
    18#include <cstring>
    \n+
    19#include <cstdint>
    \n+
    20#include <cstdlib>
    \n+
    21#include <new>
    \n+
    22
    \n+
    23#include "mallocallocator.hh"
    \n+
    24
    \n+
    25namespace Dune
    \n+
    26{
    \n+
    27
    \n+
    28#ifndef DOXYGEN // hide implementation details from doxygen
    \n+
    29 namespace DebugMemory
    \n+
    30 {
    \n+
    31
    \n+
    32 extern const std::ptrdiff_t page_size;
    \n+
    33
    \n+
    34 struct AllocationManager
    \n+
    35 {
    \n+
    36 typedef std::size_t size_type;
    \n+
    37 typedef std::ptrdiff_t difference_type;
    \n+
    38 typedef void* pointer;
    \n+
    39
    \n+
    40 protected:
    \n+
    41 static void allocation_error(const char* msg);
    \n+
    42
    \n+
    43 struct AllocationInfo;
    \n+
    44 friend struct AllocationInfo;
    \n
    45
    \n-
    \n-
    50 Timer (bool startImmediately=true) noexcept
    \n-
    51 {
    \n-
    52 isRunning_ = startImmediately;
    \n-
    53 reset();
    \n-
    54 }
    \n-
    \n+
    46#define ALLOCATION_ASSERT(A) { if (!(A)) \\
    \n+
    47 { allocation_error("Assertion " # A " failed");\\
    \n+
    48 }\\
    \n+
    49};
    \n+
    50
    \n+
    51 struct AllocationInfo
    \n+
    52 {
    \n+
    53 AllocationInfo(const std::type_info & t) : type(&t) {}
    \n+
    54 const std::type_info * type;
    \n
    55
    \n-
    \n-
    57 void reset() noexcept
    \n-
    58 {
    \n-
    59 sumElapsed_ = 0.0;
    \n-
    60 storedLastElapsed_ = 0.0;
    \n-
    61 rawReset();
    \n-
    62 }
    \n-
    \n+
    56 pointer page_ptr;
    \n+
    57 pointer ptr;
    \n+
    58 size_type pages;
    \n+
    59 size_type capacity;
    \n+
    60 size_type size;
    \n+
    61 bool not_free;
    \n+
    62 };
    \n
    63
    \n-
    64
    \n-
    \n-
    66 void start() noexcept
    \n-
    67 {
    \n-
    68 if (not (isRunning_))
    \n-
    69 {
    \n-
    70 rawReset();
    \n-
    71 isRunning_ = true;
    \n-
    72 }
    \n-
    73 }
    \n-
    \n-
    74
    \n-
    75
    \n-
    \n-
    77 double elapsed () const noexcept
    \n-
    78 {
    \n-
    79 // if timer is running add the time elapsed since last start to sum
    \n-
    80 if (isRunning_)
    \n-
    81 return sumElapsed_ + lastElapsed();
    \n-
    82
    \n-
    83 return sumElapsed_;
    \n-
    84 }
    \n-
    \n-
    85
    \n-
    86
    \n-
    \n-
    88 double lastElapsed () const noexcept
    \n-
    89 {
    \n-
    90 // if timer is running return the current value
    \n-
    91 if (isRunning_)
    \n-
    92 return rawElapsed();
    \n-
    93
    \n-
    94 // if timer is not running return stored value from last run
    \n-
    95 return storedLastElapsed_;
    \n-
    96 }
    \n-
    \n+
    64 typedef MallocAllocator<AllocationInfo> Alloc;
    \n+
    65 typedef std::vector<AllocationInfo, Alloc> AllocationList;
    \n+
    66 AllocationList allocation_list;
    \n+
    67
    \n+
    68 private:
    \n+
    69 void memprotect([[maybe_unused]] void* from,
    \n+
    70 [[maybe_unused]] difference_type len,
    \n+
    71 [[maybe_unused]] int prot)
    \n+
    72 {
    \n+
    73#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
    \n+
    74 int result = mprotect(from, len, prot);
    \n+
    75 if (result == -1)
    \n+
    76 {
    \n+
    77
    \n+
    78 std::cerr << "ERROR: (" << result << ": " << strerror(result) << ")" << std::endl;
    \n+
    79 std::cerr << " Failed to ";
    \n+
    80 if (prot == PROT_NONE)
    \n+
    81 std::cerr << "protect ";
    \n+
    82 else
    \n+
    83 std::cerr << "unprotect ";
    \n+
    84 std::cerr << "memory range: "
    \n+
    85 << from << ", "
    \n+
    86 << static_cast<void*>(
    \n+
    87 static_cast<char*>(from) + len)
    \n+
    88 << std::endl;
    \n+
    89 abort();
    \n+
    90 }
    \n+
    91#else
    \n+
    92 std::cerr << "WARNING: memory protection not available" << std::endl;
    \n+
    93#endif
    \n+
    94 }
    \n+
    95
    \n+
    96 public:
    \n
    97
    \n-
    98
    \n-
    \n-
    100 double stop() noexcept
    \n-
    101 {
    \n-
    102 if (isRunning_)
    \n-
    103 {
    \n-
    104 // update storedLastElapsed_ and sumElapsed_ and stop timer
    \n-
    105 storedLastElapsed_ = lastElapsed();
    \n-
    106 sumElapsed_ += storedLastElapsed_;
    \n-
    107 isRunning_ = false;
    \n-
    108 }
    \n-
    109 return elapsed();
    \n-
    110 }
    \n-
    \n-
    111
    \n-
    112
    \n-
    113 private:
    \n-
    114
    \n-
    115 bool isRunning_;
    \n-
    116 double sumElapsed_;
    \n-
    117 double storedLastElapsed_;
    \n-
    118
    \n-
    119
    \n-
    120#ifdef TIMER_USE_STD_CLOCK
    \n-
    121 void rawReset() noexcept
    \n-
    122 {
    \n-
    123 cstart = std::clock();
    \n-
    124 }
    \n-
    125
    \n-
    126 double rawElapsed () const noexcept
    \n-
    127 {
    \n-
    128 return (std::clock()-cstart) / static_cast<double>(CLOCKS_PER_SEC);
    \n-
    129 }
    \n-
    130
    \n-
    131 std::clock_t cstart;
    \n-
    132#else
    \n-
    133 void rawReset() noexcept
    \n-
    134 {
    \n-
    135 cstart = std::chrono::high_resolution_clock::now();
    \n-
    136 }
    \n-
    137
    \n-
    138 double rawElapsed () const noexcept
    \n-
    139 {
    \n-
    140 std::chrono::high_resolution_clock::time_point now = std::chrono::high_resolution_clock::now();
    \n-
    141 std::chrono::duration<double> time_span = std::chrono::duration_cast<std::chrono::duration<double> >(now - cstart);
    \n-
    142 return time_span.count();
    \n-
    143 }
    \n-
    144
    \n-
    145 std::chrono::high_resolution_clock::time_point cstart;
    \n-
    146#endif
    \n-
    147 }; // end class Timer
    \n-
    \n+
    98 ~AllocationManager ()
    \n+
    99 {
    \n+
    100 AllocationList::iterator it;
    \n+
    101 bool error = false;
    \n+
    102 for (it=allocation_list.begin(); it!=allocation_list.end(); it++)
    \n+
    103 {
    \n+
    104 if (it->not_free)
    \n+
    105 {
    \n+
    106 std::cerr << "ERROR: found memory chunk still in use: " <<
    \n+
    107 it->capacity << " bytes at " << it->ptr << std::endl;
    \n+
    108 error = true;
    \n+
    109 }
    \n+
    110 munmap(it->page_ptr, it->pages * page_size);
    \n+
    111 }
    \n+
    112 if (error)
    \n+
    113 allocation_error("lost allocations");
    \n+
    114 }
    \n+
    115
    \n+
    116 template<typename T>
    \n+
    117 T* allocate(size_type n)
    \n+
    118 {
    \n+
    119 // setup chunk info
    \n+
    120 AllocationInfo ai(typeid(T));
    \n+
    121 ai.size = n;
    \n+
    122 ai.capacity = n * sizeof(T);
    \n+
    123 ai.pages = (ai.capacity) / page_size + 2;
    \n+
    124 ai.not_free = true;
    \n+
    125 size_type overlap = ai.capacity % page_size;
    \n+
    126 ai.page_ptr = mmap(NULL, ai.pages * page_size,
    \n+
    127 PROT_READ | PROT_WRITE,
    \n+
    128#ifdef __APPLE__
    \n+
    129 MAP_ANON | MAP_PRIVATE,
    \n+
    130#else
    \n+
    131 MAP_ANONYMOUS | MAP_PRIVATE,
    \n+
    132#endif
    \n+
    133 -1, 0);
    \n+
    134 if (MAP_FAILED == ai.page_ptr)
    \n+
    135 {
    \n+
    136 throw std::bad_alloc();
    \n+
    137 }
    \n+
    138 ai.ptr = static_cast<char*>(ai.page_ptr) + page_size - overlap;
    \n+
    139 // write protect memory behind the actual data
    \n+
    140 memprotect(static_cast<char*>(ai.page_ptr) + (ai.pages-1) * page_size,
    \n+
    141 page_size,
    \n+
    142 PROT_NONE);
    \n+
    143 // remember the chunk
    \n+
    144 allocation_list.push_back(ai);
    \n+
    145 // return the ptr
    \n+
    146 return static_cast<T*>(ai.ptr);
    \n+
    147 }
    \n
    148
    \n-
    151} // end namespace
    \n-
    152
    \n-
    153#endif
    \n+
    149 template<typename T>
    \n+
    150 void deallocate(T* ptr, size_type n = 0) noexcept
    \n+
    151 {
    \n+
    152 // compute page address
    \n+
    153 void* page_ptr =
    \n+
    154 static_cast<void*>(
    \n+
    155 (char*)(ptr) - ((std::uintptr_t)(ptr) % page_size));
    \n+
    156 // search list
    \n+
    157 AllocationList::iterator it;
    \n+
    158 unsigned int i = 0;
    \n+
    159 for (it=allocation_list.begin(); it!=allocation_list.end(); it++, i++)
    \n+
    160 {
    \n+
    161 if (it->page_ptr == page_ptr)
    \n+
    162 {
    \n+
    163 // std::cout << "found memory_block in allocation " << i << std::endl;
    \n+
    164 // sanity checks
    \n+
    165 if (n != 0)
    \n+
    166 ALLOCATION_ASSERT(n == it->size);
    \n+
    167 ALLOCATION_ASSERT(ptr == it->ptr);
    \n+
    168 ALLOCATION_ASSERT(true == it->not_free);
    \n+
    169 ALLOCATION_ASSERT(typeid(T) == *(it->type));
    \n+
    170 // free memory
    \n+
    171 it->not_free = false;
    \n+
    172#if DEBUG_ALLOCATOR_KEEP
    \n+
    173 // write protect old memory
    \n+
    174 memprotect(it->page_ptr,
    \n+
    175 (it->pages) * page_size,
    \n+
    176 PROT_NONE);
    \n+
    177#else
    \n+
    178 // unprotect old memory
    \n+
    179 memprotect(it->page_ptr,
    \n+
    180 (it->pages) * page_size,
    \n+
    181 PROT_READ | PROT_WRITE);
    \n+
    182 munmap(it->page_ptr, it->pages * page_size);
    \n+
    183 // remove chunk info
    \n+
    184 allocation_list.erase(it);
    \n+
    185#endif
    \n+
    186 return;
    \n+
    187 }
    \n+
    188 }
    \n+
    189 allocation_error("memory block not found");
    \n+
    190 }
    \n+
    191 };
    \n+
    192#undef ALLOCATION_ASSERT
    \n+
    193
    \n+
    194 extern AllocationManager alloc_man;
    \n+
    195 } // end namespace DebugMemory
    \n+
    196#endif // DOXYGEN
    \n+
    197
    \n+
    198 template<class T>
    \n+
    199 class DebugAllocator;
    \n+
    200
    \n+
    201 // specialize for void
    \n+
    202 template <>
    \n+
    203 class DebugAllocator<void> {
    \n+
    204 public:
    \n+
    205 typedef void* pointer;
    \n+
    206 typedef const void* const_pointer;
    \n+
    207 // reference to void members are impossible.
    \n+
    208 typedef void value_type;
    \n+
    209 template <class U> struct rebind {
    \n+
    210 typedef DebugAllocator<U> other;
    \n+
    211 };
    \n+
    212 };
    \n+
    213
    \n+
    214 // actual implementation
    \n+
    233 template <class T>
    \n+
    234 class DebugAllocator {
    \n+
    235 public:
    \n+
    236 typedef std::size_t size_type;
    \n+
    237 typedef std::ptrdiff_t difference_type;
    \n+
    238 typedef T* pointer;
    \n+
    239 typedef const T* const_pointer;
    \n+
    240 typedef T& reference;
    \n+
    241 typedef const T& const_reference;
    \n+
    242 typedef T value_type;
    \n+
    243 template <class U> struct rebind {
    \n+
    244 typedef DebugAllocator<U> other;
    \n+
    245 };
    \n+
    246
    \n+
    248 DebugAllocator() noexcept {}
    \n+
    250 template <class U>
    \n+
    251 DebugAllocator(const DebugAllocator<U>&) noexcept {}
    \n+
    253 ~DebugAllocator() noexcept {}
    \n+
    254
    \n+
    255 pointer address(reference x) const
    \n+
    256 {
    \n+
    257 return &x;
    \n+
    258 }
    \n+
    259 const_pointer address(const_reference x) const
    \n+
    260 {
    \n+
    261 return &x;
    \n+
    262 }
    \n+
    263
    \n+
    265 pointer allocate(size_type n,
    \n+
    266 [[maybe_unused]] DebugAllocator<void>::const_pointer hint = 0)
    \n+
    267 {
    \n+
    268 return DebugMemory::alloc_man.allocate<T>(n);
    \n+
    269 }
    \n+
    270
    \n+
    272 void deallocate(pointer p, size_type n)
    \n+
    273 {
    \n+
    274 DebugMemory::alloc_man.deallocate<T>(p,n);
    \n+
    275 }
    \n+
    276
    \n+
    278 size_type max_size() const noexcept
    \n+
    279 {
    \n+
    280 return size_type(-1) / sizeof(T);
    \n+
    281 }
    \n+
    282
    \n+
    284 void construct(pointer p, const T& val)
    \n+
    285 {
    \n+
    286 ::new((void*)p)T(val);
    \n+
    287 }
    \n+
    288
    \n+
    290 template<typename ... Args>
    \n+
    291 void construct(pointer p, Args&&... args)
    \n+
    292 {
    \n+
    293 ::new((void *)p)T(std::forward<Args>(args) ...);
    \n+
    294 }
    \n+
    295
    \n+
    297 void destroy(pointer p)
    \n+
    298 {
    \n+
    299 p->~T();
    \n+
    300 }
    \n+
    301 };
    \n+
    302
    \n+
    304 template<class T>
    \n+
    305 constexpr bool
    \n+
    306 operator==(const DebugAllocator<T> &, const DebugAllocator<T> &)
    \n+
    307 {
    \n+
    308 return true;
    \n+
    309 }
    \n+
    310
    \n+
    312 template<class T>
    \n+
    313 constexpr bool
    \n+
    314 operator!=(const DebugAllocator<T> &, const DebugAllocator<T> &)
    \n+
    315 {
    \n+
    316 return false;
    \n+
    317 }
    \n+
    318}
    \n+
    319
    \n+
    320#ifdef DEBUG_NEW_DELETE
    \n+
    321void * operator new(size_t size)
    \n+
    322{
    \n+
    323 // try to allocate size bytes
    \n+
    324 void *p = Dune::DebugMemory::alloc_man.allocate<char>(size);
    \n+
    325#if DEBUG_NEW_DELETE > 2
    \n+
    326 std::cout << "NEW " << size
    \n+
    327 << " -> " << p
    \n+
    328 << std::endl;
    \n+
    329#endif
    \n+
    330 return p;
    \n+
    331}
    \n+
    332
    \n+
    333void operator delete(void * p) noexcept
    \n+
    334{
    \n+
    335#if DEBUG_NEW_DELETE > 2
    \n+
    336 std::cout << "FREE " << p << std::endl;
    \n+
    337#endif
    \n+
    338 Dune::DebugMemory::alloc_man.deallocate<char>(static_cast<char*>(p));
    \n+
    339}
    \n+
    340
    \n+
    341void operator delete(void * p, size_t size) noexcept
    \n+
    342{
    \n+
    343#if DEBUG_NEW_DELETE > 2
    \n+
    344 std::cout << "FREE " << p << std::endl;
    \n+
    345#endif
    \n+
    346 Dune::DebugMemory::alloc_man.deallocate<char>(static_cast<char*>(p), size);
    \n+
    347}
    \n+
    348
    \n+
    349#endif // DEBUG_NEW_DELETE
    \n+
    350
    \n+
    351#endif // __has_include(<sys/mman.h>)
    \n+
    352
    \n+
    353#endif // DUNE_DEBUG_ALLOCATOR_HH
    \n+
    Allocators that use malloc/free.
    \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:237
    \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:259
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    A simple stop watch.
    Definition timer.hh:43
    \n-
    void reset() noexcept
    Reset timer while keeping the running/stopped state.
    Definition timer.hh:57
    \n-
    double stop() noexcept
    Stop the timer and return elapsed().
    Definition timer.hh:100
    \n-
    Timer(bool startImmediately=true) noexcept
    A new timer, create and reset.
    Definition timer.hh:50
    \n-
    double elapsed() const noexcept
    Get elapsed user-time from last reset until now/last stop in seconds.
    Definition timer.hh:77
    \n-
    double lastElapsed() const noexcept
    Get elapsed user-time from last start until now/last stop in seconds.
    Definition timer.hh:88
    \n-
    void start() noexcept
    Start the timer and continue measurement if it is not running. Otherwise do nothing.
    Definition timer.hh:66
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,162 +1,353 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-timer.hh\n+debugallocator.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 (C) 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_TIMER_HH\n-6#define DUNE_TIMER_HH\n+5#ifndef DUNE_DEBUG_ALLOCATOR_HH\n+6#define DUNE_DEBUG_ALLOCATOR_HH\n 7\n-8#ifndef TIMER_USE_STD_CLOCK\n-9// headers for std::chrono\n-10#include \n-11#else\n-12// headers for std::clock\n-13#include \n-14#endif\n-15\n-16namespace _\bD_\bu_\bn_\be {\n-17\n-_\b4_\b2 class _\bT_\bi_\bm_\be_\br\n-43 {\n-44 public:\n+8#if __has_include()\n+9\n+10#include \n+11#define HAVE_SYS_MMAN_H 1\n+12#define HAVE_MPROTECT 1\n+13\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\n+23#include \"_\bm_\ba_\bl_\bl_\bo_\bc_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n+24\n+25namespace _\bD_\bu_\bn_\be\n+26{\n+27\n+28#ifndef DOXYGEN // hide implementation details from doxygen\n+29 namespace DebugMemory\n+30 {\n+31\n+32 extern const std::ptrdiff_t page_size;\n+33\n+34 struct AllocationManager\n+35 {\n+36 typedef std::size_t size_type;\n+37 typedef std::ptrdiff_t difference_type;\n+38 typedef void* pointer;\n+39\n+40 protected:\n+41 static void allocation_error(const char* msg);\n+42\n+43 struct AllocationInfo;\n+44 friend struct AllocationInfo;\n 45\n-_\b5_\b0 _\bT_\bi_\bm_\be_\br (bool startImmediately=true) noexcept\n-51 {\n-52 isRunning_ = startImmediately;\n-53 _\br_\be_\bs_\be_\bt();\n-54 }\n+46#define ALLOCATION_ASSERT(A) { if (!(A)) \\\n+47 { allocation_error(\"Assertion \" # A \" failed\");\\\n+48 }\\\n+49};\n+50\n+51 struct AllocationInfo\n+52 {\n+53 AllocationInfo(const std::type_info & t) : type(&t) {}\n+54 const std::type_info * type;\n 55\n-_\b5_\b7 void _\br_\be_\bs_\be_\bt() noexcept\n-58 {\n-59 sumElapsed_ = 0.0;\n-60 storedLastElapsed_ = 0.0;\n-61 rawReset();\n-62 }\n+56 pointer page_ptr;\n+57 pointer ptr;\n+58 size_type pages;\n+59 size_type capacity;\n+60 size_type size;\n+61 bool not_free;\n+62 };\n 63\n-64\n-_\b6_\b6 void _\bs_\bt_\ba_\br_\bt() noexcept\n-67 {\n-68 if (not (isRunning_))\n-69 {\n-70 rawReset();\n-71 isRunning_ = true;\n-72 }\n-73 }\n-74\n-75\n-_\b7_\b7 double _\be_\bl_\ba_\bp_\bs_\be_\bd () const noexcept\n-78 {\n-79 // if timer is running add the time elapsed since last start to sum\n-80 if (isRunning_)\n-81 return sumElapsed_ + _\bl_\ba_\bs_\bt_\bE_\bl_\ba_\bp_\bs_\be_\bd();\n-82\n-83 return sumElapsed_;\n-84 }\n-85\n-86\n-_\b8_\b8 double _\bl_\ba_\bs_\bt_\bE_\bl_\ba_\bp_\bs_\be_\bd () const noexcept\n-89 {\n-90 // if timer is running return the current value\n-91 if (isRunning_)\n-92 return rawElapsed();\n-93\n-94 // if timer is not running return stored value from last run\n-95 return storedLastElapsed_;\n-96 }\n+64 typedef MallocAllocator Alloc;\n+65 typedef std::vector AllocationList;\n+66 AllocationList allocation_list;\n+67\n+68 private:\n+69 void memprotect([[maybe_unused]] void* from,\n+70 [[maybe_unused]] difference_type len,\n+71 [[maybe_unused]] int prot)\n+72 {\n+73#if HAVE_SYS_MMAN_H && HAVE_MPROTECT\n+74 int result = mprotect(from, len, prot);\n+75 if (result == -1)\n+76 {\n+77\n+78 std::cerr << \"ERROR: (\" << result << \": \" << strerror(result) << \")\" <<\n+std::endl;\n+79 std::cerr << \" Failed to \";\n+80 if (prot == PROT_NONE)\n+81 std::cerr << \"protect \";\n+82 else\n+83 std::cerr << \"unprotect \";\n+84 std::cerr << \"memory range: \"\n+85 << from << \", \"\n+86 << static_cast(\n+87 static_cast(from) + len)\n+88 << std::endl;\n+89 abort();\n+90 }\n+91#else\n+92 std::cerr << \"WARNING: memory protection not available\" << std::endl;\n+93#endif\n+94 }\n+95\n+96 public:\n 97\n-98\n-_\b1_\b0_\b0 double _\bs_\bt_\bo_\bp() noexcept\n-101 {\n-102 if (isRunning_)\n+98 ~AllocationManager ()\n+99 {\n+100 AllocationList::iterator it;\n+101 bool error = false;\n+102 for (it=allocation_list.begin(); it!=allocation_list.end(); it++)\n 103 {\n-104 // update storedLastElapsed_ and sumElapsed_ and stop timer\n-105 storedLastElapsed_ = _\bl_\ba_\bs_\bt_\bE_\bl_\ba_\bp_\bs_\be_\bd();\n-106 sumElapsed_ += storedLastElapsed_;\n-107 isRunning_ = false;\n-108 }\n-109 return _\be_\bl_\ba_\bp_\bs_\be_\bd();\n-110 }\n-111\n-112\n-113 private:\n-114\n-115 bool isRunning_;\n-116 double sumElapsed_;\n-117 double storedLastElapsed_;\n-118\n-119\n-120#ifdef TIMER_USE_STD_CLOCK\n-121 void rawReset() noexcept\n-122 {\n-123 cstart = std::clock();\n-124 }\n-125\n-126 double rawElapsed () const noexcept\n-127 {\n-128 return (std::clock()-cstart) / static_cast(CLOCKS_PER_SEC);\n-129 }\n-130\n-131 std::clock_t cstart;\n-132#else\n-133 void rawReset() noexcept\n-134 {\n-135 cstart = std::chrono::high_resolution_clock::now();\n-136 }\n-137\n-138 double rawElapsed () const noexcept\n-139 {\n-140 std::chrono::high_resolution_clock::time_point now = std::chrono::\n-high_resolution_clock::now();\n-141 std::chrono::duration time_span = std::chrono::duration_cast >(now - cstart);\n-142 return time_span.count();\n-143 }\n-144\n-145 std::chrono::high_resolution_clock::time_point cstart;\n-146#endif\n-147 }; // end class Timer\n+104 if (it->not_free)\n+105 {\n+106 std::cerr << \"ERROR: found memory chunk still in use: \" <<\n+107 it->capacity << \" bytes at \" << it->ptr << std::endl;\n+108 error = true;\n+109 }\n+110 munmap(it->page_ptr, it->pages * page_size);\n+111 }\n+112 if (error)\n+113 allocation_error(\"lost allocations\");\n+114 }\n+115\n+116 template\n+117 T* allocate(size_type n)\n+118 {\n+119 // setup chunk info\n+120 AllocationInfo ai(typeid(T));\n+121 ai.size = n;\n+122 ai.capacity = n * sizeof(T);\n+123 ai.pages = (ai.capacity) / page_size + 2;\n+124 ai.not_free = true;\n+125 size_type overlap = ai.capacity % page_size;\n+126 ai.page_ptr = mmap(NULL, ai.pages * page_size,\n+127 PROT_READ | PROT_WRITE,\n+128#ifdef __APPLE__\n+129 MAP_ANON | MAP_PRIVATE,\n+130#else\n+131 MAP_ANONYMOUS | MAP_PRIVATE,\n+132#endif\n+133 -1, 0);\n+134 if (MAP_FAILED == ai.page_ptr)\n+135 {\n+136 throw std::bad_alloc();\n+137 }\n+138 ai.ptr = static_cast(ai.page_ptr) + page_size - overlap;\n+139 // write protect memory behind the actual data\n+140 memprotect(static_cast(ai.page_ptr) + (ai.pages-1) * page_size,\n+141 page_size,\n+142 PROT_NONE);\n+143 // remember the chunk\n+144 allocation_list.push_back(ai);\n+145 // return the ptr\n+146 return static_cast(ai.ptr);\n+147 }\n 148\n-151} // end namespace\n-152\n-153#endif\n+149 template\n+150 void deallocate(T* ptr, size_type n = 0) noexcept\n+151 {\n+152 // compute page address\n+153 void* page_ptr =\n+154 static_cast(\n+155 (char*)(ptr) - ((std::uintptr_t)(ptr) % page_size));\n+156 // search list\n+157 AllocationList::iterator it;\n+158 unsigned int i = 0;\n+159 for (it=allocation_list.begin(); it!=allocation_list.end(); it++, i++)\n+160 {\n+161 if (it->page_ptr == page_ptr)\n+162 {\n+163 // std::cout << \"found memory_block in allocation \" << i << std::endl;\n+164 // sanity checks\n+165 if (n != 0)\n+166 ALLOCATION_ASSERT(n == it->size);\n+167 ALLOCATION_ASSERT(ptr == it->ptr);\n+168 ALLOCATION_ASSERT(true == it->not_free);\n+169 ALLOCATION_ASSERT(typeid(T) == *(it->type));\n+170 // free memory\n+171 it->not_free = false;\n+172#if DEBUG_ALLOCATOR_KEEP\n+173 // write protect old memory\n+174 memprotect(it->page_ptr,\n+175 (it->pages) * page_size,\n+176 PROT_NONE);\n+177#else\n+178 // unprotect old memory\n+179 memprotect(it->page_ptr,\n+180 (it->pages) * page_size,\n+181 PROT_READ | PROT_WRITE);\n+182 munmap(it->page_ptr, it->pages * page_size);\n+183 // remove chunk info\n+184 allocation_list.erase(it);\n+185#endif\n+186 return;\n+187 }\n+188 }\n+189 allocation_error(\"memory block not found\");\n+190 }\n+191 };\n+192#undef ALLOCATION_ASSERT\n+193\n+194 extern AllocationManager alloc_man;\n+195 } // end namespace DebugMemory\n+196#endif // DOXYGEN\n+197\n+198 template\n+199 class DebugAllocator;\n+200\n+201 // specialize for void\n+202 template <>\n+203 class DebugAllocator {\n+204 public:\n+205 typedef void* pointer;\n+206 typedef const void* const_pointer;\n+207 // reference to void members are impossible.\n+208 typedef void value_type;\n+209 template struct rebind {\n+210 typedef DebugAllocator other;\n+211 };\n+212 };\n+213\n+214 // actual implementation\n+233 template \n+234 class DebugAllocator {\n+235 public:\n+236 typedef std::size_t size_type;\n+237 typedef std::ptrdiff_t difference_type;\n+238 typedef T* pointer;\n+239 typedef const T* const_pointer;\n+240 typedef T& reference;\n+241 typedef const T& const_reference;\n+242 typedef T value_type;\n+243 template struct rebind {\n+244 typedef DebugAllocator other;\n+245 };\n+246\n+248 DebugAllocator() noexcept {}\n+250 template \n+251 DebugAllocator(const DebugAllocator&) noexcept {}\n+253 ~DebugAllocator() noexcept {}\n+254\n+255 pointer address(reference x) const\n+256 {\n+257 return &x;\n+258 }\n+259 const_pointer address(const_reference x) const\n+260 {\n+261 return &x;\n+262 }\n+263\n+265 pointer allocate(size_type n,\n+266 [[maybe_unused]] DebugAllocator::const_pointer hint = 0)\n+267 {\n+268 return DebugMemory::alloc_man.allocate(n);\n+269 }\n+270\n+272 void deallocate(pointer p, size_type n)\n+273 {\n+274 DebugMemory::alloc_man.deallocate(p,n);\n+275 }\n+276\n+278 size_type max_size() const noexcept\n+279 {\n+280 return size_type(-1) / sizeof(T);\n+281 }\n+282\n+284 void construct(pointer p, const T& val)\n+285 {\n+286 ::new((void*)p)T(val);\n+287 }\n+288\n+290 template\n+291 void construct(pointer p, Args&&... args)\n+292 {\n+293 ::new((void *)p)T(std::forward(args) ...);\n+294 }\n+295\n+297 void destroy(pointer p)\n+298 {\n+299 p->~T();\n+300 }\n+301 };\n+302\n+304 template\n+305 constexpr bool\n+306 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const DebugAllocator &, const DebugAllocator &)\n+307 {\n+308 return true;\n+309 }\n+310\n+312 template\n+313 constexpr bool\n+314 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const DebugAllocator &, const DebugAllocator &)\n+315 {\n+316 return false;\n+317 }\n+318}\n+319\n+320#ifdef DEBUG_NEW_DELETE\n+321void * operator new(size_t size)\n+322{\n+323 // try to allocate size bytes\n+324 void *p = Dune::DebugMemory::alloc_man.allocate(size);\n+325#if DEBUG_NEW_DELETE > 2\n+326 std::cout << \"NEW \" << size\n+327 << \" -> \" << p\n+328 << std::endl;\n+329#endif\n+330 return p;\n+331}\n+332\n+333void operator delete(void * p) noexcept\n+334{\n+335#if DEBUG_NEW_DELETE > 2\n+336 std::cout << \"FREE \" << p << std::endl;\n+337#endif\n+338 Dune::DebugMemory::alloc_man.deallocate(static_cast(p));\n+339}\n+340\n+341void operator delete(void * p, size_t size) noexcept\n+342{\n+343#if DEBUG_NEW_DELETE > 2\n+344 std::cout << \"FREE \" << p << std::endl;\n+345#endif\n+346 Dune::DebugMemory::alloc_man.deallocate(static_cast(p), size);\n+347}\n+348\n+349#endif // DEBUG_NEW_DELETE\n+350\n+351#endif // __has_include()\n+352\n+353#endif // DUNE_DEBUG_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_\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:237\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:259\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_\bi_\bm_\be_\br\n-A simple stop watch.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn timer.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bi_\bm_\be_\br_\b:_\b:_\br_\be_\bs_\be_\bt\n-void reset() noexcept\n-Reset timer while keeping the running/stopped state.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn timer.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bi_\bm_\be_\br_\b:_\b:_\bs_\bt_\bo_\bp\n-double stop() noexcept\n-Stop the timer and return elapsed().\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn timer.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bi_\bm_\be_\br_\b:_\b:_\bT_\bi_\bm_\be_\br\n-Timer(bool startImmediately=true) noexcept\n-A new timer, create and reset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn timer.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bi_\bm_\be_\br_\b:_\b:_\be_\bl_\ba_\bp_\bs_\be_\bd\n-double elapsed() const noexcept\n-Get elapsed user-time from last reset until now/last stop in seconds.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn timer.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bi_\bm_\be_\br_\b:_\b:_\bl_\ba_\bs_\bt_\bE_\bl_\ba_\bp_\bs_\be_\bd\n-double lastElapsed() const noexcept\n-Get elapsed user-time from last start until now/last stop in seconds.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn timer.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bi_\bm_\be_\br_\b:_\b:_\bs_\bt_\ba_\br_\bt\n-void start() noexcept\n-Start the timer and continue measurement if it is not running. Otherwise do\n-nothing.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn timer.hh:66\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/a00329.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00329.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: bigunsignedint.hh File Reference\n+dune-common: stdthread.hh File Reference\n \n \n \n \n \n \n \n@@ -70,97 +70,64 @@\n
    \n \n
    \n
    \n
    \n \n-
    bigunsignedint.hh File Reference
    \n+
    stdthread.hh File Reference
    \n
    \n
    \n \n-

    Portable very large unsigned integers. \n-More...

    \n-
    #include <algorithm>
    \n-#include <iostream>
    \n-#include <limits>
    \n-#include <cstdint>
    \n-#include <cstdlib>
    \n-#include <type_traits>
    \n-#include <dune/common/exceptions.hh>
    \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-Classes

    class  Dune::bigunsignedint< k >
     Portable very large unsigned integers. More...
     
    struct  Dune::IsNumber< bigunsignedint< k > >
     Declare big unsigned int is a number. More...
     
    \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 Macros

    #define DUNE_BINOP(OP)
     
    #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-\n-\n-\n-\n-\n-\n-\n-\n-\n-\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<int k>
    std::ostream & Dune::operator<< (std::ostream &s, const bigunsignedint< k > &x)
     
    template<int k>
    bigunsignedint< k > Dune::operator+ (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator- (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator* (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator/ (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator% (const bigunsignedint< k > &x, std::uintmax_t y)
     
    template<int k>
    bigunsignedint< k > Dune::operator+ (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator- (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator* (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator/ (std::uintmax_t x, const bigunsignedint< k > &y)
     
    template<int k>
    bigunsignedint< k > Dune::operator% (std::uintmax_t x, const bigunsignedint< k > &y)
     
    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-

    Portable very large unsigned integers.

    \n-
    Author
    Peter Bastian
    \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,86 +1,36 @@\n dune-common\u00a02.9.0\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-bigunsignedint.hh File Reference\n-Portable very large unsigned integers. _\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/_\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/_\bh_\ba_\bs_\bh_\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- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\b _\bk_\b _\b>\n-\u00a0 Portable very large unsigned integers. _\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 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\b _\bk_\b _\b>_\b _\b>\n-\u00a0 Declare big unsigned int is a number. _\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 _\bs_\bt_\bd\n-\u00a0 STL namespace.\n-\u00a0\n M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(OP)\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-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 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n- > &x)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+ (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n- uintmax_t y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b- (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n- uintmax_t y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b* (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n- uintmax_t y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/ (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n- uintmax_t y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b% (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k > &x, std::\n- uintmax_t y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+ (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n- > &y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b- (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n- > &y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b* (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n- > &y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/ (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n- > &y)\n-\u00a0\n-template\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b% (std::uintmax_t x, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt< k\n- > &y)\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-Portable very large unsigned integers.\n- Author\n- Peter Bastian\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/a00329_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: bigunsignedint.hh Source File\n+dune-common: stdthread.hh Source File\n \n \n \n \n \n \n \n@@ -74,799 +74,54 @@\n \n
    \n \n
    \n
    \n
    \n-
    bigunsignedint.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 (C) 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_BIGUNSIGNEDINT_HH
    \n-
    7#define DUNE_BIGUNSIGNEDINT_HH
    \n+
    6#ifndef DUNE_COMMON_STDTHREAD_HH
    \n+
    7#define DUNE_COMMON_STDTHREAD_HH
    \n
    8
    \n-
    9#include <algorithm>
    \n-
    10#include <iostream>
    \n-
    11#include <limits>
    \n-
    12#include <cstdint>
    \n-
    13#include <cstdlib>
    \n-
    14#include <type_traits>
    \n-\n-
    16#include <dune/common/hash.hh>
    \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-
    24namespace Dune
    \n-
    25{
    \n-
    26#if HAVE_MPI
    \n-
    27 template<class K>
    \n-
    28 struct MPITraits;
    \n-
    29#endif
    \n-
    30
    \n-
    36 namespace Impl {
    \n-
    37
    \n-
    38 // numeric_limits_helper provides std::numeric_limits access to the internals
    \n-
    39 // of bigunsignedint. Previously, the correct specialization of std::numeric_limits
    \n-
    40 // was a friend of bigunsignedint, but that creates problems on recent versions
    \n-
    41 // of clang with the alternative libc++ library, because that library declares the
    \n-
    42 // base template of std::numeric_limits as a class and clang subsequently complains
    \n-
    43 // if the friend declaration uses 'struct'. Unfortunately, libstdc++ uses a struct,
    \n-
    44 // making it impossible to keep clang happy for both standard libraries.
    \n-
    45 // So we move the access helper functionality into a custom struct and simply let
    \n-
    46 // the numeric_limits specialization inherit from the helper.
    \n-
    47
    \n-
    48 template<typename T>
    \n-
    49 struct numeric_limits_helper
    \n-
    50 {
    \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+
    42
    \n+
    45
    \n+
    \n+
    49#define DUNE_ASSERT_CALL_ONCE() \\
    \n+
    50 ::Dune::assertCallOnce(__FILE__, __LINE__, __func__)
    \n+
    \n
    51
    \n-
    52 protected:
    \n+
    52} // namespace Dune
    \n
    53
    \n-
    54 static std::uint16_t& digit(T& big_unsigned_int, std::size_t i)
    \n-
    55 {
    \n-
    56 return big_unsigned_int.digit[i];
    \n-
    57 }
    \n-
    58
    \n-
    59 };
    \n-
    60
    \n-
    61 }
    \n-
    62
    \n-
    72 template<int k>
    \n-
    \n-\n-
    74 public:
    \n-
    75
    \n-
    76 // unsigned short is 16 bits wide, n is the number of digits needed
    \n-
    77 constexpr static int bits = std::numeric_limits<std::uint16_t>::digits;
    \n-
    78 constexpr static int n = k/bits+(k%bits!=0);
    \n-
    79 constexpr static int hexdigits = 4;
    \n-
    80 constexpr static int bitmask = 0xFFFF;
    \n-
    81 constexpr static int compbitmask = 0xFFFF0000;
    \n-
    82 constexpr static int overflowmask = 0x1;
    \n-
    83
    \n-\n-
    86
    \n-
    88 template<typename Signed>
    \n-
    89 bigunsignedint (Signed x, typename std::enable_if<std::is_integral<Signed>::value && std::is_signed<Signed>::value>::type* = 0);
    \n-
    90
    \n-
    92 bigunsignedint (std::uintmax_t x);
    \n-
    93
    \n-
    95 void print (std::ostream& s) const ;
    \n-
    96
    \n-\n-\n-
    100
    \n-\n-\n-
    104
    \n-\n-\n-
    108
    \n-\n-
    111
    \n-\n-\n-
    117
    \n-\n-\n-
    123
    \n-\n-\n-
    127
    \n-\n-\n-
    131
    \n-\n-\n-
    135
    \n-\n-
    138
    \n-
    139
    \n-
    141 bigunsignedint<k> operator<< (int i) const;
    \n-
    142
    \n-
    144 bigunsignedint<k> operator>> (int i) const;
    \n-
    145
    \n-
    146
    \n-
    148 bool operator< (const bigunsignedint<k>& x) const;
    \n-
    149
    \n-
    151 bool operator<= (const bigunsignedint<k>& x) const;
    \n-
    152
    \n-
    154 bool operator> (const bigunsignedint<k>& x) const;
    \n-
    155
    \n-
    157 bool operator>= (const bigunsignedint<k>& x) const;
    \n-
    158
    \n-
    160 bool operator== (const bigunsignedint<k>& x) const;
    \n-
    161
    \n-
    163 bool operator!= (const bigunsignedint<k>& x) const;
    \n-
    164
    \n-
    165
    \n-
    167 // operator unsigned int () const;
    \n-
    168 std::uint_least32_t touint() const;
    \n-
    174 double todouble() const;
    \n-
    175
    \n-
    176 friend class bigunsignedint<k/2>;
    \n-
    177 friend struct Impl::numeric_limits_helper< bigunsignedint<k> >;
    \n-
    178
    \n-
    \n-
    179 inline friend std::size_t hash_value(const bigunsignedint& arg)
    \n-
    180 {
    \n-
    181 return hash_range(arg.digit,arg.digit + arg.n);
    \n-
    182 }
    \n-
    \n-
    183
    \n-
    184 private:
    \n-
    185 std::uint16_t digit[n];
    \n-
    186#if HAVE_MPI
    \n-
    187 friend struct MPITraits<bigunsignedint<k> >;
    \n-
    188#endif
    \n-
    189 inline void assign(std::uintmax_t x);
    \n-
    190
    \n-
    191
    \n-
    192 } ;
    \n-
    \n-
    193
    \n-
    194 // Constructors
    \n-
    195 template<int k>
    \n-
    \n-\n-
    197 {
    \n-
    198 assign(0u);
    \n-
    199 }
    \n-
    \n-
    200
    \n-
    201 template<int k>
    \n-
    202 template<typename Signed>
    \n-
    \n-
    203 bigunsignedint<k>::bigunsignedint (Signed y, typename std::enable_if<std::is_integral<Signed>::value && std::is_signed<Signed>::value>::type*)
    \n-
    204 {
    \n-
    205 if (y < 0)
    \n-
    206 DUNE_THROW(Dune::Exception, "Trying to construct a Dune::bigunsignedint from a negative integer: " << y);
    \n-
    207 assign(y);
    \n-
    208 }
    \n-
    \n-
    209
    \n-
    210 template<int k>
    \n-
    \n-\n-
    212 {
    \n-
    213 assign(x);
    \n-
    214 }
    \n-
    \n-
    215 template<int k>
    \n-
    216 void bigunsignedint<k>::assign(std::uintmax_t x)
    \n-
    217 {
    \n-
    218 static const int no=std::min(static_cast<int>(n),
    \n-
    219 static_cast<int>(std::numeric_limits<std::uintmax_t>::digits/bits));
    \n-
    220
    \n-
    221 for(int i=0; i<no; ++i) {
    \n-
    222 digit[i] = (x&bitmask);
    \n-
    223 x=x>>bits;
    \n-
    224 }
    \n-
    225 for (unsigned int i=no; i<n; i++) digit[i]=0;
    \n-
    226 }
    \n-
    227
    \n-
    228 // export
    \n-
    229 template<int k>
    \n-
    \n-
    230 inline std::uint_least32_t bigunsignedint<k>::touint () const
    \n-
    231 {
    \n-
    232 return (digit[1]<<bits)+digit[0];
    \n-
    233 }
    \n-
    \n-
    234
    \n-
    235 template<int k>
    \n-
    \n-
    236 inline double bigunsignedint<k>::todouble() const
    \n-
    237 {
    \n-
    238 int firstInZeroRange=n;
    \n-
    239 for(int i=n-1; i>=0; --i)
    \n-
    240 if(digit[i]!=0)
    \n-
    241 break;
    \n-
    242 else
    \n-
    243 --firstInZeroRange;
    \n-
    244 int representableDigits=std::numeric_limits<double>::digits/bits;
    \n-
    245 int lastInRepresentableRange=0;
    \n-
    246 if(representableDigits<firstInZeroRange)
    \n-
    247 lastInRepresentableRange=firstInZeroRange-representableDigits;
    \n-
    248 double val=0;
    \n-
    249 for(int i=firstInZeroRange-1; i>=lastInRepresentableRange; --i)
    \n-
    250 val =val*(1<<bits)+digit[i];
    \n-
    251 return val*(1<<(bits*lastInRepresentableRange));
    \n-
    252 }
    \n-
    \n-
    253 // print
    \n-
    254 template<int k>
    \n-
    \n-
    255 inline void bigunsignedint<k>::print (std::ostream& s) const
    \n-
    256 {
    \n-
    257 bool leading=false;
    \n-
    258
    \n-
    259 // print from left to right
    \n-
    260 for (int i=n-1; i>=0; i--)
    \n-
    261 for (int d=hexdigits-1; d>=0; d--)
    \n-
    262 {
    \n-
    263 // extract one hex digit
    \n-
    264 int current = (digit[i]>>(d*4))&0xF;
    \n-
    265 if (current!=0)
    \n-
    266 {
    \n-
    267 // s.setf(std::ios::noshowbase);
    \n-
    268 s << std::hex << current;
    \n-
    269 leading = false;
    \n-
    270 }
    \n-
    271 else if (!leading) s << std::hex << current;
    \n-
    272 }
    \n-
    273 if (leading) s << "0";
    \n-
    274 s << std::dec;
    \n-
    275 }
    \n-
    \n-
    276
    \n-
    277 template <int k>
    \n-
    \n-
    278 inline std::ostream& operator<< (std::ostream& s, const bigunsignedint<k>& x)
    \n-
    279 {
    \n-
    280 x.print(s);
    \n-
    281 return s;
    \n-
    282 }
    \n-
    \n-
    283
    \n-
    \n-
    284 #define DUNE_BINOP(OP) \\
    \n-
    285 template <int k> \\
    \n-
    286 inline bigunsignedint<k> bigunsignedint<k>::operator OP (const bigunsignedint<k> &x) const \\
    \n-
    287 { \\
    \n-
    288 auto temp = *this; \\
    \n-
    289 temp OP##= x; \\
    \n-
    290 return temp; \\
    \n-
    291 }
    \n-
    \n-
    292
    \n-
    293 DUNE_BINOP(+)
    \n-
    294 DUNE_BINOP(-)
    \n-
    295 DUNE_BINOP(*)
    \n-
    296 DUNE_BINOP(/)
    \n-
    297 DUNE_BINOP(%)
    \n-
    298 DUNE_BINOP(&)
    \n-
    299 DUNE_BINOP(^)
    \n-
    300 DUNE_BINOP(|)
    \n-
    301
    \n-
    302 #undef DUNE_BINOP
    \n-
    303
    \n-
    304 template <int k>
    \n-
    \n-\n-
    306 {
    \n-
    307 std::uint_fast32_t overflow=0;
    \n-
    308
    \n-
    309 for (unsigned int i=0; i<n; i++)
    \n-
    310 {
    \n-
    311 std::uint_fast32_t sum = static_cast<std::uint_fast32_t>(digit[i]) + static_cast<std::uint_fast32_t>(x.digit[i]) + overflow;
    \n-
    312 digit[i] = sum&bitmask;
    \n-
    313 overflow = (sum>>bits)&overflowmask;
    \n-
    314 }
    \n-
    315 return *this;
    \n-
    316 }
    \n-
    \n-
    317
    \n-
    318 template <int k>
    \n-
    \n-\n-
    320 {
    \n-
    321 std::int_fast32_t overflow=0;
    \n-
    322
    \n-
    323 for (unsigned int i=0; i<n; i++)
    \n-
    324 {
    \n-
    325 std::int_fast32_t diff = static_cast<std::int_fast32_t>(digit[i]) - static_cast<std::int_fast32_t>(x.digit[i]) - overflow;
    \n-
    326 if (diff>=0)
    \n-
    327 {
    \n-
    328 digit[i] = static_cast<std::uint16_t>(diff);
    \n-
    329 overflow = 0;
    \n-
    330 }
    \n-
    331 else
    \n-
    332 {
    \n-
    333 digit[i] = static_cast<std::uint16_t>(diff+bitmask+1);
    \n-
    334 overflow = 1;
    \n-
    335 }
    \n-
    336 }
    \n-
    337 return *this;
    \n-
    338 }
    \n-
    \n-
    339
    \n-
    340 template <int k>
    \n-
    \n-\n-
    342 {
    \n-
    343 bigunsignedint<2*k> finalproduct(0);
    \n-
    344
    \n-
    345 for (unsigned int m=0; m<n; m++) // digit in right factor
    \n-
    346 {
    \n-
    347 bigunsignedint<2*k> singleproduct(0);
    \n-
    348 std::uint_fast32_t overflow(0);
    \n-
    349 for (unsigned int i=0; i<n; i++)
    \n-
    350 {
    \n-
    351 std::uint_fast32_t digitproduct = static_cast<std::uint_fast32_t>(digit[i])*static_cast<std::uint_fast32_t>(x.digit[m])+overflow;
    \n-
    352 singleproduct.digit[i+m] = static_cast<std::uint16_t>(digitproduct&bitmask);
    \n-
    353 overflow = (digitproduct>>bits)&bitmask;
    \n-
    354 }
    \n-
    355 finalproduct = finalproduct+singleproduct;
    \n-
    356 }
    \n-
    357
    \n-
    358 for (unsigned int i=0; i<n; i++) digit[i] = finalproduct.digit[i];
    \n-
    359 return *this;
    \n-
    360 }
    \n-
    \n-
    361
    \n-
    362 template <int k>
    \n-
    \n-\n-
    364 {
    \n-
    365 std::uint_fast32_t overflow=1;
    \n-
    366
    \n-
    367 for (unsigned int i=0; i<n; i++)
    \n-
    368 {
    \n-
    369 std::uint_fast32_t sum = static_cast<std::uint_fast32_t>(digit[i]) + overflow;
    \n-
    370 digit[i] = sum&bitmask;
    \n-
    371 overflow = (sum>>bits)&overflowmask;
    \n-
    372 }
    \n-
    373 return *this;
    \n-
    374 }
    \n-
    \n-
    375
    \n-
    376 template <int k>
    \n-
    \n-\n-
    378 {
    \n-
    379 if(x==0)
    \n-
    380 DUNE_THROW(Dune::MathError, "division by zero!");
    \n-
    381
    \n-
    382 // better slow than nothing
    \n-
    383 bigunsignedint<k> result(0);
    \n-
    384
    \n-
    385 while (*this>=x)
    \n-
    386 {
    \n-
    387 ++result;
    \n-
    388 *this -= x;
    \n-
    389 }
    \n-
    390
    \n-
    391 *this = result;
    \n-
    392 return *this;
    \n-
    393 }
    \n-
    \n-
    394
    \n-
    395 template <int k>
    \n-
    \n-\n-
    397 {
    \n-
    398 // better slow than nothing
    \n-
    399 while (*this>=x)
    \n-
    400 {
    \n-
    401 *this -= x;
    \n-
    402 }
    \n-
    403
    \n-
    404 return *this;
    \n-
    405 }
    \n-
    \n-
    406
    \n-
    407 template <int k>
    \n-
    \n-\n-
    409 {
    \n-
    410 for (unsigned int i=0; i<n; i++)
    \n-
    411 digit[i] = digit[i]&x.digit[i];
    \n-
    412 return *this;
    \n-
    413 }
    \n-
    \n-
    414
    \n-
    415 template <int k>
    \n-
    \n-\n-
    417 {
    \n-
    418 for (unsigned int i=0; i<n; i++)
    \n-
    419 digit[i] = digit[i]^x.digit[i];
    \n-
    420 return *this;
    \n-
    421 }
    \n-
    \n-
    422
    \n-
    423 template <int k>
    \n-
    \n-\n-
    425 {
    \n-
    426 for (unsigned int i=0; i<n; i++)
    \n-
    427 digit[i] = digit[i]|x.digit[i];
    \n-
    428 return *this;
    \n-
    429 }
    \n-
    \n-
    430
    \n-
    431 template <int k>
    \n-
    \n-\n-
    433 {
    \n-
    434 bigunsignedint<k> result;
    \n-
    435 for (unsigned int i=0; i<n; i++)
    \n-
    436 result.digit[i] = ~digit[i];
    \n-
    437 return result;
    \n-
    438 }
    \n-
    439
    \n-
    440 template <int k>
    \n-\n-
    442 {
    \n-
    443 bigunsignedint<k> result(0);
    \n-
    444
    \n-
    445 // multiples of bits
    \n-
    446 int j=shift/bits;
    \n-
    447 for (int i=n-1-j; i>=0; i--)
    \n-
    448 result.digit[i+j] = digit[i];
    \n-
    449
    \n-
    450 // remainder
    \n-
    451 j=shift%bits;
    \n-
    452 for (int i=n-1; i>=0; i--)
    \n-
    453 {
    \n-
    454 unsigned int temp = result.digit[i];
    \n-
    455 temp = temp<<j;
    \n-
    456 result.digit[i] = static_cast<std::uint16_t>(temp&bitmask);
    \n-
    457 temp = temp>>bits;
    \n-
    458 if (i+1<(int)n)
    \n-
    459 result.digit[i+1] = result.digit[i+1]|temp;
    \n-
    460 }
    \n-
    461
    \n-
    462 return result;
    \n-
    463 }
    \n-
    \n-
    464
    \n-
    465 template <int k>
    \n-
    \n-\n-
    467 {
    \n-
    468 bigunsignedint<k> result(0);
    \n-
    469
    \n-
    470 // multiples of bits
    \n-
    471 int j=shift/bits;
    \n-
    472 for (unsigned int i=0; i<n-j; i++)
    \n-
    473 result.digit[i] = digit[i+j];
    \n-
    474
    \n-
    475 // remainder
    \n-
    476 j=shift%bits;
    \n-
    477 for (unsigned int i=0; i<n; i++)
    \n-
    478 {
    \n-
    479 std::uint_fast32_t temp = result.digit[i];
    \n-
    480 temp = temp<<(bits-j);
    \n-
    481 result.digit[i] = static_cast<std::uint16_t>((temp&compbitmask)>>bits);
    \n-
    482 if (i>0)
    \n-
    483 result.digit[i-1] = result.digit[i-1] | (temp&bitmask);
    \n-
    484 }
    \n-
    485
    \n-
    486 return result;
    \n-
    487 }
    \n-
    \n-
    488
    \n-
    489 template <int k>
    \n-
    \n-\n-
    491 {
    \n-
    492 for (unsigned int i=0; i<n; i++)
    \n-
    493 if (digit[i]!=x.digit[i]) return true;
    \n-
    494 return false;
    \n-
    495 }
    \n-
    \n-
    496
    \n-
    497 template <int k>
    \n-
    \n-\n-
    499 {
    \n-
    500 return !((*this)!=x);
    \n-
    501 }
    \n-
    \n-
    502
    \n-
    503 template <int k>
    \n-
    \n-\n-
    505 {
    \n-
    506 for (int i=n-1; i>=0; i--)
    \n-
    507 if (digit[i]<x.digit[i]) return true;
    \n-
    508 else if (digit[i]>x.digit[i]) return false;
    \n-
    509 return false;
    \n-
    510 }
    \n-
    \n-
    511
    \n-
    512 template <int k>
    \n-
    \n-\n-
    514 {
    \n-
    515 for (int i=n-1; i>=0; i--)
    \n-
    516 if (digit[i]<x.digit[i]) return true;
    \n-
    517 else if (digit[i]>x.digit[i]) return false;
    \n-
    518 return true;
    \n-
    519 }
    \n-
    \n-
    520
    \n-
    521 template <int k>
    \n-
    \n-\n-
    523 {
    \n-
    524 return !((*this)<=x);
    \n-
    525 }
    \n-
    \n-
    526
    \n-
    527 template <int k>
    \n-
    \n-\n-
    529 {
    \n-
    530 return !((*this)<x);
    \n-
    531 }
    \n-
    \n-
    532
    \n-
    533
    \n-
    534 template <int k>
    \n-
    \n-
    535 inline bigunsignedint<k> operator+ (const bigunsignedint<k>& x, std::uintmax_t y)
    \n-
    536 {
    \n-
    537 bigunsignedint<k> temp(y);
    \n-
    538 return x+temp;
    \n-
    539 }
    \n-
    \n-
    540
    \n-
    541 template <int k>
    \n-
    \n-
    542 inline bigunsignedint<k> operator- (const bigunsignedint<k>& x, std::uintmax_t y)
    \n-
    543 {
    \n-
    544 bigunsignedint<k> temp(y);
    \n-
    545 return x-temp;
    \n-
    546 }
    \n-
    \n-
    547
    \n-
    548 template <int k>
    \n-
    \n-
    549 inline bigunsignedint<k> operator* (const bigunsignedint<k>& x, std::uintmax_t y)
    \n-
    550 {
    \n-
    551 bigunsignedint<k> temp(y);
    \n-
    552 return x*temp;
    \n-
    553 }
    \n-
    \n-
    554
    \n-
    555 template <int k>
    \n-
    \n-
    556 inline bigunsignedint<k> operator/ (const bigunsignedint<k>& x, std::uintmax_t y)
    \n-
    557 {
    \n-
    558 bigunsignedint<k> temp(y);
    \n-
    559 return x/temp;
    \n-
    560 }
    \n-
    \n-
    561
    \n-
    562 template <int k>
    \n-
    \n-
    563 inline bigunsignedint<k> operator% (const bigunsignedint<k>& x, std::uintmax_t y)
    \n-
    564 {
    \n-
    565 bigunsignedint<k> temp(y);
    \n-
    566 return x%temp;
    \n-
    567 }
    \n-
    \n-
    568
    \n-
    569 template <int k>
    \n-
    \n-
    570 inline bigunsignedint<k> operator+ (std::uintmax_t x, const bigunsignedint<k>& y)
    \n-
    571 {
    \n-
    572 bigunsignedint<k> temp(x);
    \n-
    573 return temp+y;
    \n-
    574 }
    \n-
    \n-
    575
    \n-
    576 template <int k>
    \n-
    \n-
    577 inline bigunsignedint<k> operator- (std::uintmax_t x, const bigunsignedint<k>& y)
    \n-
    578 {
    \n-
    579 bigunsignedint<k> temp(x);
    \n-
    580 return temp-y;
    \n-
    581 }
    \n-
    \n-
    582
    \n-
    583 template <int k>
    \n-
    \n-
    584 inline bigunsignedint<k> operator* (std::uintmax_t x, const bigunsignedint<k>& y)
    \n-
    585 {
    \n-
    586 bigunsignedint<k> temp(x);
    \n-
    587 return temp*y;
    \n-
    588 }
    \n-
    \n-
    589
    \n-
    590 template <int k>
    \n-
    \n-
    591 inline bigunsignedint<k> operator/ (std::uintmax_t x, const bigunsignedint<k>& y)
    \n-
    592 {
    \n-
    593 bigunsignedint<k> temp(x);
    \n-
    594 return temp/y;
    \n-
    595 }
    \n-
    \n-
    596
    \n-
    597 template <int k>
    \n-
    \n-
    598 inline bigunsignedint<k> operator% (std::uintmax_t x, const bigunsignedint<k>& y)
    \n-
    599 {
    \n-
    600 bigunsignedint<k> temp(x);
    \n-
    601 return temp%y;
    \n-
    602 }
    \n-
    \n-
    603
    \n-
    604 // Forward declare type-trait for numbers
    \n-
    605 template<class T> struct IsNumber;
    \n-
    606
    \n-
    608 template <int k>
    \n-
    609 struct IsNumber<bigunsignedint<k>> : public std::true_type {};
    \n-
    610
    \n-
    612}
    \n-
    613
    \n-
    614namespace std
    \n-
    615{
    \n-
    616 template<int k>
    \n-
    617 struct numeric_limits<Dune::bigunsignedint<k> >
    \n-
    618 : private Dune::Impl::numeric_limits_helper<Dune::bigunsignedint<k> > // for access to internal state of bigunsignedint
    \n-
    619 {
    \n-
    620 public:
    \n-
    621 static const bool is_specialized = true;
    \n-
    622
    \n-
    623 static Dune::bigunsignedint<k> min()
    \n-
    624 {
    \n-
    625 return static_cast<Dune::bigunsignedint<k> >(0);
    \n-
    626 }
    \n-
    627
    \n-\n-
    629 {
    \n-\n-
    631 for(std::size_t i=0; i < Dune::bigunsignedint<k>::n; ++i)
    \n-
    632 // access internal state via the helper base class
    \n-
    633 Dune::Impl::numeric_limits_helper<Dune::bigunsignedint<k> >::
    \n-
    634 digit(max_,i)=std::numeric_limits<std::uint16_t>::max();
    \n-
    635 return max_;
    \n-
    636 }
    \n-
    637
    \n-
    638
    \n-
    639 static const int digits = Dune::bigunsignedint<k>::bits *
    \n-\n-
    641 static const bool is_signed = false;
    \n-
    642 static const bool is_integer = true;
    \n-
    643 static const bool is_exact = true;
    \n-
    644 static const int radix = 2;
    \n-
    645
    \n-
    646 static Dune::bigunsignedint<k> epsilon()
    \n-
    647 {
    \n-
    648 return static_cast<Dune::bigunsignedint<k> >(0);
    \n-
    649 }
    \n-
    650
    \n-
    651 static Dune::bigunsignedint<k> round_error()
    \n-
    652 {
    \n-
    653 return static_cast<Dune::bigunsignedint<k> >(0);
    \n-
    654 }
    \n-
    655
    \n-
    656 static const int min_exponent = 0;
    \n-
    657 static const int min_exponent10 = 0;
    \n-
    658 static const int max_exponent = 0;
    \n-
    659 static const int max_exponent10 = 0;
    \n-
    660
    \n-
    661 static const bool has_infinity = false;
    \n-
    662 static const bool has_quiet_NaN = false;
    \n-
    663 static const bool has_signaling_NaN = false;
    \n-
    664
    \n-
    665 static const float_denorm_style has_denorm = denorm_absent;
    \n-
    666 static const bool has_denorm_loss = false;
    \n-
    667
    \n-
    668 static Dune::bigunsignedint<k> infinity() noexcept
    \n-
    669 {
    \n-
    670 return static_cast<Dune::bigunsignedint<k> >(0);
    \n-
    671 }
    \n-
    672
    \n-
    673 static Dune::bigunsignedint<k> quiet_NaN() noexcept
    \n-
    674 {
    \n-
    675 return static_cast<Dune::bigunsignedint<k> >(0);
    \n-
    676 }
    \n-
    677
    \n-
    678 static Dune::bigunsignedint<k> signaling_NaN() noexcept
    \n-
    679 {
    \n-
    680 return static_cast<Dune::bigunsignedint<k> >(0);
    \n-
    681 }
    \n-
    682
    \n-
    683 static Dune::bigunsignedint<k> denorm_min() noexcept
    \n-
    684 {
    \n-
    685 return static_cast<Dune::bigunsignedint<k> >(0);
    \n-
    686 }
    \n-
    687
    \n-
    688 static const bool is_iec559 = false;
    \n-
    689 static const bool is_bounded = true;
    \n-
    690 static const bool is_modulo = true;
    \n-
    691
    \n-
    692 static const bool traps = false;
    \n-
    693 static const bool tinyness_before = false;
    \n-
    694 static const float_round_style round_style = round_toward_zero;
    \n-
    695
    \n-
    696 };
    \n-
    697
    \n-
    698}
    \n-
    699
    \n-\n-
    701
    \n-
    702#endif
    \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-
    A few common exception classes.
    \n-
    bigunsignedint< k > & operator/=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:377
    \n-
    bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:549
    \n-
    bigunsignedint< k > operator<<(int i) const
    left shift
    Definition bigunsignedint.hh:441
    \n-
    bigunsignedint< k > & operator+=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:305
    \n-
    bigunsignedint< k > & operator^=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:416
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n-
    bool operator<=(const bigunsignedint< k > &x) const
    less than or equal
    Definition bigunsignedint.hh:513
    \n-
    void print(std::ostream &s) const
    Print number in hex notation.
    Definition bigunsignedint.hh:255
    \n-
    bool operator<(const bigunsignedint< k > &x) const
    less than
    Definition bigunsignedint.hh:504
    \n-
    bigunsignedint< k > operator/(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:556
    \n-
    bool operator==(const bigunsignedint< k > &x) const
    equal
    Definition bigunsignedint.hh:498
    \n-
    bool operator!=(const bigunsignedint< k > &x) const
    not equal
    Definition bigunsignedint.hh:490
    \n-
    bigunsignedint()
    Construct uninitialized.
    Definition bigunsignedint.hh:196
    \n-
    bigunsignedint< k > & operator&=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:408
    \n-
    bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:542
    \n-
    bool operator>=(const bigunsignedint< k > &x) const
    greater or equal
    Definition bigunsignedint.hh:528
    \n-
    bigunsignedint< k > operator>>(int i) const
    right shift
    Definition bigunsignedint.hh:466
    \n-
    bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:535
    \n-
    bigunsignedint< k > operator~() const
    bitwise complement
    Definition bigunsignedint.hh:432
    \n-
    bigunsignedint< k > & operator++()
    prefix increment
    Definition bigunsignedint.hh:363
    \n-
    bigunsignedint< k > & operator|=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:424
    \n-
    bigunsignedint< k > operator%(const bigunsignedint< k > &x, std::uintmax_t y)
    Definition bigunsignedint.hh:563
    \n-
    bigunsignedint< k > & operator%=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:396
    \n-
    double todouble() const
    Convert to a double.
    Definition bigunsignedint.hh:236
    \n-
    bigunsignedint< k > & operator-=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:319
    \n-
    bool operator>(const bigunsignedint< k > &x) const
    greater than
    Definition bigunsignedint.hh:522
    \n-
    bigunsignedint< k > & operator*=(const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:341
    \n-
    std::uint_least32_t touint() const
    export to other types
    Definition bigunsignedint.hh:230
    \n-
    #define DUNE_BINOP(OP)
    Definition bigunsignedint.hh:284
    \n-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n-
    STL namespace.
    \n+
    54#endif // DUNE_COMMON_STDTHREAD_HH
    \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 assign(T &dst, const T &src, bool mask)
    masked Simd assignment (scalar version)
    Definition simd.hh:447
    \n-
    auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:425
    \n-
    A traits class describing the mapping of types onto MPI_Datatypes.
    Definition mpitraits.hh:41
    \n-
    Portable very large unsigned integers.
    Definition bigunsignedint.hh:73
    \n-
    static constexpr int overflowmask
    Definition bigunsignedint.hh:82
    \n-
    bigunsignedint< k > operator|(const bigunsignedint< k > &x) const
    bitwise or
    \n-
    static constexpr int hexdigits
    Definition bigunsignedint.hh:79
    \n-
    bigunsignedint< k > operator^(const bigunsignedint< k > &x) const
    bitwise exor
    \n-
    bigunsignedint< k > operator*(const bigunsignedint< k > &x) const
    multiply
    \n-
    bigunsignedint< k > operator%(const bigunsignedint< k > &x) const
    \n-
    static constexpr int n
    Definition bigunsignedint.hh:78
    \n-
    bigunsignedint< k > operator-(const bigunsignedint< k > &x) const
    subtract
    \n-
    static constexpr int compbitmask
    Definition bigunsignedint.hh:81
    \n-
    bigunsignedint< k > operator&(const bigunsignedint< k > &x) const
    bitwise and
    \n-
    static constexpr int bits
    Definition bigunsignedint.hh:77
    \n-
    bigunsignedint< k > operator/(const bigunsignedint< k > &x) const
    \n-
    bigunsignedint< k > operator+(const bigunsignedint< k > &x) const
    add
    \n-
    friend std::size_t hash_value(const bigunsignedint &arg)
    Definition bigunsignedint.hh:179
    \n-
    static constexpr int bitmask
    Definition bigunsignedint.hh:80
    \n-
    Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
    Definition typetraits.hh:194
    \n-
    Base class for Dune-Exceptions.
    Definition exceptions.hh:96
    \n-
    Default exception class for mathematical errors.
    Definition exceptions.hh:241
    \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:42
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,897 +1,52 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-bigunsignedint.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 (C) 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_BIGUNSIGNEDINT_HH\n-7#define DUNE_BIGUNSIGNEDINT_HH\n+6#ifndef DUNE_COMMON_STDTHREAD_HH\n+7#define DUNE_COMMON_STDTHREAD_HH\n 8\n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \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/_\bh_\ba_\bs_\bh_\b._\bh_\bh>\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-24namespace _\bD_\bu_\bn_\be\n-25{\n-26#if HAVE_MPI\n-27 template\n-28 struct MPITraits;\n-29#endif\n-30\n-36 namespace Impl {\n-37\n-38 // numeric_limits_helper provides std::numeric_limits access to the\n-internals\n-39 // of bigunsignedint. Previously, the correct specialization of std::\n-numeric_limits\n-40 // was a friend of bigunsignedint, but that creates problems on recent\n-versions\n-41 // of clang with the alternative libc++ library, because that library\n-declares the\n-42 // base template of std::numeric_limits as a class and clang subsequently\n-complains\n-43 // if the friend declaration uses 'struct'. Unfortunately, libstdc++ uses a\n-struct,\n-44 // making it impossible to keep clang happy for both standard libraries.\n-45 // So we move the access helper functionality into a custom struct and\n-simply let\n-46 // the numeric_limits specialization inherit from the helper.\n-47\n-48 template\n-49 struct numeric_limits_helper\n-50 {\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+45\n+_\b4_\b9#define DUNE_ASSERT_CALL_ONCE() \\\n+50 ::Dune::assertCallOnce(__FILE__, __LINE__, __func__)\n 51\n-52 protected:\n+52} // namespace Dune\n 53\n-54 static std::uint16_t& digit(T& big_unsigned_int, std::size_t i)\n-55 {\n-56 return big_unsigned_int.digit[i];\n-57 }\n-58\n-59 };\n-60\n-61 }\n-62\n-72 template\n-_\b7_\b3 class _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt {\n-74 public:\n-75\n-76 // unsigned short is 16 bits wide, n is the number of digits needed\n-_\b7_\b7 constexpr static int _\bb_\bi_\bt_\bs = std::numeric_limits::digits;\n-_\b7_\b8 constexpr static int _\bn = k/_\bb_\bi_\bt_\bs+(k%_\bb_\bi_\bt_\bs!=0);\n-_\b7_\b9 constexpr static int _\bh_\be_\bx_\bd_\bi_\bg_\bi_\bt_\bs = 4;\n-_\b8_\b0 constexpr static int _\bb_\bi_\bt_\bm_\ba_\bs_\bk = 0xFFFF;\n-_\b8_\b1 constexpr static int _\bc_\bo_\bm_\bp_\bb_\bi_\bt_\bm_\ba_\bs_\bk = 0xFFFF0000;\n-_\b8_\b2 constexpr static int _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\bm_\ba_\bs_\bk = 0x1;\n-83\n-85 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt ();\n-86\n-88 template\n-89 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (Signed x, typename std::enable_if::\n-value && std::is_signed::value>::type* = 0);\n-90\n-92 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (std::uintmax_t x);\n-93\n-95 void _\bp_\br_\bi_\bn_\bt (std::ostream& s) const ;\n-96\n-_\b9_\b8 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-99 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-100\n-_\b1_\b0_\b2 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-103 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-104\n-_\b1_\b0_\b6 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-107 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-108\n-110 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+_\b ();\n-111\n-_\b1_\b1_\b5 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-116 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-117\n-_\b1_\b2_\b1 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-122 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-123\n-_\b1_\b2_\b5 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-126 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-127\n-_\b1_\b2_\b9 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-130 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-131\n-_\b1_\b3_\b3 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-134 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x);\n-135\n-137 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~_\b () const;\n-138\n-139\n-141 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (int i) const;\n-142\n-144 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>_\b (int i) const;\n-145\n-146\n-148 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-149\n-151 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-152\n-154 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-155\n-157 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-158\n-160 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-161\n-163 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const;\n-164\n-165\n-167 // operator unsigned int () const;\n-168 std::uint_least32_t _\bt_\bo_\bu_\bi_\bn_\bt() const;\n-_\b1_\b7_\b4 double _\bt_\bo_\bd_\bo_\bu_\bb_\bl_\be() const;\n-175\n-176 friend class _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt;\n-177 friend struct Impl::numeric_limits_helper< _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt >;\n-178\n-_\b1_\b7_\b9 inline friend std::size_t _\bh_\ba_\bs_\bh_\b__\bv_\ba_\bl_\bu_\be(const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt& arg)\n-180 {\n-181 return _\bh_\ba_\bs_\bh_\b__\br_\ba_\bn_\bg_\be(arg.digit,arg.digit + arg._\bn);\n-182 }\n-183\n-184 private:\n-_\b1_\b8_\b5 std::uint16_t digit[_\bn];\n-186#if HAVE_MPI\n-187 friend struct _\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs<_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt >;\n-188#endif\n-189 inline void assign(std::uintmax_t x);\n-190\n-191\n-192 } ;\n-193\n-194 // Constructors\n-195 template\n-_\b1_\b9_\b6 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt ()\n-197 {\n-198 _\ba_\bs_\bs_\bi_\bg_\bn(0u);\n-199 }\n-200\n-201 template\n-202 template\n-_\b2_\b0_\b3 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (Signed y, typename std::enable_if::value && std::is_signed::value>::type*)\n-204 {\n-205 if (y < 0)\n-206 _\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, \"Trying to construct a Dune::bigunsignedint\n-from a negative integer: \" << y);\n-207 _\ba_\bs_\bs_\bi_\bg_\bn(y);\n-208 }\n-209\n-210 template\n-_\b2_\b1_\b1 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt (std::uintmax_t x)\n-212 {\n-213 _\ba_\bs_\bs_\bi_\bg_\bn(x);\n-214 }\n-215 template\n-216 void _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn(std::uintmax_t x)\n-217 {\n-218 static const int no=std::min(static_cast(n),\n-219 static_cast(std::numeric_limits::digits/bits));\n-220\n-221 for(int i=0; i>bits;\n-224 }\n-225 for (unsigned int i=no; i\n-_\b2_\b3_\b0 inline std::uint_least32_t _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bt_\bo_\bu_\bi_\bn_\bt () const\n-231 {\n-232 return (digit[1]<\n-_\b2_\b3_\b6 inline double _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bt_\bo_\bd_\bo_\bu_\bb_\bl_\be() const\n-237 {\n-238 int firstInZeroRange=n;\n-239 for(int i=n-1; i>=0; --i)\n-240 if(digit[i]!=0)\n-241 break;\n-242 else\n-243 --firstInZeroRange;\n-244 int representableDigits=std::numeric_limits::digits/bits;\n-245 int lastInRepresentableRange=0;\n-246 if(representableDigits=lastInRepresentableRange; --i)\n-250 val =val*(1<\n-_\b2_\b5_\b5 inline void _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt (std::ostream& s) const\n-256 {\n-257 bool leading=false;\n-258\n-259 // print from left to right\n-260 for (int i=n-1; i>=0; i--)\n-261 for (int d=hexdigits-1; d>=0; d--)\n-262 {\n-263 // extract one hex digit\n-264 int current = (digit[i]>>(d*4))&0xF;\n-265 if (current!=0)\n-266 {\n-267 // s.setf(std::ios::noshowbase);\n-268 s << std::hex << current;\n-269 leading = false;\n-270 }\n-271 else if (!leading) s << std::hex << current;\n-272 }\n-273 if (leading) s << \"0\";\n-274 s << std::dec;\n-275 }\n-276\n-277 template \n-_\b2_\b7_\b8 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>&\n-x)\n-279 {\n-280 x._\bp_\br_\bi_\bn_\bt(s);\n-281 return s;\n-282 }\n-283\n-_\b2_\b8_\b4 #define DUNE_BINOP(OP) \\\n-285 template \\\n-286 inline bigunsignedint bigunsignedint::operator OP (const\n-bigunsignedint &x) const \\\n-287 { \\\n-288 auto temp = *this; \\\n-289 temp OP##= x; \\\n-290 return temp; \\\n-291 }\n-292\n-293 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(+)\n-294 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(-)\n-295 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(*)\n-296 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(/)\n-297 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(%)\n-298 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(&)\n-299 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(^)\n-300 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP(|)\n-301\n-302 #undef DUNE_BINOP\n-303\n-304 template \n-_\b3_\b0_\b5 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-306 {\n-307 std::uint_fast32_t overflow=0;\n-308\n-309 for (unsigned int i=0; i(digit[i]) +\n-static_cast(x.digit[i]) + overflow;\n-312 digit[i] = sum&bitmask;\n-313 overflow = (sum>>bits)&overflowmask;\n-314 }\n-315 return *this;\n-316 }\n-317\n-318 template \n-_\b3_\b1_\b9 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-320 {\n-321 std::int_fast32_t overflow=0;\n-322\n-323 for (unsigned int i=0; i(digit[i]) -\n-static_cast(x.digit[i]) - overflow;\n-326 if (diff>=0)\n-327 {\n-328 digit[i] = static_cast(diff);\n-329 overflow = 0;\n-330 }\n-331 else\n-332 {\n-333 digit[i] = static_cast(diff+bitmask+1);\n-334 overflow = 1;\n-335 }\n-336 }\n-337 return *this;\n-338 }\n-339\n-340 template \n-_\b3_\b4_\b1 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-342 {\n-343 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\b2_\b*_\bk_\b> finalproduct(0);\n-344\n-345 for (unsigned int m=0; m singleproduct(0);\n-348 std::uint_fast32_t overflow(0);\n-349 for (unsigned int i=0; i(digit\n-[i])*static_cast(x.digit[m])+overflow;\n-352 singleproduct.digit[i+m] = static_cast\n-(digitproduct&bitmask);\n-353 overflow = (digitproduct>>bits)&bitmask;\n-354 }\n-355 finalproduct = finalproduct+singleproduct;\n-356 }\n-357\n-358 for (unsigned int i=0; i\n-_\b3_\b6_\b3 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+_\b ()\n-364 {\n-365 std::uint_fast32_t overflow=1;\n-366\n-367 for (unsigned int i=0; i(digit[i]) +\n-overflow;\n-370 digit[i] = sum&bitmask;\n-371 overflow = (sum>>bits)&overflowmask;\n-372 }\n-373 return *this;\n-374 }\n-375\n-376 template \n-_\b3_\b7_\b7 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-378 {\n-379 if(x==0)\n-380 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bE_\br_\br_\bo_\br, \"division by zero!\");\n-381\n-382 // better slow than nothing\n-383 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result(0);\n-384\n-385 while (*this>=x)\n-386 {\n-387 ++result;\n-388 *this -= x;\n-389 }\n-390\n-391 *this = result;\n-392 return *this;\n-393 }\n-394\n-395 template \n-_\b3_\b9_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-397 {\n-398 // better slow than nothing\n-399 while (*this>=x)\n-400 {\n-401 *this -= x;\n-402 }\n-403\n-404 return *this;\n-405 }\n-406\n-407 template \n-_\b4_\b0_\b8 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-409 {\n-410 for (unsigned int i=0; i\n-_\b4_\b1_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-417 {\n-418 for (unsigned int i=0; i\n-_\b4_\b2_\b4 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=_\b (const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-425 {\n-426 for (unsigned int i=0; i\n-_\b4_\b3_\b2 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~_\b () const\n-433 {\n-434 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result;\n-435 for (unsigned int i=0; i\n-441 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (int shift) const\n-442 {\n-443 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result(0);\n-444\n-445 // multiples of bits\n-446 int j=shift/bits;\n-447 for (int i=n-1-j; i>=0; i--)\n-448 result.digit[i+j] = digit[i];\n-449\n-450 // remainder\n-451 j=shift%bits;\n-452 for (int i=n-1; i>=0; i--)\n-453 {\n-454 unsigned int temp = result.digit[i];\n-455 temp = temp<(temp&bitmask);\n-457 temp = temp>>bits;\n-458 if (i+1<(int)n)\n-459 result.digit[i+1] = result.digit[i+1]|temp;\n-460 }\n-461\n-462 return result;\n-463 }\n-464\n-465 template \n-_\b4_\b6_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>_\b (int shift) const\n-467 {\n-468 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> result(0);\n-469\n-470 // multiples of bits\n-471 int j=shift/bits;\n-472 for (unsigned int i=0; i((temp&compbitmask)>>bits);\n-482 if (i>0)\n-483 result.digit[i-1] = result.digit[i-1] | (temp&bitmask);\n-484 }\n-485\n-486 return result;\n-487 }\n-488\n-489 template \n-_\b4_\b9_\b0 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-const\n-491 {\n-492 for (unsigned int i=0; i\n-_\b4_\b9_\b8 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-const\n-499 {\n-500 return !((*this)!=x);\n-501 }\n-502\n-503 template \n-_\b5_\b0_\b4 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const\n-505 {\n-506 for (int i=n-1; i>=0; i--)\n-507 if (digit[i]x.digit[i]) return false;\n-509 return false;\n-510 }\n-511\n-512 template \n-_\b5_\b1_\b3 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-const\n-514 {\n-515 for (int i=n-1; i>=0; i--)\n-516 if (digit[i]x.digit[i]) return false;\n-518 return true;\n-519 }\n-520\n-521 template \n-_\b5_\b2_\b2 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x) const\n-523 {\n-524 return !((*this)<=x);\n-525 }\n-526\n-527 template \n-_\b5_\b2_\b8 inline bool _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x)\n-const\n-529 {\n-530 return !((*this)\n-_\b5_\b3_\b5 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n-uintmax_t y)\n-536 {\n-537 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n-538 return x+temp;\n-539 }\n-540\n-541 template \n-_\b5_\b4_\b2 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n-uintmax_t y)\n-543 {\n-544 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n-545 return x-temp;\n-546 }\n-547\n-548 template \n-_\b5_\b4_\b9 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n-uintmax_t y)\n-550 {\n-551 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n-552 return x*temp;\n-553 }\n-554\n-555 template \n-_\b5_\b5_\b6 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n-uintmax_t y)\n-557 {\n-558 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n-559 return x/temp;\n-560 }\n-561\n-562 template \n-_\b5_\b6_\b3 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b (const _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& x, std::\n-uintmax_t y)\n-564 {\n-565 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(y);\n-566 return x%temp;\n-567 }\n-568\n-569 template \n-_\b5_\b7_\b0 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b (std::uintmax_t x, const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n-571 {\n-572 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n-573 return temp+y;\n-574 }\n-575\n-576 template \n-_\b5_\b7_\b7 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b (std::uintmax_t x, const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n-578 {\n-579 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n-580 return temp-y;\n-581 }\n-582\n-583 template \n-_\b5_\b8_\b4 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (std::uintmax_t x, const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n-585 {\n-586 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n-587 return temp*y;\n-588 }\n-589\n-590 template \n-_\b5_\b9_\b1 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b (std::uintmax_t x, const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n-592 {\n-593 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n-594 return temp/y;\n-595 }\n-596\n-597 template \n-_\b5_\b9_\b8 inline _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b (std::uintmax_t x, const\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>& y)\n-599 {\n-600 _\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> temp(x);\n-601 return temp%y;\n-602 }\n-603\n-604 // Forward declare type-trait for numbers\n-605 template struct IsNumber;\n-606\n-608 template \n-_\b6_\b0_\b9 struct _\bI_\bs_\bN_\bu_\bm_\bb_\be_\br<_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt> : public std::true_type {};\n-610\n-612}\n-613\n-614namespace _\bs_\bt_\bd\n-615{\n-616 template\n-617 struct numeric_limits<_\bD_\bu_\bn_\be::bigunsignedint >\n-618 : private Dune::Impl::numeric_limits_helper > /\n-/ for access to internal state of bigunsignedint\n-619 {\n-620 public:\n-621 static const bool is_specialized = true;\n-622\n-623 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> min()\n-624 {\n-625 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n-626 }\n-627\n-628 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> _\bm_\ba_\bx()\n-629 {\n-630 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> max_;\n-631 for(std::size_t i=0; i < Dune::bigunsignedint::n; ++i)\n-632 // access internal state via the helper base class\n-633 Dune::Impl::numeric_limits_helper<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >::\n-634 digit(max_,i)=_\bs_\bt_\bd::numeric_limits<_\bs_\bt_\bd::uint16_t>::_\bm_\ba_\bx();\n-635 return max_;\n-636 }\n-637\n-638\n-639 static const int digits = _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bb_\bi_\bt_\bs *\n-640 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>_\b:_\b:_\bn;\n-641 static const bool is_signed = false;\n-642 static const bool is_integer = true;\n-643 static const bool is_exact = true;\n-644 static const int radix = 2;\n-645\n-646 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> epsilon()\n-647 {\n-648 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n-649 }\n-650\n-651 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> round_error()\n-652 {\n-653 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n-654 }\n-655\n-656 static const int min_exponent = 0;\n-657 static const int min_exponent10 = 0;\n-658 static const int max_exponent = 0;\n-659 static const int max_exponent10 = 0;\n-660\n-661 static const bool has_infinity = false;\n-662 static const bool has_quiet_NaN = false;\n-663 static const bool has_signaling_NaN = false;\n-664\n-665 static const float_denorm_style has_denorm = denorm_absent;\n-666 static const bool has_denorm_loss = false;\n-667\n-668 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> infinity() noexcept\n-669 {\n-670 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n-671 }\n-672\n-673 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> quiet_NaN() noexcept\n-674 {\n-675 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n-676 }\n-677\n-678 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> signaling_NaN() noexcept\n-679 {\n-680 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n-681 }\n-682\n-683 static _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> denorm_min() noexcept\n-684 {\n-685 return static_cast<_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b> >(0);\n-686 }\n-687\n-688 static const bool is_iec559 = false;\n-689 static const bool is_bounded = true;\n-690 static const bool is_modulo = true;\n-691\n-692 static const bool traps = false;\n-693 static const bool tinyness_before = false;\n-694 static const float_round_style round_style = round_toward_zero;\n-695\n-696 };\n-697\n-698}\n-699\n-700_\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(int k),_\bD_\bU_\bN_\bE_\b__\bH_\bA_\bS_\bH_\b__\bT_\bY_\bP_\bE(_\bD_\bu_\bn_\be_\b:_\b:\n-_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b<_\bk_\b>))\n-701\n-702#endif\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-_\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-bigunsignedint< k > & operator/=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:377\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-bigunsignedint< k > operator<<(int i) const\n-left shift\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:441\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-bigunsignedint< k > & operator+=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:305\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^_\b=\n-bigunsignedint< k > & operator^=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:416\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=\n-bool operator<=(const bigunsignedint< k > &x) const\n-less than or equal\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:513\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-void print(std::ostream &s) const\n-Print number in hex notation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:255\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n-bool operator<(const bigunsignedint< k > &x) const\n-less than\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:504\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:556\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const bigunsignedint< k > &x) const\n-equal\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:498\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const bigunsignedint< k > &x) const\n-not equal\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:490\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt\n-bigunsignedint()\n-Construct uninitialized.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:196\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&_\b=\n-bigunsignedint< k > & operator&=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:408\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=\n-bool operator>=(const bigunsignedint< k > &x) const\n-greater or equal\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:528\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n-bigunsignedint< k > operator>>(int i) const\n-right shift\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:466\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~\n-bigunsignedint< k > operator~() const\n-bitwise complement\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:432\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-bigunsignedint< k > & operator++()\n-prefix increment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:363\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|_\b=\n-bigunsignedint< k > & operator|=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:424\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:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%_\b=\n-bigunsignedint< k > & operator%=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:396\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bt_\bo_\bd_\bo_\bu_\bb_\bl_\be\n-double todouble() const\n-Convert to a double.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:236\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-bigunsignedint< k > & operator-=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:319\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>\n-bool operator>(const bigunsignedint< k > &x) const\n-greater than\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:522\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-bigunsignedint< k > & operator*=(const bigunsignedint< k > &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:341\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bt_\bo_\bu_\bi_\bn_\bt\n-std::uint_least32_t touint() const\n-export to other types\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:230\n-_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bO_\bP\n-#define DUNE_BINOP(OP)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:284\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+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:_\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:_\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:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\ba_\bx\n-auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n-&b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:425\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt\n-Portable very large unsigned integers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\bm_\ba_\bs_\bk\n-static constexpr int overflowmask\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b|\n-bigunsignedint< k > operator|(const bigunsignedint< k > &x) const\n-bitwise or\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bh_\be_\bx_\bd_\bi_\bg_\bi_\bt_\bs\n-static constexpr int hexdigits\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b^\n-bigunsignedint< k > operator^(const bigunsignedint< k > &x) const\n-bitwise exor\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-bigunsignedint< k > operator*(const bigunsignedint< k > &x) const\n-multiply\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b%\n-bigunsignedint< k > operator%(const bigunsignedint< k > &x) const\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:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n-bigunsignedint< k > operator-(const bigunsignedint< k > &x) const\n-subtract\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bc_\bo_\bm_\bp_\bb_\bi_\bt_\bm_\ba_\bs_\bk\n-static constexpr int compbitmask\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b&\n-bigunsignedint< k > operator&(const bigunsignedint< k > &x) const\n-bitwise and\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bb_\bi_\bt_\bs\n-static constexpr int bits\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/\n-bigunsignedint< k > operator/(const bigunsignedint< k > &x) const\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n-bigunsignedint< k > operator+(const bigunsignedint< k > &x) const\n-add\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bh_\ba_\bs_\bh_\b__\bv_\ba_\bl_\bu_\be\n-friend std::size_t hash_value(const bigunsignedint &arg)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:179\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bg_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\bi_\bn_\bt_\b:_\b:_\bb_\bi_\bt_\bm_\ba_\bs_\bk\n-static constexpr int bitmask\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bigunsignedint.hh:80\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:_\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-_\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:_\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:42\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/a00332.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00332.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: dynmatrixev.hh File Reference\n+dune-common: tupleutility.hh File Reference\n \n \n \n \n \n \n \n@@ -70,46 +70,118 @@\n
    \n \n
    \n
    \n
    \n \n-
    dynmatrixev.hh File Reference
    \n+
    tupleutility.hh File Reference
    \n
    \n
    \n \n-

    utility functions to compute eigenvalues for dense matrices. \n+

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

    \n-
    #include <algorithm>
    \n-#include <memory>
    \n-#include "dynmatrix.hh"
    \n-#include "fmatrixev.hh"
    \n+
    #include <cstddef>
    \n+#include <tuple>
    \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 Namespaces

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

    \n Functions

    template<typename K , class C >
    static void Dune::DynamicMatrixHelp::eigenValuesNonSym (const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)
     calculates the eigenvalues of a symmetric field matrix
     
    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...)))
     
    \n

    Detailed Description

    \n-

    utility functions to compute eigenvalues for dense matrices.

    \n+

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

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,31 +1,108 @@\n dune-common\u00a02.9.0\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-dynmatrixev.hh File Reference\n-utility functions to compute eigenvalues for dense matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \"_\bd_\by_\bn_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\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+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+#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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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+\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_\by_\bn_\ba_\bm_\bi_\bc_\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_\by_\bn_\ba_\bm_\bi_\bc_\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 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx< K\n- > &matrix, _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br< C > &eigenValues, std::vector<\n- _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br< K > > *eigenVectors=nullptr)\n-\u00a0 calculates the eigenvalues of a symmetric field matrix\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 \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 functions to compute eigenvalues for dense matrices.\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/a00332_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: dynmatrixev.hh Source File\n+dune-common: tupleutility.hh Source File\n \n \n \n \n \n \n \n@@ -74,123 +74,447 @@\n \n
    \n \n
    \n
    \n
    \n-
    dynmatrixev.hh
    \n+
    tupleutility.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 (C) 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_DYNMATRIXEIGENVALUES_HH
    \n-
    6#define DUNE_DYNMATRIXEIGENVALUES_HH
    \n-
    7
    \n-
    8#include <algorithm>
    \n-
    9#include <memory>
    \n-
    10
    \n-
    11#include "dynmatrix.hh"
    \n-
    12#include "fmatrixev.hh"
    \n+
    5
    \n+
    6#ifndef DUNE_TUPLE_UTILITY_HH
    \n+
    7#define DUNE_TUPLE_UTILITY_HH
    \n+
    8
    \n+
    9#include <cstddef>
    \n+
    10#include <tuple>
    \n+
    11#include <type_traits>
    \n+
    12#include <utility>
    \n
    13
    \n-
    22namespace Dune {
    \n-
    23
    \n-
    \n-
    24 namespace DynamicMatrixHelp {
    \n-
    25
    \n-
    26#if HAVE_LAPACK
    \n-
    27 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall;
    \n-
    28#endif
    \n-
    29
    \n-
    38 template <typename K, class C>
    \n-
    \n-
    39 static void eigenValuesNonSym(const DynamicMatrix<K>& matrix,
    \n-
    40 DynamicVector<C>& eigenValues,
    \n-
    41 std::vector<DynamicVector<K>>* eigenVectors = nullptr
    \n-
    42 )
    \n-
    43 {
    \n-
    44
    \n-
    45#if HAVE_LAPACK
    \n-
    46 {
    \n-
    47 const long int N = matrix.rows();
    \n-
    48 const char jobvl = 'n';
    \n-
    49 const char jobvr = eigenVectors ? 'v' : 'n';
    \n-
    50
    \n-
    51
    \n-
    52 // matrix to put into dgeev
    \n-
    53 auto matrixVector = std::make_unique<double[]>(N*N);
    \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 // copy matrix
    \n-
    56 int row = 0;
    \n-
    57 for(int i=0; i<N; ++i)
    \n-
    58 {
    \n-
    59 for(int j=0; j<N; ++j, ++row)
    \n-
    60 {
    \n-
    61 matrixVector[ row ] = matrix[ i ][ j ];
    \n-
    62 }
    \n-
    63 }
    \n-
    64
    \n-
    65 // working memory
    \n-
    66 auto eigenR = std::make_unique<double[]>(N);
    \n-
    67 auto eigenI = std::make_unique<double[]>(N);
    \n-
    68
    \n-
    69 const long int lwork = eigenVectors ? 4*N : 3*N;
    \n-
    70 auto work = std::make_unique<double[]>(lwork);
    \n-
    71 auto vr = eigenVectors ? std::make_unique<double[]>(N*N) : std::unique_ptr<double[]>{};
    \n-
    72
    \n-
    73 // return value information
    \n-
    74 long int info = 0;
    \n-
    75
    \n-
    76 // call LAPACK routine (see fmatrixev_ext.cc)
    \n-
    77 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N,
    \n-
    78 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(),
    \n-
    79 &lwork, &info);
    \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+
    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
    80
    \n-
    81 if( info != 0 )
    \n-
    82 {
    \n-
    83 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
    \n-
    84 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
    \n-
    85 }
    \n-
    86
    \n-
    87 eigenValues.resize(N);
    \n-
    88 for (int i=0; i<N; ++i)
    \n-
    89 eigenValues[i] = std::complex<double>(eigenR[i], eigenI[i]);
    \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-
    91 if (eigenVectors) {
    \n-
    92 eigenVectors->resize(N);
    \n-
    93 for (int i = 0; i < N; ++i) {
    \n-
    94 auto& v = (*eigenVectors)[i];
    \n-
    95 v.resize(N);
    \n-
    96 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]);
    \n-
    97 }
    \n-
    98 }
    \n-
    99 }
    \n-
    100#else // #if HAVE_LAPACK
    \n-
    101 DUNE_THROW(NotImplemented,"LAPACK not found!");
    \n-
    102#endif
    \n-
    103 }
    \n-
    \n-
    104 }
    \n-
    \n-
    105
    \n-
    106}
    \n-
    108#endif
    \n-
    This file implements a dense matrix with dynamic numbers of rows and columns.
    \n-
    Eigenvalue computations for the FieldMatrix class.
    \n-
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \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+\n+
    Traits for type conversions and type information.
    \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:268
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    static void eigenValuesNonSym(const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)
    calculates the eigenvalues of a symmetric field matrix
    Definition dynmatrixev.hh:39
    \n-
    constexpr size_type rows() const
    number of rows
    Definition densematrix.hh:709
    \n-
    Construct a matrix with a dynamic size.
    Definition dynmatrix.hh:61
    \n-
    Construct a vector with a dynamic size.
    Definition dynvector.hh:59
    \n-
    void resize(size_type n, value_type c=value_type())
    Definition dynvector.hh:141
    \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+
    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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,140 +1,515 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-dynmatrixev.hh\n+tupleutility.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 (C) 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_DYNMATRIXEIGENVALUES_HH\n-6#define DUNE_DYNMATRIXEIGENVALUES_HH\n-7\n-8#include \n-9#include \n-10\n-11#include \"_\bd_\by_\bn_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-12#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\"\n+5\n+6#ifndef DUNE_TUPLE_UTILITY_HH\n+7#define DUNE_TUPLE_UTILITY_HH\n+8\n+9#include \n+10#include \n+11#include \n+12#include \n 13\n-22namespace _\bD_\bu_\bn_\be {\n-23\n-_\b2_\b4 namespace DynamicMatrixHelp {\n-25\n-26#if HAVE_LAPACK\n-27 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall;\n-28#endif\n-29\n-38 template \n-_\b3_\b9 static void _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bN_\bo_\bn_\bS_\by_\bm(const _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b>& matrix,\n-40 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bC_\b>& eigenValues,\n-41 std::vector<_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b>>* eigenVectors = nullptr\n-42 )\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\n-45#if HAVE_LAPACK\n-46 {\n-47 const long int N = matrix._\br_\bo_\bw_\bs();\n-48 const char jobvl = 'n';\n-49 const char jobvr = eigenVectors ? 'v' : 'n';\n-50\n-51\n-52 // matrix to put into dgeev\n-53 auto matrixVector = std::make_unique(N*N);\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 // copy matrix\n-56 int row = 0;\n-57 for(int i=0; i(N);\n-67 auto eigenI = std::make_unique(N);\n-68\n-69 const long int lwork = eigenVectors ? 4*N : 3*N;\n-70 auto work = std::make_unique(lwork);\n-71 auto vr = eigenVectors ? std::make_unique(N*N) : std::\n-unique_ptr{};\n-72\n-73 // return value information\n-74 long int info = 0;\n-75\n-76 // call LAPACK routine (see fmatrixev_ext.cc)\n-77 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N,\n-78 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(),\n-79 &lwork, &info);\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+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 80\n-81 if( info != 0 )\n-82 {\n-83 std::cerr << \"For matrix \" << matrix << \" eigenvalue calculation failed! \"\n-<< std::endl;\n-84 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn,\"eigenValues: Eigenvalue calculation\n-failed!\");\n-85 }\n-86\n-87 eigenValues._\br_\be_\bs_\bi_\bz_\be(N);\n-88 for (int i=0; i(eigenR[i], eigenI[i]);\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-91 if (eigenVectors) {\n-92 eigenVectors->_\br_\be_\bs_\bi_\bz_\be(N);\n-93 for (int i = 0; i < N; ++i) {\n-94 auto& v = (*eigenVectors)[i];\n-95 v.resize(N);\n-96 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]);\n-97 }\n-98 }\n-99 }\n-100#else // #if HAVE_LAPACK\n-101 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bN_\bo_\bt_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\be_\bd,\"LAPACK not found!\");\n-102#endif\n-103 }\n-104 }\n-105\n-106}\n-108#endif\n-_\bd_\by_\bn_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-This file implements a dense matrix with dynamic numbers of rows and columns.\n-_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\n-Eigenvalue computations for the FieldMatrix class.\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+115 template
    240 <\n+00004910: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00004960: 3235 333c 2f73 7061 6e3e 2020 2020 3c73 253 template<cla\n+000049b0: 7373 203c 2f73 7061 6e3e 492c 203c 7370 ss I, class \n+000049e0: 542c 203c 6120 636c 6173 733d 2263 6f64 T, CmpStyle\n+00004a40: 3c2f 613e 2063 7374 796c 6520 3c73 7061 cstyle /*= defaultCmp\n+00004a70: 5374 796c 652a 2f3c 2f73 7061 6e3e 2c20 Style*/, \n+00004a80: 3c61 2063 6c61 7373 3d22 636f 6465 2068 RoundingSty\n+00004ae0: 6c65 3c2f 613e 2072 7374 796c 6520 3c73 le rstyle /*= defaultR\n+00004b10: 6f75 6e64 696e 6753 7479 6c65 2a2f 3c2f oundingStyle*/>
    .\n+00004b30: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+00004b60: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 254 I roun\n+00004be0: 643c 2f61 3e28 3c73 7061 6e20 636c 6173 d(cons\n+00004c00: 743c 2f73 7061 6e3e 2054 2026 616d 703b t T &\n+00004c10: 7661 6c2c 203c 7370 616e 2063 6c61 7373 val, typen\n+00004c30: 616d 653c 2f73 7061 6e3e 203c 6120 636c ame Epsil\n+00004c90: 6f6e 5479 7065 266c 743b 5426 6774 3b3a onType<T>:\n+00004ca0: 3a54 7970 653c 2f61 3e20 6570 7369 6c6f :Type epsilo\n+00004cb0: 6e20 3d20 3c61 2063 6c61 7373 3d22 636f n = DefaultEpsilon&\n+00004cf0: 6c74 3b54 2c20 6373 7479 6c65 2667 743b lt;T, cstyle>\n+00004d00: 3a3a 7661 6c75 653c 2f61 3e28 2929 3b3c ::value());<\n+00004d10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00004d60: 3235 353c 2f73 7061 6e3e 2020 2020 3c73 255 // truncatio\n+00004d90: 6e3c 2f73 7061 6e3e 3c2f 6469 763e 0a3c n
    .<\n+00004da0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00004db0: 3e3c 6120 6964 3d22 6c30 3032 3537 2220 > 257
    .
    270 \n+00004e50: 2020 203c 7370 616e 2063 6c61 7373 3d22 templat\n+00004e70: 653c 2f73 7061 6e3e 266c 743b 3c73 7061 e<class I\n+00004ea0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , class T, Cmp\n+00004f20: 5374 796c 653c 2f61 3e20 6373 7479 6c65 Style cstyle\n+00004f30: 203c 7370 616e 2063 6c61 7373 3d22 636f /*= defau\n+00004f50: 6c74 436d 7053 7479 6c65 2a2f 3c2f 7370 ltCmpStyle*/, Roundi\n+00004fc0: 6e67 5374 796c 653c 2f61 3e20 7273 7479 ngStyle rsty\n+00004fd0: 6c65 203c 7370 616e 2063 6c61 7373 3d22 le /*= def\n+00004ff0: 6175 6c74 526f 756e 6469 6e67 5374 796c aultRoundingStyl\n+00005000: 652a 2f3c 2f73 7061 6e3e 2667 743b 3c2f e*/>.
    2\n+00005060: 3731 3c2f 7370 616e 3e20 2020 2049 203c 71 I <\n+00005070: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00005080: 5f66 756e 6374 696f 6e22 2068 7265 663d _function\" href=\n+00005090: 2261 3030 3430 392e 6874 6d6c 2367 6137 \"a00409.html#ga7\n+000050a0: 3865 6166 3836 6232 3132 3336 6635 6335 8eaf86b21236f5c5\n+000050b0: 3533 3336 3732 3465 3931 3164 6130 3822 5336724e911da08\"\n+000050c0: 3e74 7275 6e63 3c2f 613e 283c 7370 616e >trunc(const T \n+000050f0: 2661 6d70 3b76 616c 2c20 3c73 7061 6e20 &val, \n+00005110: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n+00005120: 3c61 2063 6c61 7373 3d22 636f 6465 2068 \n+00005170: 4570 7369 6c6f 6e54 7970 6526 6c74 3b54 EpsilonType<T\n+00005180: 2667 743b 3a3a 5479 7065 3c2f 613e 2065 >::Type e\n+00005190: 7073 696c 6f6e 203d 203c 6120 636c 6173 psilon = DefaultEps\n+000051d0: 696c 6f6e 266c 743b 542c 2063 7374 796c ilon<T, cstyl\n+000051e0: 6526 6774 3b3a 3a76 616c 7565 3c2f 613e e>::value\n+000051f0: 2829 293b 3c2f 6469 763e 0a3c 6469 7620 ());
    .
    272 \n+00005250: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n+000052a0: 2032 3734 3c2f 7370 616e 3e20 2020 203c 274 <\n+000052b0: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class=\"comm\n+000052c0: 656e 7422 3e2f 2f20 6772 6f75 7020 466c ent\">// group Fl\n+000052d0: 6f61 7443 6d70 3c2f 7370 616e 3e3c 2f64 oatCmp.
    27\n+00005330: 353c 2f73 7061 6e3e 2020 7d20 3c73 7061 5 } //namespace Fl\n+00005360: 6f61 7443 6d70 3c2f 7370 616e 3e3c 2f64 oatCmp.
    27\n+000053c0: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
    .\n+000053d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00005460: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00005470: 6e6f 223e 2020 3237 383c 2f73 7061 6e3e no\"> 278\n+00005480: 2020 3c73 7061 6e20 636c 6173 733d 2263 // oo in\n+000054a0: 7465 7266 6163 653c 2f73 7061 6e3e 3c2f terface.
    2\n+00005500: 3830 3c2f 7370 616e 3e20 3c2f 6469 763e 80
    \n+00005510: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n+00005540: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 286 tem\n+00005580: 706c 6174 653c 2f73 7061 6e3e 266c 743b plate<\n+00005590: 3c73 7061 6e20 636c 6173 733d 226b 6579 class T, Float\n+00005610: 436d 703a 3a43 6d70 5374 796c 653c 2f61 Cmp::CmpStyle cstyle_ = FloatCmp::defau\n+000056b0: 6c74 436d 7053 7479 6c65 3c2f 613e 2c3c ltCmpStyle,<\n 000056c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>...
    129 <\n-00005a60: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>..<\n-00005c00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00005c10: 3e3c 6120 6964 3d22 6c30 3031 3331 2220 > 13\n-00005c90: 313c 2f61 3e3c 2f73 7061 6e3e 2020 2020 1 \n-00005ca0: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef typen\n-00005ce0: 616d 653c 2f73 7061 6e3e 203c 6120 636c ame Base::con\n-00005d20: 7374 5f72 6f77 5f72 6566 6572 656e 6365 st_row_reference\n-00005d30: 3c2f 613e 203c 6120 636c 6173 733d 2263 const_row_r\n-00005d90: 6566 6572 656e 6365 3c2f 613e 3b3c 2f64 eference;.
    13\n-00005df0: 323c 2f73 7061 6e3e 203c 2f64 6976 3e0a 2
    .\n-00005e00: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-00005e90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-00005ec0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 1\n-00005f20: 3336 3c2f 613e 3c2f 7370 616e 3e20 2020 36 \n-00005f30: 203c 7370 616e 2063 6c61 7373 3d22 6b65 constexpr\n-00005f50: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 FieldMa\n-00005fb0: 7472 6978 3c2f 613e 2829 203d 203c 7370 trix() = default;
    .<\n-00006000: 6120 6964 3d22 6c30 3031 3337 2220 6e61 a id=\"l00137\" na\n-00006010: 6d65 3d22 6c30 3031 3337 223e 3c2f 613e me=\"l00137\">\n-00006020: 3c73 7061 6e20 636c 6173 733d 226c 696e 137
    .
    .<\n-00006090: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-000060a0: 3e3c 6120 6964 3d22 6c30 3031 3430 2220 > 14\n-00006120: 303c 2f61 3e3c 2f73 7061 6e3e 2020 2020 0 \n-00006130: 3c61 2063 6c61 7373 3d22 636f 6465 2068 FieldMatrix\n-00006190: 2873 7464 3a3a 696e 6974 6961 6c69 7a65 (std::initialize\n-000061a0: 725f 6c69 7374 266c 743b 3c61 2063 6c61 r_list<Dune::Fiel\n-000061e0: 6456 6563 746f 7226 6c74 3b4b 2c20 636f dVector<K, co\n-000061f0: 6c73 2667 743b 3c2f 613e 2026 6774 3b20 ls> > \n-00006200: 3c73 7061 6e20 636c 6173 733d 226b 6579 const &l) {.
    141\n-00006280: 3c2f 7370 616e 3e20 2020 2020 2061 7373 ass\n-00006290: 6572 7428 6c2e 7369 7a65 2829 203d 3d20 ert(l.size() == \n-000062a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 rows); // Actually, t\n-00006320: 6869 7320 6973 206e 6f74 206e 6565 6465 his is not neede\n-00006330: 6420 616e 7920 6d6f 7265 213c 2f73 7061 d any more!
    .
    142 \n-000063a0: 2020 2073 7464 3a3a 636f 7079 5f6e 286c std::copy_n(l\n-000063b0: 2e62 6567 696e 2829 2c20 7374 643a 3a6d .begin(), std::m\n-000063c0: 696e 283c 7370 616e 2063 6c61 7373 3d22 in(static_\n-000063e0: 6361 7374 266c 743b 3c2f 7370 616e 3e73 cast<s\n-000063f0: 7464 3a3a 7369 7a65 5f74 3c73 7061 6e20 td::size_t\n-00006410: 2667 743b 3c2f 7370 616e 3e28 524f 5753 >(ROWS\n-00006420: 292c 3c2f 6469 763e 0a3c 6469 7620 636c ),
    .
    143 \n-00006480: 2020 2020 2020 2020 2020 2020 2020 2020 \n-00006490: 2020 2020 2020 2020 2020 2020 2020 2020 \n-000064a0: 2020 206c 2e73 697a 6528 2929 2c3c 2f64 l.size()),.
    14\n-00006500: 343c 2f73 7061 6e3e 2020 2020 2020 2020 4 \n-00006510: 2020 2020 2020 2020 205f 6461 7461 2e62 _data.b\n-00006520: 6567 696e 2829 293b 3c2f 6469 763e 0a3c egin());
    .<\n-00006530: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00006540: 3e3c 6120 6964 3d22 6c30 3031 3435 2220 > 145 }
    .<\n-00006590: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-000065e0: 3134 363c 2f73 7061 6e3e 203c 2f64 6976 146 .
    147<\n-00006640: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-00006660: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n-00006670: 266c 743b 3c73 7061 6e20 636c 6173 733d <class \n-00006690: 3c2f 7370 616e 3e54 2c3c 2f64 6976 3e0a T,
    .\n-000066a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-00006780: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
    .
    149 FieldMat\n-000068c0: 7269 783c 2f61 3e28 5420 3c73 7061 6e20 rix(T \n-000068e0: 636f 6e73 743c 2f73 7061 6e3e 2661 6d70 const&\n-000068f0: 3b20 7268 7329 3c2f 6469 763e 0a3c 6469 ; rhs)
    .<\n-00006910: 6120 6964 3d22 6c30 3031 3530 2220 6e61 a id=\"l00150\" na\n-00006920: 6d65 3d22 6c30 3031 3530 223e 3c2f 613e me=\"l00150\">\n-00006930: 3c73 7061 6e20 636c 6173 733d 226c 696e 150 {
    .<\n-00006970: 6120 6964 3d22 6c30 3031 3531 2220 6e61 a id=\"l00151\" na\n-00006980: 6d65 3d22 6c30 3031 3531 223e 3c2f 613e me=\"l00151\">\n-00006990: 3c73 7061 6e20 636c 6173 733d 226c 696e 151 *th\n-000069d0: 6973 3c2f 7370 616e 3e20 3d20 7268 733b is = rhs;\n-000069e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00006a30: 2031 3532 3c2f 7370 616e 3e20 2020 207d 152 }\n-00006a40: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n-00006a60: 3c61 2069 643d 226c 3030 3135 3322 206e 153
    .
    154 \n-00006b00: 2020 3c73 7061 6e20 636c 6173 733d 226b using Base::opera\n-00006b30: 746f 723d 3b3c 2f64 6976 3e0a 3c64 6976 tor=;
    .<\n-00006b70: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00006b80: 6e6f 223e 2020 3135 353c 2f73 7061 6e3e no\"> 155\n-00006b90: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-00006be0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 157 FieldMatrix\n-00006c70: 3c2f 613e 2661 6d70 3b20 3c61 2063 6c61 & opera\n-00006cd0: 746f 723d 3c2f 613e 283c 7370 616e 2063 tor=(c\n-00006cf0: 6f6e 7374 3c2f 7370 616e 3e20 3c61 2063 onst FieldMat\n-00006d30: 7269 783c 2f61 3e26 616d 703b 2920 3d20 rix&) = \n-00006d40: 3c73 7061 6e20 636c 6173 733d 226b 6579 defaul\n-00006d60: 743c 2f73 7061 6e3e 3b3c 2f64 6976 3e0a t;
    .\n-00006d70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-00006e00: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00006e10: 6e6f 223e 2020 3136 303c 2f73 7061 6e3e no\"> 160\n-00006e20: 2020 2020 3c73 7061 6e20 636c 6173 733d templa\n-00006e40: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<typename T>
    .<\n-00006e80: 6469 7620 636c 6173 733d 2266 6f6c 646f div class=\"foldo\n-00006e90: 7065 6e22 2069 643d 2266 6f6c 646f 7065 pen\" id=\"foldope\n-00006ea0: 6e30 3031 3631 2220 6461 7461 2d73 7461 n00161\" data-sta\n-00006eb0: 7274 3d22 7b22 2064 6174 612d 656e 643d rt=\"{\" data-end=\n-00006ec0: 227d 223e 0a3c 6469 7620 636c 6173 733d \"}\">..
    \n-000070d0: 2020 3136 323c 2f73 7061 6e3e 2020 2020 162 \n-000070e0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n-00007130: 2020 3136 333c 2f73 7061 6e3e 2020 2020 163 \n-00007140: 2020 5f64 6174 6120 3d20 782e 5f64 6174 _data = x._dat\n-00007150: 613b 3c2f 6469 763e 0a3c 6469 7620 636c a;
    .
    164 \n-000071b0: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n-000071d0: 7572 6e3c 2f73 7061 6e3e 202a 3c73 7061 urn *this;.
    1\n-00007250: 3635 3c2f 7370 616e 3e20 2020 207d 3c2f 65 }.
    .<\n-000072a0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-000072b0: 6e6f 223e 2020 3136 363c 2f73 7061 6e3e no\"> 166\n-000072c0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-00007310: 2020 3136 383c 2f73 7061 6e3e 2020 2020 168 \n-00007320: 3c73 7061 6e20 636c 6173 733d 226b 6579 template <\n-00007360: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n-00007370: 542c 203c 7370 616e 2063 6c61 7373 3d22 T, int\n-00007390: 3c2f 7370 616e 3e20 726f 7773 2c20 3c73 rows, int cols>..
    \n-00007600: 2020 3137 303c 2f73 7061 6e3e 203c 2f64 170 .
    ..
    \n-00007820: 2031 3733 3c2f 7370 616e 3e3c 7370 616e 173 {.
    17\n-000078a0: 343c 2f73 7061 6e3e 2020 2020 2020 3c61 4 Dune::\n-000078e0: 4669 656c 644d 6174 7269 7826 6c74 3b4b FieldMatrix<K\n-000078f0: 2c20 434f 4c53 2c20 524f 5753 2667 743b , COLS, ROWS>\n-00007900: 3c2f 613e 2041 543b 3c2f 6469 763e 0a3c AT;
    .<\n-00007910: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00007920: 3e3c 6120 6964 3d22 6c30 3031 3735 2220 > 175 for( <\n-00007990: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-000079a0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype\">int i = 0; i <\n-000079c0: 3b20 524f 5753 3b20 2b2b 6920 293c 2f64 ; ROWS; ++i ).
    17\n-00007a20: 363c 2f73 7061 6e3e 2020 2020 2020 2020 6 \n-00007a30: 3c73 7061 6e20 636c 6173 733d 226b 6579 for( \n-00007a70: 696e 743c 2f73 7061 6e3e 206a 203d 2030 int j = 0\n-00007a80: 3b20 6a20 266c 743b 2043 4f4c 533b 202b ; j < COLS; +\n-00007a90: 2b6a 2029 3c2f 6469 763e 0a3c 6469 7620 +j )
    .
    177 \n-00007af0: 2020 2020 2020 2020 2041 545b 6a5d 5b69 AT[j][i\n-00007b00: 5d20 3d20 282a 3c73 7061 6e20 636c 6173 ] = (*this\n-00007b20: 3c2f 7370 616e 3e29 5b69 5d5b 6a5d 3b3c )[i][j];<\n-00007b30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00007b80: 3137 383c 2f73 7061 6e3e 2020 2020 2020 178 \n-00007b90: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n-00007bb0: 3c2f 7370 616e 3e20 4154 3b3c 2f64 6976 AT;.
    179<\n-00007c10: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    180 .
    1\n-00007cd0: 3832 3c2f 7370 616e 3e20 2020 203c 7370 82 template <cla\n-00007d20: 7373 3c2f 7370 616e 3e20 4f74 6865 7253 ss OtherS\n-00007d30: 6361 6c61 7226 6774 3b3c 2f64 6976 3e0a calar>
    .\n-00007d40: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
    .
    <\n-00007dd0: 6120 636c 6173 733d 226c 696e 6522 2068 a class=\"line\" h\n-00007de0: 7265 663d 2261 3031 3430 382e 6874 6d6c ref=\"a01408.html\n-00007df0: 2361 6536 3033 3366 3231 3764 3264 6531 #ae6033f217d2de1\n-00007e00: 6337 6330 6464 6431 3038 3435 3966 6638 c7c0ddd108459ff8\n-00007e10: 6163 223e 2020 3138 333c 2f61 3e3c 2f73 ac\"> 183 fr\n-00007e40: 6965 6e64 3c2f 7370 616e 3e20 3c73 7061 iend auto ope\n-00007ec0: 7261 746f 722b 203c 2f61 3e28 203c 7370 rator+ ( const \n-00007ef0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n-00007f20: 644d 6174 7269 783c 2f61 3e26 616d 703b dMatrix&\n-00007f30: 206d 6174 7269 7841 2c3c 2f64 6976 3e0a matrixA,
    .\n-00007f40: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-00008040: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-000080a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 \n-00008190: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00008200: 6120 6964 3d22 6c30 3031 3838 2220 6e61 a id=\"l00188\" na\n-00008210: 6d65 3d22 6c30 3031 3838 223e 3c2f 613e me=\"l00188\">\n-00008220: 3c73 7061 6e20 636c 6173 733d 226c 696e 188 for (siz\n-000082c0: 655f 7479 7065 3c2f 613e 2069 203d 2030 e_type i = 0\n-000082d0: 3b20 6920 266c 743b 2052 4f57 533b 202b ; i < ROWS; +\n-000082e0: 2b69 293c 2f64 6976 3e0a 3c64 6976 2063 +i)
    .
    189 \n-00008340: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-00008360: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n-000083c0: 5f74 7970 653c 2f61 3e20 6a20 3d20 303b _type j = 0;\n-000083d0: 206a 2026 6c74 3b20 434f 4c53 3b20 2b2b j < COLS; ++\n-000083e0: 6a29 3c2f 6469 763e 0a3c 6469 7620 636c j)
    .
    190 \n-00008440: 2020 2020 2020 2072 6573 756c 745b 695d result[i]\n-00008450: 5b6a 5d20 3d20 6d61 7472 6978 415b 695d [j] = matrixA[i]\n-00008460: 5b6a 5d20 2b20 6d61 7472 6978 425b 695d [j] + matrixB[i]\n-00008470: 5b6a 5d3b 3c2f 6469 763e 0a3c 6469 7620 [j];
    .
    191 \n-000084d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00008520: 2031 3932 3c2f 7370 616e 3e20 2020 2020 192 \n-00008530: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n-00008550: 6e3c 2f73 7061 6e3e 2072 6573 756c 743b n result;\n-00008560: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000085b0: 2031 3933 3c2f 7370 616e 3e20 2020 207d 193 }\n-000085c0: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n-000085e0: 3c61 2069 643d 226c 3030 3139 3422 206e 194
    .
    196 \n-00008680: 2020 3c73 7061 6e20 636c 6173 733d 226b template\n-000086a0: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <class O\n-000086d0: 7468 6572 5363 616c 6172 2667 743b 3c2f therScalar>.
    .<\n-00008760: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00008770: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no\"> 197 friend\n-000087f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 auto operator- \n-00008870: 2820 3c73 7061 6e20 636c 6173 733d 226b ( const FieldMatrix\n-000088d0: 2661 6d70 3b20 6d61 7472 6978 412c 3c2f & matrixA,.
    1\n-00008930: 3938 3c2f 7370 616e 3e20 2020 2020 2020 98 \n-00008940: 2020 2020 2020 2020 2020 2020 2020 2020 \n-00008950: 2020 2020 203c 7370 616e 2063 6c61 7373 const\n-00008970: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 FieldMatrix&\n-000089b0: 6c74 3b4f 7468 6572 5363 616c 6172 2c52 lt;OtherScalar,R\n-000089c0: 4f57 532c 434f 4c53 2667 743b 3c2f 613e OWS,COLS>\n-000089d0: 2661 6d70 3b20 6d61 7472 6978 4229 3c2f & matrixB).
    1\n-00008a30: 3939 3c2f 7370 616e 3e20 2020 207b 3c2f 99 {.
    2\n-00008a90: 3030 3c2f 7370 616e 3e20 2020 2020 203c 00 <\n-00008aa0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-00008ab0: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n-00008ac0: 3134 3038 2e68 746d 6c22 3e46 6965 6c64 1408.html\">Field\n-00008ad0: 4d61 7472 6978 266c 743b 7479 7065 6e61 Matrix<typena\n-00008ae0: 6d65 2050 726f 6d6f 7469 6f6e 5472 6169 me PromotionTrai\n-00008af0: 7473 266c 743b 4b2c 4f74 6865 7253 6361 ts<K,OtherSca\n-00008b00: 6c61 7226 6774 3b3a 3a50 726f 6d6f 7465 lar>::Promote\n-00008b10: 6454 7970 653c 2f61 3e2c 524f 5753 2c43 dType,ROWS,C\n-00008b20: 4f4c 5326 6774 3b20 7265 7375 6c74 3b3c OLS> result;<\n-00008b30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00008b80: 3230 313c 2f73 7061 6e3e 203c 2f64 6976 201 .
    202<\n-00008be0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> for\n-00008c10: 2028 3c61 2063 6c61 7373 3d22 636f 6465 (size_type \n-00008c70: 6920 3d20 303b 2069 2026 6c74 3b20 524f i = 0; i < RO\n-00008c80: 5753 3b20 2b2b 6929 3c2f 6469 763e 0a3c WS; ++i)
    .<\n-00008c90: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00008ca0: 3e3c 6120 6964 3d22 6c30 3032 3033 2220 > 203 for \n-00008d10: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type j\n-00008d70: 203d 2030 3b20 6a20 266c 743b 2043 4f4c = 0; j < COL\n-00008d80: 533b 202b 2b6a 293c 2f64 6976 3e0a 3c64 S; ++j)
    .\n-00008da0: 3c61 2069 643d 226c 3030 3230 3422 206e 204 resu\n-00008df0: 6c74 5b69 5d5b 6a5d 203d 206d 6174 7269 lt[i][j] = matri\n-00008e00: 7841 5b69 5d5b 6a5d 202d 206d 6174 7269 xA[i][j] - matri\n-00008e10: 7842 5b69 5d5b 6a5d 3b3c 2f64 6976 3e0a xB[i][j];
    .\n-00008e20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-00008eb0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00008ec0: 6e6f 223e 2020 3230 363c 2f73 7061 6e3e no\"> 206\n-00008ed0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-00008ef0: 7265 7475 726e 3c2f 7370 616e 3e20 7265 return re\n-00008f00: 7375 6c74 3b3c 2f64 6976 3e0a 3c64 6976 sult;
    .<\n-00008f40: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00008f50: 6e6f 223e 2020 3230 373c 2f73 7061 6e3e no\"> 207\n-00008f60: 2020 2020 7d3c 2f64 6976 3e0a 3c2f 6469 }
    ..
    208\n-00008fc0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-00008fd0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00008fe0: 3e3c 6120 6964 3d22 6c30 3032 3130 2220 > 210 tem\n-00009040: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n-00009050: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class Scalar,.
    211<\n-000090d0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> \n-000090e0: 2020 2020 7374 643a 3a65 6e61 626c 655f std::enable_\n-000090f0: 6966 5f74 266c 743b 4973 4e75 6d62 6572 if_t<IsNumber\n-00009100: 266c 743b 5363 616c 6172 2667 743b 3a3a <Scalar>::\n-00009110: 7661 6c75 652c 203c 7370 616e 2063 6c61 value, int> \n-00009140: 3d20 3026 6774 3b3c 2f64 6976 3e0a 3c64 = 0>
    ..
    212 frie\n-00009250: 6e64 3c2f 7370 616e 3e20 3c73 7061 6e20 nd \n-00009270: 6175 746f 3c2f 7370 616e 3e20 3c61 2063 auto opera\n-000092d0: 746f 722a 203c 2f61 3e28 203c 7370 616e tor* ( const FieldM\n-00009330: 6174 7269 783c 2f61 3e26 616d 703b 206d atrix& m\n-00009340: 6174 7269 782c 2053 6361 6c61 7220 7363 atrix, Scalar sc\n-00009350: 616c 6172 293c 2f64 6976 3e0a 3c64 6976 alar)
    .<\n-00009390: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-000093a0: 6e6f 223e 2020 3231 333c 2f73 7061 6e3e no\"> 213
    \n-000093b0: 2020 2020 7b3c 2f64 6976 3e0a 3c64 6976 {
    .<\n-000093f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00009400: 6e6f 223e 2020 3231 343c 2f73 7061 6e3e no\"> 214\n-00009410: 2020 2020 2020 3c61 2063 6c61 7373 3d22 FieldMatrix<\n-00009450: 3b74 7970 656e 616d 6520 5072 6f6d 6f74 ;typename Promot\n-00009460: 696f 6e54 7261 6974 7326 6c74 3b4b 2c53 ionTraits<K,S\n-00009470: 6361 6c61 7226 6774 3b3a 3a50 726f 6d6f calar>::Promo\n-00009480: 7465 6454 7970 653c 2f61 3e2c 524f 5753 tedType,ROWS\n-00009490: 2c43 4f4c 5326 6774 3b20 7265 7375 6c74 ,COLS> result\n-000094a0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-000094f0: 2020 3231 353c 2f73 7061 6e3e 203c 2f64 215 .
    21\n-00009550: 363c 2f73 7061 6e3e 2020 2020 2020 3c73 6 for (size_type i = 0; i < \n-000095f0: 524f 5753 3b20 2b2b 6929 3c2f 6469 763e ROWS; ++i)
    \n-00009600: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00009630: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 217 for (size_type\n-000096e0: 206a 203d 2030 3b20 6a20 266c 743b 2043 j = 0; j < C\n-000096f0: 4f4c 533b 202b 2b6a 293c 2f64 6976 3e0a OLS; ++j)
    .\n-00009700: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    219 <\n-000097e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00009830: 3232 303c 2f73 7061 6e3e 2020 2020 2020 220 \n-00009840: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n-00009860: 3c2f 7370 616e 3e20 7265 7375 6c74 3b3c result;<\n-00009870: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-000098c0: 3232 313c 2f73 7061 6e3e 2020 2020 7d3c 221 }<\n-000098d0: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
    .<\n-000098f0: 6120 6964 3d22 6c30 3032 3232 2220 6e61 a id=\"l00222\" na\n-00009900: 6d65 3d22 6c30 3032 3232 223e 3c2f 613e me=\"l00222\">\n-00009910: 3c73 7061 6e20 636c 6173 733d 226c 696e 222
    .
    224 \n-00009990: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n-000099b0: 2f73 7061 6e3e 2026 6c74 3b3c 7370 616e /span> <class Sc\n-000099e0: 616c 6172 2c3c 2f64 6976 3e0a 3c64 6976 alar,
    .<\n-00009a20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00009a30: 6e6f 223e 2020 3232 353c 2f73 7061 6e3e no\"> 225\n-00009a40: 2020 2020 2020 2020 2020 2020 2020 7374 st\n-00009a50: 643a 3a65 6e61 626c 655f 6966 5f74 266c d::enable_if_t&l\n-00009a60: 743b 4973 4e75 6d62 6572 266c 743b 5363 t;IsNumber<Sc\n-00009a70: 616c 6172 2667 743b 3a3a 7661 6c75 652c alar>::value,\n-00009a80: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int> = 0>\n-00009ab0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    .<\n-00009b00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00009b10: 3e3c 6120 6964 3d22 6c30 3032 3236 2220 > 22\n-00009b90: 363c 2f61 3e3c 2f73 7061 6e3e 2020 2020 6 \n-00009ba0: 3c73 7061 6e20 636c 6173 733d 226b 6579 friend auto operator* <\n-00009c40: 2f61 3e28 2053 6361 6c61 7220 7363 616c /a>( Scalar scal\n-00009c50: 6172 2c20 3c73 7061 6e20 636c 6173 733d ar, const<\n-00009c70: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldMatrix& matrix)<\n-00009cc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00009d10: 3232 373c 2f73 7061 6e3e 2020 2020 7b3c 227 {<\n-00009d20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00009d70: 3232 383c 2f73 7061 6e3e 2020 2020 2020 228 \n-00009d80: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n-00009db0: 644d 6174 7269 7826 6c74 3b74 7970 656e dMatrix<typen\n-00009dc0: 616d 6520 5072 6f6d 6f74 696f 6e54 7261 ame PromotionTra\n-00009dd0: 6974 7326 6c74 3b4b 2c53 6361 6c61 7226 its<K,Scalar&\n-00009de0: 6774 3b3a 3a50 726f 6d6f 7465 6454 7970 gt;::PromotedTyp\n-00009df0: 653c 2f61 3e2c 524f 5753 2c43 4f4c 5326 e,ROWS,COLS&\n-00009e00: 6774 3b20 7265 7375 6c74 3b3c 2f64 6976 gt; result;.
    229<\n-00009e60: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n-00009e80: 3c61 2069 643d 226c 3030 3233 3022 206e 230 for (si\n-00009f40: 7a65 5f74 7970 653c 2f61 3e20 6920 3d20 ze_type i = \n-00009f50: 303b 2069 2026 6c74 3b20 524f 5753 3b20 0; i < ROWS; \n-00009f60: 2b2b 6929 3c2f 6469 763e 0a3c 6469 7620 ++i)
    .
    231 \n-00009fc0: 2020 2020 2020 203c 7370 616e 2063 6c61 for (siz\n-0000a040: 655f 7479 7065 3c2f 613e 206a 203d 2030 e_type j = 0\n-0000a050: 3b20 6a20 266c 743b 2043 4f4c 533b 202b ; j < COLS; +\n-0000a060: 2b6a 293c 2f64 6976 3e0a 3c64 6976 2063 +j)
    .
    232 \n-0000a0c0: 2020 2020 2020 2020 7265 7375 6c74 5b69 result[i\n-0000a0d0: 5d5b 6a5d 203d 2073 6361 6c61 7220 2a20 ][j] = scalar * \n-0000a0e0: 6d61 7472 6978 5b69 5d5b 6a5d 3b3c 2f64 matrix[i][j];.
    23\n-0000a140: 333c 2f73 7061 6e3e 203c 2f64 6976 3e0a 3
    .\n-0000a150: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-0000a1e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-0000a240: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0000a290: 2032 3336 3c2f 7370 616e 3e20 3c2f 6469 236 .
    238\n-0000a2f0: 3c2f 7370 616e 3e20 2020 203c 7370 616e template\n-0000a320: 2026 6c74 3b3c 7370 616e 2063 6c61 7373 <class\n-0000a340: 203c 2f73 7061 6e3e 5363 616c 6172 2c3c Scalar,<\n-0000a350: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000a3a0: 3233 393c 2f73 7061 6e3e 2020 2020 2020 239 \n-0000a3b0: 2020 2020 2020 2020 7374 643a 3a65 6e61 std::ena\n-0000a3c0: 626c 655f 6966 5f74 266c 743b 4973 4e75 ble_if_t<IsNu\n-0000a3d0: 6d62 6572 266c 743b 5363 616c 6172 2667 mber<Scalar&g\n-0000a3e0: 743b 3a3a 7661 6c75 652c 203c 7370 616e t;::value, int&\n-0000a410: 6774 3b20 3d20 3026 6774 3b3c 2f64 6976 gt; = 0>.
    .
    240<\n-0000a500: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-0000a520: 6672 6965 6e64 3c2f 7370 616e 3e20 3c73 friend auto \n-0000a550: 3c61 2063 6c61 7373 3d22 636f 6465 2068 o\n-0000a5a0: 7065 7261 746f 722f 203c 2f61 3e28 203c perator/ ( <\n-0000a5b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000a5c0: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const Fi\n-0000a600: 656c 644d 6174 7269 783c 2f61 3e26 616d eldMatrix&am\n-0000a610: 703b 206d 6174 7269 782c 2053 6361 6c61 p; matrix, Scala\n-0000a620: 7220 7363 616c 6172 293c 2f64 6976 3e0a r scalar)
    .\n-0000a630: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-0000a690: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-0000a7b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0000a7c0: 6e6f 223e 2020 3234 333c 2f73 7061 6e3e no\"> 243\n-0000a7d0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-0000a820: 2020 3234 343c 2f73 7061 6e3e 2020 2020 244 \n-0000a830: 2020 3c73 7061 6e20 636c 6173 733d 226b for<\n-0000a850: 2f73 7061 6e3e 2028 3c61 2063 6c61 7373 /span> (size_typ\n-0000a8b0: 653c 2f61 3e20 6920 3d20 303b 2069 2026 e i = 0; i &\n-0000a8c0: 6c74 3b20 524f 5753 3b20 2b2b 6929 3c2f lt; ROWS; ++i).
    2\n-0000a920: 3435 3c2f 7370 616e 3e20 2020 2020 2020 45 \n-0000a930: 203c 7370 616e 2063 6c61 7373 3d22 6b65 for (size_type\n-0000a9b0: 3c2f 613e 206a 203d 2030 3b20 6a20 266c j = 0; j &l\n-0000a9c0: 743b 2043 4f4c 533b 202b 2b6a 293c 2f64 t; COLS; ++j).
    24\n-0000aa20: 363c 2f73 7061 6e3e 2020 2020 2020 2020 6 \n-0000aa30: 2020 7265 7375 6c74 5b69 5d5b 6a5d 203d result[i][j] =\n-0000aa40: 206d 6174 7269 785b 695d 5b6a 5d20 2f20 matrix[i][j] / \n-0000aa50: 7363 616c 6172 3b3c 2f64 6976 3e0a 3c64 scalar;
    .\n-0000aa70: 3c61 2069 643d 226c 3030 3234 3722 206e 247
    .
    248 \n-0000ab10: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n-0000ab30: 7475 726e 3c2f 7370 616e 3e20 7265 7375 turn resu\n-0000ab40: 6c74 3b3c 2f64 6976 3e0a 3c64 6976 2063 lt;
    .
    249 \n-0000aba0: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
    .
    \n-0000abb0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-0000ac20: 6120 6964 3d22 6c30 3032 3533 2220 6e61 a id=\"l00253\" na\n-0000ac30: 6d65 3d22 6c30 3032 3533 223e 3c2f 613e me=\"l00253\">\n-0000ac40: 3c73 7061 6e20 636c 6173 733d 226c 696e 253 templ\n-0000ac80: 6174 653c 2f73 7061 6e3e 2026 6c74 3b3c ate <<\n-0000ac90: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000aca0: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord\">class OtherScalar, <\n-0000acc0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000acd0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype\">int otherCols>\n-0000acf0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    ..
    \n-0000af40: 2020 3235 353c 2f73 7061 6e3e 2020 2020 255 \n-0000af50: 2020 2020 2020 2020 2020 2020 2020 2020 \n-0000af60: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n-0000af80: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst FieldMatr\n-0000afc0: 6978 266c 743b 4f74 6865 7253 6361 6c61 ix<OtherScala\n-0000afd0: 722c 2043 4f4c 532c 206f 7468 6572 436f r, COLS, otherCo\n-0000afe0: 6c73 2667 743b 3c2f 613e 2661 6d70 3b20 ls>& \n-0000aff0: 6d61 7472 6978 4229 3c2f 6469 763e 0a3c matrixB)
    .<\n-0000b000: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0000b010: 3e3c 6120 6964 3d22 6c30 3032 3536 2220 > 256 {
    .<\n-0000b060: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0000b070: 3e3c 6120 6964 3d22 6c30 3032 3537 2220 > 257 FieldMatrix\n-0000b0f0: 266c 743b 7479 7065 6e61 6d65 2050 726f <typename Pro\n-0000b100: 6d6f 7469 6f6e 5472 6169 7473 266c 743b motionTraits<\n-0000b110: 4b2c 4f74 6865 7253 6361 6c61 7226 6774 K,OtherScalar>\n-0000b120: 3b3a 3a50 726f 6d6f 7465 6454 7970 653c ;::PromotedType<\n-0000b130: 2f61 3e2c 524f 5753 2c6f 7468 6572 436f /a>,ROWS,otherCo\n-0000b140: 6c73 2667 743b 2072 6573 756c 743b 3c2f ls> result;.
    2\n-0000b1a0: 3538 3c2f 7370 616e 3e20 3c2f 6469 763e 58
    \n-0000b1b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000b1e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 259 for \n-0000b230: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type i\n-0000b290: 203d 2030 3b20 6920 266c 743b 206d 6174 = 0; i < mat\n-0000b2a0: 7269 7841 2e3c 6120 636c 6173 733d 2263 rixA.mat_rows(); ++i)
    \n-0000b310: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000b340: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 260 for (size_type\n-0000b3f0: 206a 203d 2030 3b20 6a20 266c 743b 206d j = 0; j < m\n-0000b400: 6174 7269 7842 2e3c 6120 636c 6173 733d atrixB.mat_cols\n-0000b460: 3c2f 613e 2829 3b20 2b2b 6a29 3c2f 6469 (); ++j).
    261\n-0000b4c0: 3c2f 7370 616e 3e20 2020 2020 2020 207b {\n-0000b4d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0000b520: 2032 3632 3c2f 7370 616e 3e20 2020 2020 262 \n-0000b530: 2020 2020 2072 6573 756c 745b 695d 5b6a result[i][j\n-0000b540: 5d20 3d20 303b 3c2f 6469 763e 0a3c 6469 ] = 0;
    .<\n-0000b560: 6120 6964 3d22 6c30 3032 3633 2220 6e61 a id=\"l00263\" na\n-0000b570: 6d65 3d22 6c30 3032 3633 223e 3c2f 613e me=\"l00263\">\n-0000b580: 3c73 7061 6e20 636c 6173 733d 226c 696e 263 for \n-0000b5d0: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type k\n-0000b630: 203d 2030 3b20 6b20 266c 743b 206d 6174 = 0; k < mat\n-0000b640: 7269 7841 2e3c 6120 636c 6173 733d 2263 rixA.mat_cols(); ++k)
    \n-0000b6b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000b6e0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 264 \n-0000b710: 2072 6573 756c 745b 695d 5b6a 5d20 2b3d result[i][j] +=\n-0000b720: 206d 6174 7269 7841 5b69 5d5b 6b5d 202a matrixA[i][k] *\n-0000b730: 206d 6174 7269 7842 5b6b 5d5b 6a5d 3b3c matrixB[k][j];<\n-0000b740: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000b790: 3236 353c 2f73 7061 6e3e 2020 2020 2020 265 \n-0000b7a0: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    266 <\n-0000b800: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000b850: 3236 373c 2f73 7061 6e3e 2020 2020 2020 267 \n-0000b860: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n-0000b880: 3c2f 7370 616e 3e20 7265 7375 6c74 3b3c result;<\n-0000b890: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000b8e0: 3236 383c 2f73 7061 6e3e 2020 2020 7d3c 268 }<\n-0000b8f0: 2f64 6976 3e0a 3c2f 6469 763e 0a3c 6469 /div>.
    .<\n-0000b910: 6120 6964 3d22 6c30 3032 3639 2220 6e61 a id=\"l00269\" na\n-0000b920: 6d65 3d22 6c30 3032 3639 223e 3c2f 613e me=\"l00269\">\n-0000b930: 3c73 7061 6e20 636c 6173 733d 226c 696e 269
    .
    276 \n-0000b9b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n-0000b9d0: 2f73 7061 6e3e 2026 6c74 3b3c 7370 616e /span> <class Ot\n-0000ba00: 6865 724d 6174 7269 782c 2073 7464 3a3a herMatrix, std::\n-0000ba10: 656e 6162 6c65 5f69 665f 7426 6c74 3b3c enable_if_t<<\n-0000ba20: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000ba70: 3237 373c 2f73 7061 6e3e 2020 2020 2020 277 \n-0000ba80: 496d 706c 3a3a 4973 5374 6174 6963 5369 Impl::IsStaticSi\n-0000ba90: 7a65 4d61 7472 6978 5f76 266c 743b 4f74 zeMatrix_v<Ot\n-0000baa0: 6865 724d 6174 7269 7826 6774 3b3c 2f64 herMatrix>.
    27\n-0000bb00: 383c 2f73 7061 6e3e 2020 2020 2020 616e 8 an\n-0000bb10: 6420 6e6f 7420 496d 706c 3a3a 4973 4669 d not Impl::IsFi\n-0000bb20: 656c 644d 6174 7269 785f 7626 6c74 3b4f eldMatrix_v<O\n-0000bb30: 7468 6572 4d61 7472 6978 2667 743b 3c2f therMatrix>.
    2\n-0000bb90: 3739 3c2f 7370 616e 3e20 2020 2020 202c 79 ,\n-0000bba0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int> = 0>\n-0000bbd0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    ..
    \n-0000be20: 2020 3238 313c 2f73 7061 6e3e 2020 2020 281 \n-0000be30: 2020 2020 2020 2020 2020 2020 2020 2020 \n-0000be40: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n-0000be60: 6e73 743c 2f73 7061 6e3e 204f 7468 6572 nst Other\n-0000be70: 4d61 7472 6978 2661 6d70 3b20 6d61 7472 Matrix& matr\n-0000be80: 6978 4229 3c2f 6469 763e 0a3c 6469 7620 ixB)
    .
    282 \n-0000bee0: 2020 207b 3c2f 6469 763e 0a3c 6469 7620 {
    .
    283 \n-0000bf40: 2020 2020 203c 7370 616e 2063 6c61 7373 using\n-0000bf60: 203c 2f73 7061 6e3e 4669 656c 6420 3d20 Field = \n-0000bf70: 3c73 7061 6e20 636c 6173 733d 226b 6579 typename PromotionT\n-0000bff0: 7261 6974 7326 6c74 3b4b 2c20 7479 7065 raits<K, type\n-0000c000: 6e61 6d65 204f 7468 6572 4d61 7472 6978 name OtherMatrix\n-0000c010: 3a3a 6669 656c 645f 7479 7065 2667 743b ::field_type>\n-0000c020: 3a3a 5072 6f6d 6f74 6564 5479 7065 3c2f ::PromotedType;
    ..
    285 \n-0000c160: 2020 2020 3c73 7061 6e20 636c 6173 733d fo\n-0000c180: 723c 2f73 7061 6e3e 2028 7374 643a 3a73 r (std::s\n-0000c190: 697a 655f 7420 6a3d 303b 206a 266c 743b ize_t j=0; j<\n-0000c1a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 rows; ++j)<\n-0000c200: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000c250: 3238 363c 2f73 7061 6e3e 2020 2020 2020 286 \n-0000c260: 2020 6d61 7472 6978 422e 3c61 2063 6c61 matrixB.mtv(matrixA[j], r\n-0000c2d0: 6573 756c 745b 6a5d 293b 3c2f 6469 763e esult[j]);
    \n-0000c2e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n-0000c370: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n-0000c3d0: 0a3c 2f64 6976 3e0a 3c64 6976 2063 6c61 .
    .
    \n-0000c420: 2020 3238 393c 2f73 7061 6e3e 203c 2f64 289 .
    29\n-0000c480: 363c 2f73 7061 6e3e 2020 2020 3c73 7061 6 template <clas\n-0000c4d0: 7320 3c2f 7370 616e 3e4f 7468 6572 4d61 s OtherMa\n-0000c4e0: 7472 6978 2c20 7374 643a 3a65 6e61 626c trix, std::enabl\n-0000c4f0: 655f 6966 5f74 266c 743b 3c2f 6469 763e e_if_t<
    \n-0000c500: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000c530: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 297 Impl:\n-0000c560: 3a49 7353 7461 7469 6353 697a 654d 6174 :IsStaticSizeMat\n-0000c570: 7269 785f 7626 6c74 3b4f 7468 6572 4d61 rix_v<OtherMa\n-0000c580: 7472 6978 2667 743b 3c2f 6469 763e 0a3c trix>
    .<\n-0000c590: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0000c5a0: 3e3c 6120 6964 3d22 6c30 3032 3938 2220 > 298 and not\n-0000c5f0: 2049 6d70 6c3a 3a49 7346 6965 6c64 4d61 Impl::IsFieldMa\n-0000c600: 7472 6978 5f76 266c 743b 4f74 6865 724d trix_v<OtherM\n-0000c610: 6174 7269 7826 6774 3b3c 2f64 6976 3e0a atrix>
    .\n-0000c620: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-0000c650: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 299 , int\n-0000c6a0: 2667 743b 203d 2030 2667 743b 3c2f 6469 > = 0>.
    .
    300\n-0000c790: 3c2f 7370 616e 3e20 2020 203c 7370 616e friend <\n-0000c7c0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000c7d0: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord\">auto\n-0000c7e0: 203c 6120 636c 6173 733d 2263 6f64 6520 \n-0000c830: 6f70 6572 6174 6f72 2a20 3c2f 613e 2820 operator* ( \n-0000c840: 3c73 7061 6e20 636c 6173 733d 226b 6579 const OtherMatrix&a\n-0000c870: 6d70 3b20 6d61 7472 6978 412c 3c2f 6469 mp; matrixA,.
    301\n-0000c8d0: 3c2f 7370 616e 3e20 2020 2020 2020 2020 \n-0000c8e0: 2020 2020 2020 2020 2020 2020 2020 2020 \n-0000c8f0: 2020 203c 7370 616e 2063 6c61 7373 3d22 const FieldMatrix& matrixB)<\n-0000c960: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000c9b0: 3330 323c 2f73 7061 6e3e 2020 2020 7b3c 302 {<\n-0000c9c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000ca10: 3330 333c 2f73 7061 6e3e 2020 2020 2020 303 \n-0000ca20: 3c73 7061 6e20 636c 6173 733d 226b 6579 using Field = typename\n-0000ca70: 203c 6120 636c 6173 733d 2263 6f64 6520 PromotionTraits\n-0000cad0: 266c 743b 4b2c 2074 7970 656e 616d 6520 <K, typename \n-0000cae0: 4f74 6865 724d 6174 7269 783a 3a66 6965 OtherMatrix::fie\n-0000caf0: 6c64 5f74 7970 6526 6774 3b3a 3a50 726f ld_type>::Pro\n-0000cb00: 6d6f 7465 6454 7970 653c 2f61 3e3b 3c2f motedType;.
    3\n-0000cb60: 3034 3c2f 7370 616e 3e20 2020 2020 203c 04 <\n-0000cb70: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-0000cb80: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n-0000cb90: 3134 3038 2e68 746d 6c22 3e44 756e 653a 1408.html\">Dune:\n-0000cba0: 3a46 6965 6c64 4d61 7472 6978 266c 743b :FieldMatrix<\n-0000cbb0: 4669 656c 642c 204f 7468 6572 4d61 7472 Field, OtherMatr\n-0000cbc0: 6978 3a3a 726f 7773 2c20 636f 6c73 2667 ix::rows, cols&g\n-0000cbd0: 743b 3c2f 613e 2072 6573 756c 743b 3c2f t; result;.
    3\n-0000cc30: 3035 3c2f 7370 616e 3e20 2020 2020 203c 05 <\n-0000cc40: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000cc50: 6f72 6466 6c6f 7722 3e66 6f72 3c2f 7370 ordflow\">for (std::size_t\n-0000cc70: 206a 3d30 3b20 6a26 6c74 3b3c 6120 636c j=0; j<cols\n-0000ccd0: 3c2f 613e 3b20 2b2b 6a29 3c2f 6469 763e ; ++j)
    \n-0000cce0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000cd10: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 306 {.
    307\n-0000cd90: 3c2f 7370 616e 3e20 2020 2020 2020 203c <\n-0000cda0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000cdb0: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord\">auto\n-0000cdc0: 2042 5f6a 203d 2049 6d70 6c3a 3a43 6f6c B_j = Impl::Col\n-0000cdd0: 756d 6e56 6563 746f 7256 6965 7728 6d61 umnVectorView(ma\n-0000cde0: 7472 6978 422c 206a 293b 3c2f 6469 763e trixB, j);
    \n-0000cdf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000ce20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 308 auto r\n-0000ce70: 6573 756c 745f 6a20 3d20 496d 706c 3a3a esult_j = Impl::\n-0000ce80: 436f 6c75 6d6e 5665 6374 6f72 5669 6577 ColumnVectorView\n-0000ce90: 2872 6573 756c 742c 206a 293b 3c2f 6469 (result, j);.
    309\n-0000cef0: 3c2f 7370 616e 3e20 2020 2020 2020 206d m\n-0000cf00: 6174 7269 7841 2e6d 7628 425f 6a2c 2072 atrixA.mv(B_j, r\n-0000cf10: 6573 756c 745f 6a29 3b3c 2f64 6976 3e0a esult_j);
    .\n-0000cf20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-0000cf50: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 310 }.
    311<\n-0000cfd0: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return result;.
    312<\n-0000d060: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    313 .
    3\n-0000d120: 3135 3c2f 7370 616e 3e20 2020 203c 7370 15 template<\n-0000d170: 696e 743c 2f73 7061 6e3e 206c 2667 743b int l>\n-0000d180: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    .<\n-0000d1e0: 6120 6964 3d22 6c30 3033 3136 2220 6e61 a id=\"l00316\" na\n-0000d1f0: 6d65 3d22 6c30 3033 3136 223e 3c2f 613e me=\"l00316\">\n-0000d200: 3c73 7061 6e20 636c 6173 733d 226c 696e 316<\n-0000d260: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c61 /a> FieldM\n-0000d2a0: 6174 7269 7826 6c74 3b4b 2c6c 2c63 6f6c atrix<K,l,col\n-0000d2b0: 7326 6774 3b3c 2f61 3e20 3c61 2063 6c61 s> leftm\n-0000d310: 756c 7469 706c 7961 6e79 3c2f 613e 2028 ultiplyany (\n-0000d320: 3c73 7061 6e20 636c 6173 733d 226b 6579 const F\n-0000d370: 6965 6c64 4d61 7472 6978 266c 743b 4b2c ieldMatrix<K,\n-0000d380: 6c2c 726f 7773 2667 743b 3c2f 613e 2661 l,rows>&a\n-0000d390: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; M) const.
    3\n-0000d460: 3137 3c2f 7370 616e 3e3c 7370 616e 2063 17 \n-0000d480: 2020 203c 2f73 7061 6e3e 7b3c 2f64 6976 {.\n-0000d540: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-0000d5b0: 6120 6964 3d22 6c30 3033 3230 2220 6e61 a id=\"l00320\" na\n-0000d5c0: 6d65 3d22 6c30 3033 3230 223e 3c2f 613e me=\"l00320\">\n-0000d5d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 320 for (siz\n-0000d670: 655f 7479 7065 3c2f 613e 2069 3d30 3b20 e_type i=0; \n-0000d680: 6926 6c74 3b6c 3b20 692b 2b29 207b 3c2f i<l; i++) {.
    3\n-0000d6e0: 3231 3c2f 7370 616e 3e20 2020 2020 2020 21 \n-0000d6f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 for (size_type\n-0000d770: 3c2f 613e 206a 3d30 3b20 6a26 6c74 3b3c j=0; j<<\n-0000d780: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-0000d790: 5f76 6172 6961 626c 6522 2068 7265 663d _variable\" href=\n-0000d7a0: 2261 3031 3430 382e 6874 6d6c 2361 6332 \"a01408.html#ac2\n-0000d7b0: 3831 3666 3164 3036 3766 3533 3333 3636 816f1d067f533366\n-0000d7c0: 3239 3763 3035 3366 3037 3039 3962 223e 297c053f07099b\">\n-0000d7d0: 636f 6c73 3c2f 613e 3b20 6a2b 2b29 207b cols; j++) {\n-0000d7e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0000d830: 2033 3232 3c2f 7370 616e 3e20 2020 2020 322 \n-0000d840: 2020 2020 2043 5b69 5d5b 6a5d 203d 2030 C[i][j] = 0\n-0000d850: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-0000d8a0: 2020 3332 333c 2f73 7061 6e3e 2020 2020 323 \n-0000d8b0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-0000d8d0: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n-0000d930: 5f74 7970 653c 2f61 3e20 6b3d 303b 206b _type k=0; k\n-0000d940: 266c 743b 3c61 2063 6c61 7373 3d22 636f <rows; k\n-0000d9a0: 2b2b 293c 2f64 6976 3e0a 3c64 6976 2063 ++)
    .
    324 \n-0000da00: 2020 2020 2020 2020 2020 435b 695d 5b6a C[i][j\n-0000da10: 5d20 2b3d 203c 6120 636c 6173 733d 2263 ] += M[i][k\n-0000da70: 5d2a 282a 3c73 7061 6e20 636c 6173 733d ]*(*this)[k][j];.
    32\n-0000daf0: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 \n-0000db00: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
    .
    \n-0000db50: 2020 3332 363c 2f73 7061 6e3e 2020 2020 326 \n-0000db60: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    327 \n-0000dbc0: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n-0000dbe0: 7475 726e 3c2f 7370 616e 3e20 433b 3c2f turn C;.
    3\n-0000dc40: 3238 3c2f 7370 616e 3e20 2020 207d 3c2f 28 }.
    .<\n-0000dc90: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0000dca0: 6e6f 223e 2020 3332 393c 2f73 7061 6e3e no\"> 329\n-0000dcb0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-0000dd00: 2020 3333 303c 2f73 7061 6e3e 2020 2020 330 \n-0000dd10: 3c73 7061 6e20 636c 6173 733d 226b 6579 using Base::rightm\n-0000dd90: 756c 7469 706c 793c 2f61 3e3b 3c2f 6469 ultiply;.
    331\n-0000ddf0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-0000de00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0000de10: 3e3c 6120 6964 3d22 6c30 3033 3333 2220 > 333 tem\n-0000de70: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n-0000de80: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;int r, int c&\n-0000ded0: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    .\n-0000df20: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-0000df50: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 3\n-0000dfb0: 3334 3c2f 613e 3c2f 7370 616e 3e20 2020 34 \n-0000dfc0: 203c 6120 636c 6173 733d 2263 6f64 6520 Fie\n-0000dff0: 6c64 4d61 7472 6978 3c2f 613e 2661 6d70 ldMatrix&\n-0000e000: 3b20 3c61 2063 6c61 7373 3d22 636f 6465 ; rightmultiply\n-0000e060: 3c2f 613e 2028 3c73 7061 6e20 636c 6173 (cons\n-0000e080: 743c 2f73 7061 6e3e 203c 6120 636c 6173 t FieldMatrix\n-0000e0c0: 266c 743b 4b2c 722c 6326 6774 3b3c 2f61 <K,r,c>& M).
    3\n-0000e180: 3335 3c2f 7370 616e 3e20 2020 207b 3c2f 35 {.
    3\n-0000e1e0: 3336 3c2f 7370 616e 3e20 2020 2020 203c 36 <\n-0000e1f0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000e200: 6f72 6422 3e73 7461 7469 635f 6173 7365 ord\">static_asse\n-0000e210: 7274 3c2f 7370 616e 3e28 7220 3d3d 2063 rt(r == c\n-0000e220: 2c20 3c73 7061 6e20 636c 6173 733d 2273 , &q\n-0000e240: 756f 743b 4361 6e6e 6f74 2072 6967 6874 uot;Cannot right\n-0000e250: 6d75 6c74 6970 6c79 2077 6974 6820 6e6f multiply with no\n-0000e260: 6e2d 7371 7561 7265 206d 6174 7269 7826 n-square matrix&\n-0000e270: 7175 6f74 3b3c 2f73 7061 6e3e 293b 3c2f quot;);.
    3\n-0000e2d0: 3337 3c2f 7370 616e 3e20 2020 2020 203c 37 <\n-0000e2e0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000e2f0: 6f72 6422 3e73 7461 7469 635f 6173 7365 ord\">static_asse\n-0000e300: 7274 3c2f 7370 616e 3e28 7220 3d3d 203c rt(r == <\n-0000e310: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-0000e320: 5f76 6172 6961 626c 6522 2068 7265 663d _variable\" href=\n-0000e330: 2261 3031 3430 382e 6874 6d6c 2361 6332 \"a01408.html#ac2\n-0000e340: 3831 3666 3164 3036 3766 3533 3333 3636 816f1d067f533366\n-0000e350: 3239 3763 3035 3366 3037 3039 3962 223e 297c053f07099b\">\n-0000e360: 636f 6c73 3c2f 613e 2c20 3c73 7061 6e20 cols, "Size\n-0000e390: 206d 6973 6d61 7463 6826 7175 6f74 3b3c mismatch"<\n-0000e3a0: 2f73 7061 6e3e 293b 3c2f 6469 763e 0a3c /span>);
    .<\n-0000e3b0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0000e3c0: 3e3c 6120 6964 3d22 6c30 3033 3338 2220 > 338 FieldMatrix\n-0000e440: 266c 743b 4b2c 726f 7773 2c63 6f6c 7326 <K,rows,cols&\n-0000e450: 6774 3b3c 2f61 3e20 4328 2a3c 7370 616e gt; C(*this);.
    3\n-0000e4d0: 3339 3c2f 7370 616e 3e20 3c2f 6469 763e 39
    \n-0000e4e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000e510: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 340 for \n-0000e560: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type i\n-0000e5c0: 3d30 3b20 6926 6c74 3b3c 6120 636c 6173 =0; i<rows; i++)
    .<\n-0000e630: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0000e640: 3e3c 6120 6964 3d22 6c30 3033 3431 2220 > 341 for \n-0000e6b0: 283c 6120 636c 6173 733d 2263 6f64 6520 (size_type j\n-0000e710: 3d30 3b20 6a26 6c74 3b3c 6120 636c 6173 =0; j<cols; j++) {
    \n-0000e780: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000e7b0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 342 (\n-0000e7e0: 2a74 6869 7329 5b69 5d5b 6a5d 203d 2030 *this)[i][j] = 0\n-0000e7f0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-0000e840: 2020 3334 333c 2f73 7061 6e3e 2020 2020 343 \n-0000e850: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-0000e870: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n-0000e8d0: 5f74 7970 653c 2f61 3e20 6b3d 303b 206b _type k=0; k\n-0000e8e0: 266c 743b 3c61 2063 6c61 7373 3d22 636f <cols; k\n-0000e940: 2b2b 293c 2f64 6976 3e0a 3c64 6976 2063 ++)
    .
    344 \n-0000e9a0: 2020 2020 2020 2020 2020 282a 3c73 7061 (*this)[i\n-0000e9d0: 5d5b 6a5d 202b 3d20 435b 695d 5b6b 5d2a ][j] += C[i][k]*\n-0000e9e0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 M[k][j];.
    34\n-0000ea90: 353c 2f73 7061 6e3e 2020 2020 2020 2020 5 \n-0000eaa0: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
    .
    \n-0000eaf0: 2020 3334 363c 2f73 7061 6e3e 2020 2020 346 \n-0000eb00: 2020 3c73 7061 6e20 636c 6173 733d 226b retu\n-0000eb20: 726e 3c2f 7370 616e 3e20 2a3c 7370 616e rn *this;.
    34\n-0000eba0: 373c 2f73 7061 6e3e 2020 2020 7d3c 2f64 7 }.
    .
    348 \n-0000ec10: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0000ec60: 2033 3530 3c2f 7370 616e 3e20 2020 203c 350 <\n-0000ec70: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0000ec80: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord\">template<int l&g\n-0000ecc0: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    ..
    \n-0000efa0: 2020 3335 323c 2f73 7061 6e3e 3c73 7061 352 {.
    3\n-0000f020: 3533 3c2f 7370 616e 3e20 2020 2020 203c 53 <\n-0000f030: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-0000f040: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n-0000f050: 3134 3038 2e68 746d 6c22 3e46 6965 6c64 1408.html\">Field\n-0000f060: 4d61 7472 6978 266c 743b 4b2c 726f 7773 Matrix<K,rows\n-0000f070: 2c6c 2667 743b 3c2f 613e 2043 3b3c 2f64 ,l> C;.
    35\n-0000f0d0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n-0000f0e0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-0000f230: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-0000f260: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 356 for\n-0000f2b0: 2028 3c61 2063 6c61 7373 3d22 636f 6465 (size_type \n-0000f310: 6a3d 303b 206a 266c 743b 6c3b 206a 2b2b j=0; j<l; j++\n-0000f320: 2920 7b3c 2f64 6976 3e0a 3c64 6976 2063 ) {
    .
    357 \n-0000f380: 2020 2020 2020 2020 435b 695d 5b6a 5d20 C[i][j] \n-0000f390: 3d20 303b 3c2f 6469 763e 0a3c 6469 7620 = 0;
    .
    358 \n-0000f3f0: 2020 2020 2020 2020 203c 7370 616e 2063 for (<\n-0000f420: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-0000f430: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef\" href=\"\n-0000f440: 6130 3134 3038 2e68 746d 6c23 6133 3966 a01408.html#a39f\n-0000f450: 3061 6561 3935 3264 3061 3130 6362 6335 0aea952d0a10cbc5\n-0000f460: 6263 6135 3863 3465 3939 3266 3122 3e73 bca58c4e992f1\">s\n-0000f470: 697a 655f 7479 7065 3c2f 613e 206b 3d30 ize_type k=0\n-0000f480: 3b20 6b26 6c74 3b3c 6120 636c 6173 733d ; k<cols\n-0000f4e0: 3b20 6b2b 2b29 3c2f 6469 763e 0a3c 6469 ; k++)
    .<\n-0000f500: 6120 6964 3d22 6c30 3033 3539 2220 6e61 a id=\"l00359\" na\n-0000f510: 6d65 3d22 6c30 3033 3539 223e 3c2f 613e me=\"l00359\">\n-0000f520: 3c73 7061 6e20 636c 6173 733d 226c 696e 359 C[i\n-0000f550: 5d5b 6a5d 202b 3d20 282a 3c73 7061 6e20 ][j] += (*\n-0000f570: 7468 6973 3c2f 7370 616e 3e29 5b69 5d5b this)[i][\n-0000f580: 6b5d 2a3c 6120 636c 6173 733d 2263 6f64 k]*M[k][j];\n-0000f5e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0000f630: 2033 3630 3c2f 7370 616e 3e20 2020 2020 360 \n-0000f640: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
    .
    361 \n-0000f6a0: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
    .<\n-0000f6c0: 6120 6964 3d22 6c30 3033 3632 2220 6e61 a id=\"l00362\" na\n-0000f6d0: 6d65 3d22 6c30 3033 3632 223e 3c2f 613e me=\"l00362\">\n-0000f6e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 362 return C\n-0000f730: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-0000f780: 2020 3336 333c 2f73 7061 6e3e 2020 2020 363 \n-0000f790: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
    .
    .<\n-0000f7a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0000f7b0: 3e3c 6120 6964 3d22 6c30 3033 3634 2220 > 364
    .
    365 \n-0000f850: 2020 203c 7370 616e 2063 6c61 7373 3d22 // make\n-0000f870: 2074 6869 7320 7468 696e 6720 6120 6d61 this thing a ma\n-0000f880: 7472 6978 3c2f 7370 616e 3e3c 2f64 6976 trix.
    \n-0000f920: 2033 3636 3c2f 613e 3c2f 7370 616e 3e20 366 \n-0000f930: 2020 203c 7370 616e 2063 6c61 7373 3d22 static<\n-0000f950: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> con\n-0000f970: 7374 6578 7072 3c2f 7370 616e 3e20 3c61 stexpr si\n-0000f9d0: 7a65 5f74 7970 653c 2f61 3e20 3c61 2063 ze_type mat\n-0000fa30: 5f72 6f77 733c 2f61 3e28 2920 7b20 3c73 _rows() { return ROWS; }.
    367 stati\n-0000fb30: 633c 2f73 7061 6e3e 203c 7370 616e 2063 c c\n-0000fb50: 6f6e 7374 6578 7072 3c2f 7370 616e 3e20 onstexpr \n-0000fb60: 3c61 2063 6c61 7373 3d22 636f 6465 2068 \n-0000fbb0: 7369 7a65 5f74 7970 653c 2f61 3e20 3c61 size_type m\n-0000fc10: 6174 5f63 6f6c 733c 2f61 3e28 2920 7b20 at_cols() { \n-0000fc20: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n-0000fc40: 3c2f 7370 616e 3e20 434f 4c53 3b20 7d3c COLS; }<\n-0000fc50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0000fca0: 3336 383c 2f73 7061 6e3e 203c 2f64 6976 368 .
    .\n-0000fea0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n-0000ff00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0000ff30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 371 DUNE_\n-0000ffb0: 4153 5345 5254 5f42 4f55 4e44 533c 2f61 ASSERT_BOUNDS(i < ROWS);<\n-0000ffd0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00010020: 3337 323c 2f73 7061 6e3e 2020 2020 2020 372 \n-00010030: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n-00010050: 3c2f 7370 616e 3e20 5f64 6174 615b 695d _data[i]\n-00010060: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-000100b0: 2020 3337 333c 2f73 7061 6e3e 2020 2020 373 \n-000100c0: 7d3c 2f64 6976 3e0a 3c2f 6469 763e 0a3c }
    .
    .<\n-000100d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-000100e0: 3e3c 6120 6964 3d22 6c30 3033 3734 2220 > 374
    .
    \n-00010170: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-000101a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d \n-00010200: 3337 353c 2f61 3e3c 2f73 7061 6e3e 2020 375 \n-00010210: 2020 3c61 2063 6c61 7373 3d22 636f 6465 co\n-00010240: 6e73 745f 726f 775f 7265 6665 7265 6e63 nst_row_referenc\n-00010250: 653c 2f61 3e20 3c61 2063 6c61 7373 3d22 e mat_acces\n-000102b0: 733c 2f61 3e20 2820 3c61 2063 6c61 7373 s ( size_typ\n-00010310: 653c 2f61 3e20 6920 293c 7370 616e 2063 e i ) \n-00010330: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
    376\n-00010390: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 \n-000103b0: 203c 2f73 7061 6e3e 7b3c 2f64 6976 3e0a {
    .\n-000103c0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-000103f0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 377 DUNE_A\n-00010470: 5353 4552 545f 424f 554e 4453 3c2f 613e SSERT_BOUNDS\n-00010480: 2869 2026 6c74 3b20 524f 5753 293b 3c2f (i < ROWS);.
    3\n-000104e0: 3738 3c2f 7370 616e 3e20 2020 2020 203c 78 <\n-000104f0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00010500: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n-00010510: 2f73 7061 6e3e 205f 6461 7461 5b69 5d3b /span> _data[i];\n-00010520: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00010570: 2033 3739 3c2f 7370 616e 3e20 2020 207d 379 }\n-00010580: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n-000105a0: 3c61 2069 643d 226c 3030 3338 3022 206e 380 };
    ..
    38\n-00010640: 313c 2f73 7061 6e3e 203c 2f64 6976 3e0a 1
    .\n-00010650: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-00010710: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-00010740: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 385 template&l\n-00010770: 743b 636c 6173 7320 4b26 6774 3b3c 2f64 t;class K>.
    38\n-000107d0: 363c 2f73 7061 6e3e 2020 3c73 7061 6e20 6 \n-000107f0: 636c 6173 7320 3c2f 7370 616e 3e46 6965 class Fie\n-00010800: 6c64 4d61 7472 6978 266c 743b 4b2c 312c ldMatrix<K,1,\n-00010810: 3126 6774 3b20 3a20 3c73 7061 6e20 636c 1> : pu\n-00010830: 626c 6963 3c2f 7370 616e 3e20 4465 6e73 blic Dens\n-00010840: 654d 6174 7269 7826 6c74 3b20 4669 656c eMatrix< Fiel\n-00010850: 644d 6174 7269 7826 6c74 3b4b 2c31 2c31 dMatrix<K,1,1\n-00010860: 2667 743b 2026 6774 3b3c 2f64 6976 3e0a > >
    .\n-00010870: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-000108e0: 3c61 2069 643d 226c 3030 3338 3822 206e 388 FieldVecto\n-00010930: 7226 6c74 3b4b 2c31 2667 743b 205f 6461 r<K,1> _da\n-00010940: 7461 3b3c 2f64 6976 3e0a 3c64 6976 2063 ta;
    .
    389 \n-000109a0: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef<\n-000109c0: 2f73 7061 6e3e 2044 656e 7365 4d61 7472 /span> DenseMatr\n-000109d0: 6978 266c 743b 2046 6965 6c64 4d61 7472 ix< FieldMatr\n-000109e0: 6978 266c 743b 4b2c 312c 3126 6774 3b20 ix<K,1,1> \n-000109f0: 2667 743b 2042 6173 653b 3c2f 6469 763e > Base;
    \n-00010a00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00010a30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 390 pub\n-00010a70: 6c69 633c 2f73 7061 6e3e 3a3c 2f64 6976 lic:.
    391<\n-00010ad0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-00010af0: 2f2f 2073 7461 6e64 6172 6420 636f 6e73 // standard cons\n-00010b00: 7472 7563 746f 7220 616e 6420 6576 6572 tructor and ever\n-00010b10: 7974 6869 6e67 2069 7320 7375 6666 6963 ything is suffic\n-00010b20: 6965 6e74 202e 2e2e 3c2f 7370 616e 3e3c ient ...<\n-00010b30: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00010b80: 3339 323c 2f73 7061 6e3e 203c 2f64 6976 392 .
    393<\n-00010be0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-00010c00: 2f2f 3d3d 3d3d 3d20 7479 7065 2064 6566 //===== type def\n-00010c10: 696e 6974 696f 6e73 2061 6e64 2063 6f6e initions and con\n-00010c20: 7374 616e 7473 3c2f 7370 616e 3e3c 2f64 stants.
    39\n-00010c80: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n-00010c90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-00010e30: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00010e40: 6e6f 223e 2020 3339 373c 2f73 7061 6e3e no\"> 397
    \n-00010e50: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-00010ea0: 2020 3430 303c 2f73 7061 6e3e 2020 2020 400 \n-00010eb0: 3c73 7061 6e20 636c 6173 733d 226b 6579 constexpr<\n-00010ed0: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> sta\n-00010ef0: 7469 633c 2f73 7061 6e3e 203c 7370 616e tic int \n-00010f20: 3c61 2063 6c61 7373 3d22 636f 6465 2068 blocklevel \n-00010f80: 3d20 313b 3c2f 6469 763e 0a3c 6469 7620 = 1;
    .
    401 \n-00010fe0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00011030: 2034 3032 3c2f 7370 616e 3e20 2020 203c 402 <\n-00011040: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00011050: 6f72 6422 3e74 7970 6564 6566 3c2f 7370 ord\">typedef typena\n-00011080: 6d65 3c2f 7370 616e 3e20 3c61 2063 6c61 me Base::\n-000110e0: 726f 775f 7479 7065 3c2f 613e 203c 6120 row_type row\n-00011140: 5f74 7970 653c 2f61 3e3b 3c2f 6469 763e _type;
    \n-00011150: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-000111c0: 6120 6964 3d22 6c30 3034 3034 2220 6e61 a id=\"l00404\" na\n-000111d0: 6d65 3d22 6c30 3034 3034 223e 3c2f 613e me=\"l00404\">\n-000111e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 404 typed\n-00011220: 6566 3c2f 7370 616e 3e20 3c73 7061 6e20 ef \n-00011240: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n-00011250: 3c61 2063 6c61 7373 3d22 636f 6465 2068 \n-000112a0: 4261 7365 3a3a 726f 775f 7265 6665 7265 Base::row_refere\n-000112b0: 6e63 653c 2f61 3e20 3c61 2063 6c61 7373 nce row_refe\n-00011310: 7265 6e63 653c 2f61 3e3b 3c2f 6469 763e rence;
    \n-00011320: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n-000114a0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00011510: 6120 6964 3d22 6c30 3034 3039 2220 6e61 a id=\"l00409\" na\n-00011520: 6d65 3d22 6c30 3034 3039 223e 3c2f 613e me=\"l00409\">\n-00011530: 3c73 7061 6e20 636c 6173 733d 226c 696e 409 const\n-00011570: 6578 7072 3c2f 7370 616e 3e20 3c73 7061 expr static \n-000115a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 int rows =\n-00011620: 2031 3b3c 2f64 6976 3e0a 3c64 6976 2063 1;
    .
    412 \n-00011680: 2020 3c73 7061 6e20 636c 6173 733d 226b constexp\n-000116a0: 723c 2f73 7061 6e3e 203c 7370 616e 2063 r s\n-000116c0: 7461 7469 633c 2f73 7061 6e3e 203c 7370 tatic int cols = 1;\n-00011750: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000117a0: 2034 3133 3c2f 7370 616e 3e20 3c2f 6469 413 .
    414\n-00011800: 3c2f 7370 616e 3e20 2020 203c 7370 616e //===== constru\n-00011830: 6374 6f72 733c 2f73 7061 6e3e 3c2f 6469 ctors.
    417\n-00011890: 3c2f 7370 616e 3e20 2020 203c 7370 616e constexpr FieldMatrix() = default;\n-00011950: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000119a0: 2034 3138 3c2f 7370 616e 3e20 3c2f 6469 418 .
    421\n-00011a00: 3c2f 7370 616e 3e20 2020 203c 6120 636c Fiel\n-00011a60: 644d 6174 7269 783c 2f61 3e28 7374 643a dMatrix(std:\n-00011a70: 3a69 6e69 7469 616c 697a 6572 5f6c 6973 :initializer_lis\n-00011a80: 7426 6c74 3b3c 6120 636c 6173 733d 2263 t<Dune::FieldVect\n-00011ac0: 6f72 266c 743b 4b2c 2031 2667 743b 3c2f or<K, 1>> con\n-00011af0: 7374 3c2f 7370 616e 3e20 2661 6d70 3b6c st &l\n-00011b00: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
    .
    \n-00011b50: 2020 3432 323c 2f73 7061 6e3e 2020 2020 422 \n-00011b60: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n-00011bb0: 2020 3432 333c 2f73 7061 6e3e 2020 2020 423 \n-00011bc0: 2020 7374 643a 3a63 6f70 795f 6e28 6c2e std::copy_n(l.\n-00011bd0: 6265 6769 6e28 292c 2073 7464 3a3a 6d69 begin(), std::mi\n-00011be0: 6e28 3c73 7061 6e20 636c 6173 733d 226b n(static_c\n-00011c00: 6173 7426 6c74 3b3c 2f73 7061 6e3e 2073 ast< s\n-00011c10: 7464 3a3a 7369 7a65 5f74 203c 7370 616e td::size_t >( 1 \n-00011c40: 292c 206c 2e73 697a 6528 2929 2c20 2661 ), l.size()), &a\n-00011c50: 6d70 3b5f 6461 7461 293b 3c2f 6469 763e mp;_data);
    \n-00011c60: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n-00011cc0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00011d30: 6120 6964 3d22 6c30 3034 3236 2220 6e61 a id=\"l00426\" na\n-00011d40: 6d65 3d22 6c30 3034 3236 223e 3c2f 613e me=\"l00426\">\n-00011d50: 3c73 7061 6e20 636c 6173 733d 226c 696e 426 templ\n-00011d90: 6174 653c 2f73 7061 6e3e 2026 6c74 3b3c ate <<\n-00011da0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00011db0: 6f72 6422 3e63 6c61 7373 203c 2f73 7061 ord\">class T,
    .
    427 \n-00011e20: 2020 2020 2020 2020 2020 2020 203c 7370 typename = std::enable\n-00011e60: 5f69 665f 7426 6c74 3b48 6173 4465 6e73 _if_t<HasDens\n-00011e70: 654d 6174 7269 7841 7373 6967 6e65 7226 eMatrixAssigner&\n-00011e80: 6c74 3b46 6965 6c64 4d61 7472 6978 2c20 lt;FieldMatrix, \n-00011e90: 5426 6774 3b3a 3a76 616c 7565 2667 743b T>::value>\n-00011ea0: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    ..
    429 \n-00011ff0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    430 \n-00012050: 2020 202a 3c73 7061 6e20 636c 6173 733d *this = rhs;.
    431\n-000120d0: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    432\n-00012130: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-00012140: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00012150: 3e3c 6120 6964 3d22 6c30 3034 3333 2220 > 433 usi\n-000121b0: 6e67 203c 2f73 7061 6e3e 4261 7365 3a3a ng Base::\n-000121c0: 6f70 6572 6174 6f72 3d3b 3c2f 6469 763e operator=;
    \n-000121d0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00012240: 6120 6964 3d22 6c30 3034 3336 2220 6e61 a id=\"l00436\" na\n-00012250: 6d65 3d22 6c30 3034 3336 223e 3c2f 613e me=\"l00436\">\n-00012260: 3c73 7061 6e20 636c 6173 733d 226c 696e 436 FieldMatrix\n-00012290: 266c 743b 4b2c 2031 2c20 3126 6774 3b20 <K, 1, 1> \n-000122a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 transposed(\n-00012300: 293c 7370 616e 2063 6c61 7373 3d22 6b65 ) const
    .
    437<\n-00012380: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00012390: 6f72 6422 3e20 2020 203c 2f73 7061 6e3e ord\"> \n-000123a0: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n-000123f0: 2020 3433 383c 2f73 7061 6e3e 2020 2020 438 \n-00012400: 2020 3c73 7061 6e20 636c 6173 733d 226b retu\n-00012420: 726e 3c2f 7370 616e 3e20 2a3c 7370 616e rn *this;.
    43\n-000124a0: 393c 2f73 7061 6e3e 2020 2020 7d3c 2f64 9 }.
    44\n-00012500: 303c 2f73 7061 6e3e 203c 2f64 6976 3e0a 0
    .\n-00012510: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    443 \n-00012620: 2020 203c 7370 616e 2063 6c61 7373 3d22 friend<\n-00012640: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> aut\n-00012660: 6f3c 2f73 7061 6e3e 203c 6120 636c 6173 o operator\n-000126c0: 2b20 3c2f 613e 2820 3c73 7061 6e20 636c + ( co\n-000126e0: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst Fiel\n-00012740: 644d 6174 7269 783c 2f61 3e26 616d 703b dMatrix&\n-00012750: 206d 6174 7269 7841 2c3c 2f64 6976 3e0a matrixA,
    .\n-00012760: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    445 \n-00012880: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
    .
    446 \n-000128e0: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n-00012900: 7475 726e 3c2f 7370 616e 3e20 4669 656c turn Fiel\n-00012910: 644d 6174 7269 7826 6c74 3b74 7970 656e dMatrix<typen\n-00012920: 616d 6520 5072 6f6d 6f74 696f 6e54 7261 ame PromotionTra\n-00012930: 6974 7326 6c74 3b4b 2c4f 7468 6572 5363 its<K,OtherSc\n-00012940: 616c 6172 2667 743b 3a3a 5072 6f6d 6f74 alar>::Promot\n-00012950: 6564 5479 7065 2c31 2c31 2667 743b 7b6d edType,1,1>{m\n-00012960: 6174 7269 7841 5b30 5d5b 305d 202b 206d atrixA[0][0] + m\n-00012970: 6174 7269 7842 5b30 5d5b 305d 7d3b 3c2f atrixB[0][0]};.
    4\n-000129d0: 3437 3c2f 7370 616e 3e20 2020 207d 3c2f 47 }.
    4\n-00012a30: 3438 3c2f 7370 616e 3e20 3c2f 6469 763e 48
    \n-00012a40: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00012a70: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 450 t\n-00012ab0: 656d 706c 6174 653c 2f73 7061 6e3e 2026 emplate &\n-00012ac0: 6c74 3b3c 7370 616e 2063 6c61 7373 3d22 lt;class <\n-00012ae0: 2f73 7061 6e3e 3c61 2063 6c61 7373 3d22 /span>Scalar,
    .
    451 \n-00012ba0: 2020 2020 2020 2020 2020 2073 7464 3a3a std::\n-00012bb0: 656e 6162 6c65 5f69 665f 7426 6c74 3b49 enable_if_t<I\n-00012bc0: 734e 756d 6265 7226 6c74 3b53 6361 6c61 sNumber<Scala\n-00012bd0: 7226 6774 3b3a 3a76 616c 7565 2c20 3c73 r>::value, int> = 0>.
    4\n-00012c60: 3532 3c2f 7370 616e 3e20 2020 203c 7370 52 friend\n-00012c90: 203c 7370 616e 2063 6c61 7373 3d22 6b65 auto operator+ \n-00012d10: 2820 3c73 7061 6e20 636c 6173 733d 226b ( const FieldMatri\n-00012d90: 783c 2f61 3e26 616d 703b 206d 6174 7269 x& matri\n-00012da0: 782c 3c2f 6469 763e 0a3c 6469 7620 636c x,
    .
    453 \n-00012e00: 2020 2020 2020 2020 2020 2020 2020 2020 \n-00012e10: 2020 2020 2020 2020 203c 7370 616e 2063 c\n-00012e30: 6f6e 7374 3c2f 7370 616e 3e20 5363 616c onst Scal\n-00012e40: 6172 2661 6d70 3b20 7363 616c 6172 293c ar& scalar)<\n-00012e50: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00012ea0: 3435 343c 2f73 7061 6e3e 2020 2020 7b3c 454 {<\n-00012eb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00012f00: 3435 353c 2f73 7061 6e3e 2020 2020 2020 455 \n-00012f10: 3c73 7061 6e20 636c 6173 733d 226b 6579 return\n-00012f30: 3c2f 7370 616e 3e20 4669 656c 644d 6174 FieldMat\n-00012f40: 7269 7826 6c74 3b74 7970 656e 616d 6520 rix<typename \n-00012f50: 5072 6f6d 6f74 696f 6e54 7261 6974 7326 PromotionTraits&\n-00012f60: 6c74 3b4b 2c53 6361 6c61 7226 6774 3b3a lt;K,Scalar>:\n-00012f70: 3a50 726f 6d6f 7465 6454 7970 652c 312c :PromotedType,1,\n-00012f80: 3126 6774 3b7b 6d61 7472 6978 5b30 5d5b 1>{matrix[0][\n-00012f90: 305d 202b 2073 6361 6c61 727d 3b3c 2f64 0] + scalar};.
    45\n-00012ff0: 363c 2f73 7061 6e3e 2020 2020 7d3c 2f64 6 }.
    45\n-00013050: 373c 2f73 7061 6e3e 203c 2f64 6976 3e0a 7
    .\n-00013060: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n-000131b0: 2020 3436 303c 2f73 7061 6e3e 2020 2020 460 \n-000131c0: 2020 2020 2020 2020 2020 7374 643a 3a65 std::e\n-000131d0: 6e61 626c 655f 6966 5f74 266c 743b 4973 nable_if_t<Is\n-000131e0: 4e75 6d62 6572 266c 743b 5363 616c 6172 Number<Scalar\n-000131f0: 2667 743b 3a3a 7661 6c75 652c 203c 7370 >::value, int> = 0>.
    46\n-00013280: 313c 2f73 7061 6e3e 2020 2020 3c73 7061 1 friend \n-000132b0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator+ (\n-00013330: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const Scalar& \n-00013360: 7363 616c 6172 2c3c 2f64 6976 3e0a 3c64 scalar,
    .\n-00013380: 3c61 2069 643d 226c 3030 3436 3222 206e 462 \n-000133d0: 2020 2020 2020 2020 2020 2020 2020 3c73 const\n-00013400: 203c 6120 636c 6173 733d 2263 6f64 6520 FieldMatrix& matrix).
    4\n-000134c0: 3633 3c2f 7370 616e 3e20 2020 207b 3c2f 63 {.
    4\n-00013520: 3634 3c2f 7370 616e 3e20 2020 2020 203c 64 <\n-00013530: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00013540: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n-00013550: 2f73 7061 6e3e 2046 6965 6c64 4d61 7472 /span> FieldMatr\n-00013560: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n-00013570: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n-00013580: 743b 5363 616c 6172 2c4b 2667 743b 3a3a t;Scalar,K>::\n-00013590: 5072 6f6d 6f74 6564 5479 7065 2c31 2c31 PromotedType,1,1\n-000135a0: 2667 743b 7b73 6361 6c61 7220 2b20 6d61 >{scalar + ma\n-000135b0: 7472 6978 5b30 5d5b 305d 7d3b 3c2f 6469 trix[0][0]};.
    465\n-00013610: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    466\n-00013670: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-00013680: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00013690: 3e3c 6120 6964 3d22 6c30 3034 3638 2220 > 468 tem\n-000136f0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n-00013700: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class OtherScalar&\n-00013730: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    469 \n-00013790: 2020 3c73 7061 6e20 636c 6173 733d 226b friend auto\n-000137d0: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 operator-\n-00013830: 203c 2f61 3e28 203c 7370 616e 2063 6c61 ( con\n-00013850: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st Field\n-000138b0: 4d61 7472 6978 3c2f 613e 2661 6d70 3b20 Matrix& \n-000138c0: 6d61 7472 6978 412c 3c2f 6469 763e 0a3c matrixA,
    .<\n-000138d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-000138e0: 3e3c 6120 6964 3d22 6c30 3034 3730 2220 > 470 \n-00013930: 2020 2020 2020 2020 2020 2020 2020 203c <\n-00013940: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00013950: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const FieldMatrix<\n-00013970: 3b4f 7468 6572 5363 616c 6172 2c31 2c31 ;OtherScalar,1,1\n-00013980: 2667 743b 2661 6d70 3b20 6d61 7472 6978 >& matrix\n-00013990: 4229 3c2f 6469 763e 0a3c 6469 7620 636c B)
    .
    471 \n-000139f0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    472 \n-00013a50: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n-00013a70: 7572 6e3c 2f73 7061 6e3e 2046 6965 6c64 urn Field\n-00013a80: 4d61 7472 6978 266c 743b 7479 7065 6e61 Matrix<typena\n-00013a90: 6d65 2050 726f 6d6f 7469 6f6e 5472 6169 me PromotionTrai\n-00013aa0: 7473 266c 743b 4b2c 4f74 6865 7253 6361 ts<K,OtherSca\n-00013ab0: 6c61 7226 6774 3b3a 3a50 726f 6d6f 7465 lar>::Promote\n-00013ac0: 6454 7970 652c 312c 3126 6774 3b7b 6d61 dType,1,1>{ma\n-00013ad0: 7472 6978 415b 305d 5b30 5d20 2d20 6d61 trixA[0][0] - ma\n-00013ae0: 7472 6978 425b 305d 5b30 5d7d 3b3c 2f64 trixB[0][0]};.
    47\n-00013b40: 333c 2f73 7061 6e3e 2020 2020 7d3c 2f64 3 }.
    47\n-00013ba0: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n-00013bb0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n-00013d00: 2020 3437 373c 2f73 7061 6e3e 2020 2020 477 \n-00013d10: 2020 2020 2020 2020 2020 7374 643a 3a65 std::e\n-00013d20: 6e61 626c 655f 6966 5f74 266c 743b 4973 nable_if_t<Is\n-00013d30: 4e75 6d62 6572 266c 743b 5363 616c 6172 Number<Scalar\n-00013d40: 2667 743b 3a3a 7661 6c75 652c 203c 7370 >::value, int> = 0>.
    47\n-00013dd0: 383c 2f73 7061 6e3e 2020 2020 3c73 7061 8 friend \n-00013e00: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator- (\n-00013e80: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const FieldMatrix\n-00013f00: 3c2f 613e 2661 6d70 3b20 6d61 7472 6978 & matrix\n-00013f10: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
    .
    \n-00013f60: 2020 3437 393c 2f73 7061 6e3e 2020 2020 479 \n-00013f70: 2020 2020 2020 2020 2020 2020 2020 2020 \n-00013f80: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n-00013fa0: 6e73 743c 2f73 7061 6e3e 2053 6361 6c61 nst Scala\n-00013fb0: 7226 616d 703b 2073 6361 6c61 7229 3c2f r& scalar).
    4\n-00014010: 3830 3c2f 7370 616e 3e20 2020 207b 3c2f 80 {.
    4\n-00014070: 3831 3c2f 7370 616e 3e20 2020 2020 203c 81 <\n-00014080: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00014090: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n-000140a0: 2f73 7061 6e3e 2046 6965 6c64 4d61 7472 /span> FieldMatr\n-000140b0: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n-000140c0: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n-000140d0: 743b 4b2c 5363 616c 6172 2667 743b 3a3a t;K,Scalar>::\n-000140e0: 5072 6f6d 6f74 6564 5479 7065 2c31 2c31 PromotedType,1,1\n-000140f0: 2667 743b 7b6d 6174 7269 785b 305d 5b30 >{matrix[0][0\n-00014100: 5d20 2d20 7363 616c 6172 7d3b 3c2f 6469 ] - scalar};.
    482\n-00014160: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    483\n-000141c0: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-000141d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-000141e0: 3e3c 6120 6964 3d22 6c30 3034 3835 2220 > 485 tem\n-00014240: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n-00014250: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class Scalar,\n-000142d0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00014320: 2034 3836 3c2f 7370 616e 3e20 2020 2020 486 \n-00014330: 2020 2020 2020 2020 2073 7464 3a3a 656e std::en\n-00014340: 6162 6c65 5f69 665f 7426 6c74 3b49 734e able_if_t<IsN\n-00014350: 756d 6265 7226 6c74 3b53 6361 6c61 7226 umber<Scalar&\n-00014360: 6774 3b3a 3a76 616c 7565 2c20 3c73 7061 gt;::value, int\n-00014390: 2667 743b 203d 2030 2667 743b 3c2f 6469 > = 0>.
    487\n-000143f0: 3c2f 7370 616e 3e20 2020 203c 7370 616e friend <\n-00014420: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00014430: 6f72 6422 3e61 7574 6f3c 2f73 7061 6e3e ord\">auto\n-00014440: 203c 6120 636c 6173 733d 2263 6f64 6520 \n-00014490: 6f70 6572 6174 6f72 2d20 3c2f 613e 2820 operator- ( \n-000144a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const Scalar& s\n-000144d0: 6361 6c61 722c 3c2f 6469 763e 0a3c 6469 calar,
    .<\n-000144f0: 6120 6964 3d22 6c30 3034 3838 2220 6e61 a id=\"l00488\" na\n-00014500: 6d65 3d22 6c30 3034 3838 223e 3c2f 613e me=\"l00488\">\n-00014510: 3c73 7061 6e20 636c 6173 733d 226c 696e 488 \n-00014540: 2020 2020 2020 2020 2020 2020 203c 7370 const \n-00014570: 3c61 2063 6c61 7373 3d22 636f 6465 2068 FieldMatrix\n-000145d0: 2661 6d70 3b20 6d61 7472 6978 293c 2f64 & matrix).
    48\n-00014630: 393c 2f73 7061 6e3e 2020 2020 7b3c 2f64 9 {.
    49\n-00014690: 303c 2f73 7061 6e3e 2020 2020 2020 3c73 0 return FieldMatri\n-000146d0: 7826 6c74 3b74 7970 656e 616d 6520 5072 x<typename Pr\n-000146e0: 6f6d 6f74 696f 6e54 7261 6974 7326 6c74 omotionTraits<\n-000146f0: 3b53 6361 6c61 722c 4b26 6774 3b3a 3a50 ;Scalar,K>::P\n-00014700: 726f 6d6f 7465 6454 7970 652c 312c 3126 romotedType,1,1&\n-00014710: 6774 3b7b 7363 616c 6172 202d 206d 6174 gt;{scalar - mat\n-00014720: 7269 785b 305d 5b30 5d7d 3b3c 2f64 6976 rix[0][0]};.
    491<\n-00014780: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    492<\n-000147e0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n-00014800: 3c61 2069 643d 226c 3030 3439 3422 206e 494 temp\n-00014860: 6c61 7465 3c2f 7370 616e 3e20 266c 743b late <\n-00014870: 3c73 7061 6e20 636c 6173 733d 226b 6579 class Scalar,<\n-000148f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00014940: 3439 353c 2f73 7061 6e3e 2020 2020 2020 495 \n-00014950: 2020 2020 2020 2020 7374 643a 3a65 6e61 std::ena\n-00014960: 626c 655f 6966 5f74 266c 743b 4973 4e75 ble_if_t<IsNu\n-00014970: 6d62 6572 266c 743b 5363 616c 6172 2667 mber<Scalar&g\n-00014980: 743b 3a3a 7661 6c75 652c 203c 7370 616e t;::value, int&\n-000149b0: 6774 3b20 3d20 3026 6774 3b3c 2f64 6976 gt; = 0>.
    496<\n-00014a10: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-00014a30: 6672 6965 6e64 3c2f 7370 616e 3e20 3c73 friend auto \n-00014a60: 3c61 2063 6c61 7373 3d22 636f 6465 2068 o\n-00014ab0: 7065 7261 746f 722a 203c 2f61 3e28 203c perator* ( <\n-00014ac0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00014ad0: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const FieldMatrix& matrix, \n-00014b50: 5363 616c 6172 2073 6361 6c61 7229 3c2f Scalar scalar).
    4\n-00014bb0: 3937 3c2f 7370 616e 3e20 2020 207b 3c2f 97 {.
    4\n-00014c10: 3938 3c2f 7370 616e 3e20 2020 2020 203c 98 <\n-00014c20: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00014c30: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n-00014c40: 2f73 7061 6e3e 2046 6965 6c64 4d61 7472 /span> FieldMatr\n-00014c50: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n-00014c60: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n-00014c70: 743b 4b2c 5363 616c 6172 2667 743b 3a3a t;K,Scalar>::\n-00014c80: 5072 6f6d 6f74 6564 5479 7065 2c31 2c31 PromotedType,1,1\n-00014c90: 2667 743b 207b 6d61 7472 6978 5b30 5d5b > {matrix[0][\n-00014ca0: 305d 202a 2073 6361 6c61 727d 3b3c 2f64 0] * scalar};.
    49\n-00014d00: 393c 2f73 7061 6e3e 2020 2020 7d3c 2f64 9 }.
    50\n-00014d60: 303c 2f73 7061 6e3e 203c 2f64 6976 3e0a 0
    .\n-00014d70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n-00014ec0: 2020 3530 333c 2f73 7061 6e3e 2020 2020 503 \n-00014ed0: 2020 2020 2020 2020 2020 7374 643a 3a65 std::e\n-00014ee0: 6e61 626c 655f 6966 5f74 266c 743b 4973 nable_if_t<Is\n-00014ef0: 4e75 6d62 6572 266c 743b 5363 616c 6172 Number<Scalar\n-00014f00: 2667 743b 3a3a 7661 6c75 652c 203c 7370 >::value, int> = 0>.
    50\n-00014f90: 343c 2f73 7061 6e3e 2020 2020 3c73 7061 4 friend \n-00014fc0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator* (\n-00015040: 2053 6361 6c61 7220 7363 616c 6172 2c20 Scalar scalar, \n-00015050: 3c73 7061 6e20 636c 6173 733d 226b 6579 const FieldMatrix<\n-000150d0: 2f61 3e26 616d 703b 206d 6174 7269 7829 /a>& matrix)\n-000150e0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00015130: 2035 3035 3c2f 7370 616e 3e20 2020 207b 505 {\n-00015140: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00015190: 2035 3036 3c2f 7370 616e 3e20 2020 2020 506 \n-000151a0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n-000151c0: 6e3c 2f73 7061 6e3e 2046 6965 6c64 4d61 n FieldMa\n-000151d0: 7472 6978 266c 743b 7479 7065 6e61 6d65 trix<typename\n-000151e0: 2050 726f 6d6f 7469 6f6e 5472 6169 7473 PromotionTraits\n-000151f0: 266c 743b 4b2c 5363 616c 6172 2667 743b <K,Scalar>\n-00015200: 3a3a 5072 6f6d 6f74 6564 5479 7065 2c31 ::PromotedType,1\n-00015210: 2c31 2667 743b 207b 7363 616c 6172 202a ,1> {scalar *\n-00015220: 206d 6174 7269 785b 305d 5b30 5d7d 3b3c matrix[0][0]};<\n-00015230: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00015280: 3530 373c 2f73 7061 6e3e 2020 2020 7d3c 507 }<\n-00015290: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-000152e0: 3530 383c 2f73 7061 6e3e 203c 2f64 6976 508 .
    510<\n-00015340: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-00015360: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n-00015370: 266c 743b 3c73 7061 6e20 636c 6173 733d <class \n-00015390: 3c2f 7370 616e 3e3c 6120 636c 6173 733d Scalar,
    .
    511 \n-00015450: 2020 2020 2020 2020 2020 2020 7374 643a std:\n-00015460: 3a65 6e61 626c 655f 6966 5f74 266c 743b :enable_if_t<\n-00015470: 4973 4e75 6d62 6572 266c 743b 5363 616c IsNumber<Scal\n-00015480: 6172 2667 743b 3a3a 7661 6c75 652c 203c ar>::value, <\n-00015490: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-000154a0: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype\">int> = 0><\n-000154c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00015510: 3531 323c 2f73 7061 6e3e 2020 2020 3c73 512 friend auto operator/ ( const FieldMatr\n-00015640: 6978 3c2f 613e 2661 6d70 3b20 6d61 7472 ix& matr\n-00015650: 6978 2c20 5363 616c 6172 2073 6361 6c61 ix, Scalar scala\n-00015660: 7229 3c2f 6469 763e 0a3c 6469 7620 636c r)
    .
    513 \n-000156c0: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    514 \n-00015720: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n-00015740: 7572 6e3c 2f73 7061 6e3e 2046 6965 6c64 urn Field\n-00015750: 4d61 7472 6978 266c 743b 7479 7065 6e61 Matrix<typena\n-00015760: 6d65 2050 726f 6d6f 7469 6f6e 5472 6169 me PromotionTrai\n-00015770: 7473 266c 743b 4b2c 5363 616c 6172 2667 ts<K,Scalar&g\n-00015780: 743b 3a3a 5072 6f6d 6f74 6564 5479 7065 t;::PromotedType\n-00015790: 2c31 2c31 2667 743b 207b 6d61 7472 6978 ,1,1> {matrix\n-000157a0: 5b30 5d5b 305d 202f 2073 6361 6c61 727d [0][0] / scalar}\n-000157b0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-00015800: 2020 3531 353c 2f73 7061 6e3e 2020 2020 515 \n-00015810: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
    .
    \n-00015860: 2020 3531 363c 2f73 7061 6e3e 203c 2f64 516 .
    51\n-000158c0: 373c 2f73 7061 6e3e 2020 2020 3c73 7061 7 //===== solve<\n-000158f0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
    .<\n-00015910: 6120 6964 3d22 6c30 3035 3138 2220 6e61 a id=\"l00518\" na\n-00015920: 6d65 3d22 6c30 3035 3138 223e 3c2f 613e me=\"l00518\">\n-00015930: 3c73 7061 6e20 636c 6173 733d 226c 696e 518
    .
    521 \n-000159b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n-000159d0: 2f73 7061 6e3e 2026 6c74 3b3c 7370 616e /span> <class Ot\n-00015a00: 6865 7253 6361 6c61 722c 203c 7370 616e herScalar, int \n-00015a30: 6f74 6865 7243 6f6c 7326 6774 3b3c 2f64 otherCols>.
    52\n-00015a90: 323c 2f73 7061 6e3e 2020 2020 3c73 7061 2 friend \n-00015ac0: 3c73 7061 6e20 636c 6173 733d 226b 6579 auto operator* (\n-00015b40: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const FieldMatrix\n-00015bc0: 3c2f 613e 2661 6d70 3b20 6d61 7472 6978 & matrix\n-00015bd0: 412c 3c2f 6469 763e 0a3c 6469 7620 636c A,
    .
    523 \n-00015c30: 2020 2020 2020 2020 2020 2020 2020 2020 \n-00015c40: 2020 2020 2020 2020 203c 7370 616e 2063 c\n-00015c60: 6f6e 7374 3c2f 7370 616e 3e20 4669 656c onst Fiel\n-00015c70: 644d 6174 7269 7826 6c74 3b4f 7468 6572 dMatrix<Other\n-00015c80: 5363 616c 6172 2c20 312c 206f 7468 6572 Scalar, 1, other\n-00015c90: 436f 6c73 2667 743b 2661 6d70 3b20 6d61 Cols>& ma\n-00015ca0: 7472 6978 4229 3c2f 6469 763e 0a3c 6469 trixB)
    .<\n-00015cc0: 6120 6964 3d22 6c30 3035 3234 2220 6e61 a id=\"l00524\" na\n-00015cd0: 6d65 3d22 6c30 3035 3234 223e 3c2f 613e me=\"l00524\">\n-00015ce0: 3c73 7061 6e20 636c 6173 733d 226c 696e 524 {
    .<\n-00015d20: 6120 6964 3d22 6c30 3035 3235 2220 6e61 a id=\"l00525\" na\n-00015d30: 6d65 3d22 6c30 3035 3235 223e 3c2f 613e me=\"l00525\">\n-00015d40: 3c73 7061 6e20 636c 6173 733d 226c 696e 525 FieldMatr\n-00015d70: 6978 266c 743b 7479 7065 6e61 6d65 2050 ix<typename P\n-00015d80: 726f 6d6f 7469 6f6e 5472 6169 7473 266c romotionTraits&l\n-00015d90: 743b 4b2c 4f74 6865 7253 6361 6c61 7226 t;K,OtherScalar&\n-00015da0: 6774 3b3a 3a50 726f 6d6f 7465 6454 7970 gt;::PromotedTyp\n-00015db0: 652c 312c 6f74 6865 7243 6f6c 7326 6774 e,1,otherCols>\n-00015dc0: 3b20 7265 7375 6c74 3b3c 2f64 6976 3e0a ; result;
    .\n-00015dd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-00015e60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00015e70: 6e6f 223e 2020 3532 373c 2f73 7061 6e3e no\"> 527\n-00015e80: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-00015ea0: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n-00015f00: 5f74 7970 653c 2f61 3e20 6a20 3d20 303b _type j = 0;\n-00015f10: 206a 2026 6c74 3b20 6d61 7472 6978 422e j < matrixB.\n-00015f20: 6d61 745f 636f 6c73 2829 3b20 2b2b 6a29 mat_cols(); ++j)\n-00015f30: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00015f80: 2035 3238 3c2f 7370 616e 3e20 2020 2020 528 \n-00015f90: 2020 2072 6573 756c 745b 305d 5b6a 5d20 result[0][j] \n-00015fa0: 3d20 6d61 7472 6978 415b 305d 5b30 5d20 = matrixA[0][0] \n-00015fb0: 2a20 6d61 7472 6978 425b 305d 5b6a 5d3b * matrixB[0][j];\n-00015fc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00016010: 2035 3239 3c2f 7370 616e 3e20 3c2f 6469 529 .
    530\n-00016070: 3c2f 7370 616e 3e20 2020 2020 203c 7370 return result;.
    531\n-00016100: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    532\n-00016160: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-00016170: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00016180: 3e3c 6120 6964 3d22 6c30 3035 3339 2220 > 539 tem\n-000161e0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n-000161f0: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;class OtherMatrix,\n-00016220: 2073 7464 3a3a 656e 6162 6c65 5f69 665f std::enable_if_\n-00016230: 7426 6c74 3b3c 2f64 6976 3e0a 3c64 6976 t<
    .<\n-00016270: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00016280: 6e6f 223e 2020 3534 303c 2f73 7061 6e3e no\"> 540\n-00016290: 2020 2020 2020 496d 706c 3a3a 4973 5374 Impl::IsSt\n-000162a0: 6174 6963 5369 7a65 4d61 7472 6978 5f76 aticSizeMatrix_v\n-000162b0: 266c 743b 4f74 6865 724d 6174 7269 7826 <OtherMatrix&\n-000162c0: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    541 \n-00016320: 2020 2020 616e 6420 6e6f 7420 496d 706c and not Impl\n-00016330: 3a3a 4973 4669 656c 644d 6174 7269 785f ::IsFieldMatrix_\n-00016340: 7626 6c74 3b4f 7468 6572 4d61 7472 6978 v<OtherMatrix\n-00016350: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    542 \n-000163b0: 2020 2020 2061 6e64 2028 4f74 6865 724d and (OtherM\n-000163c0: 6174 7269 783a 3a72 6f77 733d 3d31 293c atrix::rows==1)<\n-000163d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00016420: 3534 333c 2f73 7061 6e3e 2020 2020 2020 543 \n-00016430: 2c20 3c73 7061 6e20 636c 6173 733d 226b , int<\n-00016450: 2f73 7061 6e3e 2667 743b 203d 2030 2667 /span>> = 0&g\n-00016460: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    .
    544 \n-000164c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 friend auto<\n-00016500: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> operator* \n-00016560: 3c2f 613e 2820 3c73 7061 6e20 636c 6173 ( cons\n-00016580: 743c 2f73 7061 6e3e 203c 6120 636c 6173 t FieldM\n-000165e0: 6174 7269 783c 2f61 3e26 616d 703b 206d atrix& m\n-000165f0: 6174 7269 7841 2c3c 2f64 6976 3e0a 3c64 atrixA,
    .\n-00016610: 3c61 2069 643d 226c 3030 3534 3522 206e 545 \n-00016660: 2020 2020 2020 2020 2020 2020 2020 3c73 const\n-00016690: 204f 7468 6572 4d61 7472 6978 2661 6d70 OtherMatrix&\n-000166a0: 3b20 6d61 7472 6978 4229 3c2f 6469 763e ; matrixB)
    \n-000166b0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n-00016710: 0a3c 6469 7620 636c 6173 733d 226c 696e ..\n-00016860: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-00016930: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-00016a60: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00016a70: 6e6f 223e 2020 3535 303c 2f73 7061 6e3e no\"> 550\n-00016a80: 2020 2020 2020 2020 6d61 7472 6978 422e matrixB.\n-00016a90: 6d74 7628 6d61 7472 6978 415b 6a5d 2c20 mtv(matrixA[j], \n-00016aa0: 7265 7375 6c74 5b6a 5d29 3b3c 2f64 6976 result[j]);.
    551<\n-00016b00: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return result;.
    552<\n-00016b90: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    553<\n-00016bf0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n-00016c10: 3c61 2069 643d 226c 3030 3536 3022 206e 560 temp\n-00016c70: 6c61 7465 3c2f 7370 616e 3e20 266c 743b late <\n-00016c80: 3c73 7061 6e20 636c 6173 733d 226b 6579 class OtherMatrix, \n-00016cb0: 7374 643a 3a65 6e61 626c 655f 6966 5f74 std::enable_if_t\n-00016cc0: 266c 743b 3c2f 6469 763e 0a3c 6469 7620 <
    .
    561 \n-00016d20: 2020 2020 2049 6d70 6c3a 3a49 7353 7461 Impl::IsSta\n-00016d30: 7469 6353 697a 654d 6174 7269 785f 7626 ticSizeMatrix_v&\n-00016d40: 6c74 3b4f 7468 6572 4d61 7472 6978 2667 lt;OtherMatrix&g\n-00016d50: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
    .
    562 \n-00016db0: 2020 2061 6e64 206e 6f74 2049 6d70 6c3a and not Impl:\n-00016dc0: 3a49 7346 6965 6c64 4d61 7472 6978 5f76 :IsFieldMatrix_v\n-00016dd0: 266c 743b 4f74 6865 724d 6174 7269 7826 <OtherMatrix&\n-00016de0: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    563 \n-00016e40: 2020 2020 616e 6420 284f 7468 6572 4d61 and (OtherMa\n-00016e50: 7472 6978 3a3a 636f 6c73 3d3d 3129 3c2f trix::cols==1).
    5\n-00016eb0: 3634 3c2f 7370 616e 3e20 2020 2020 202c 64 ,\n-00016ec0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int> = 0>\n-00016ef0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    ..
    \n-00017080: 2020 3536 363c 2f73 7061 6e3e 2020 2020 566 \n-00017090: 2020 2020 2020 2020 2020 2020 2020 2020 \n-000170a0: 2020 2020 2020 2020 3c73 7061 6e20 636c co\n-000170c0: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst Fiel\n-00017120: 644d 6174 7269 783c 2f61 3e26 616d 703b dMatrix&\n-00017130: 206d 6174 7269 7842 293c 2f64 6976 3e0a matrixB)
    .\n-00017140: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-000171a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-000172f0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00017300: 3e3c 6120 6964 3d22 6c30 3035 3639 2220 > 569 Dune::Field\n-00017380: 4d61 7472 6978 266c 743b 4669 656c 642c Matrix<Field,\n-00017390: 204f 7468 6572 4d61 7472 6978 3a3a 726f OtherMatrix::ro\n-000173a0: 7773 2c20 636f 6c73 2667 743b 3c2f 613e ws, cols>\n-000173b0: 2072 6573 756c 743b 3c2f 6469 763e 0a3c result;
    .<\n-000173c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-000173d0: 3e3c 6120 6964 3d22 6c30 3035 3730 2220 > 570 for (s\n-00017440: 7464 3a3a 7369 7a65 5f74 206a 3d30 3b20 td::size_t j=0; \n-00017450: 6a26 6c74 3b3c 6120 636c 6173 733d 2263 j<cols; \n-000174b0: 2b2b 6a29 3c2f 6469 763e 0a3c 6469 7620 ++j)
    .
    571 \n-00017510: 2020 2020 207b 3c2f 6469 763e 0a3c 6469 {
    .<\n-00017530: 6120 6964 3d22 6c30 3035 3732 2220 6e61 a id=\"l00572\" na\n-00017540: 6d65 3d22 6c30 3035 3732 223e 3c2f 613e me=\"l00572\">\n-00017550: 3c73 7061 6e20 636c 6173 733d 226c 696e 572 a\n-00017590: 7574 6f3c 2f73 7061 6e3e 2042 5f6a 203d uto B_j =\n-000175a0: 2049 6d70 6c3a 3a43 6f6c 756d 6e56 6563 Impl::ColumnVec\n-000175b0: 746f 7256 6965 7728 6d61 7472 6978 422c torView(matrixB,\n-000175c0: 206a 293b 3c2f 6469 763e 0a3c 6469 7620 j);
    .
    573 \n-00017620: 2020 2020 2020 203c 7370 616e 2063 6c61 aut\n-00017640: 6f3c 2f73 7061 6e3e 2072 6573 756c 745f o result_\n-00017650: 6a20 3d20 496d 706c 3a3a 436f 6c75 6d6e j = Impl::Column\n-00017660: 5665 6374 6f72 5669 6577 2872 6573 756c VectorView(resul\n-00017670: 742c 206a 293b 3c2f 6469 763e 0a3c 6469 t, j);
    .<\n-00017690: 6120 6964 3d22 6c30 3035 3734 2220 6e61 a id=\"l00574\" na\n-000176a0: 6d65 3d22 6c30 3035 3734 223e 3c2f 613e me=\"l00574\">\n-000176b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 574 matrixA\n-000176e0: 2e6d 7628 425f 6a2c 2072 6573 756c 745f .mv(B_j, result_\n-000176f0: 6a29 3b3c 2f64 6976 3e0a 3c64 6976 2063 j);
    .
    575 \n-00017750: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
    .<\n-00017790: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-000177a0: 6e6f 223e 2020 3537 363c 2f73 7061 6e3e no\"> 576\n-000177b0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-000177d0: 7265 7475 726e 3c2f 7370 616e 3e20 7265 return re\n-000177e0: 7375 6c74 3b3c 2f64 6976 3e0a 3c64 6976 sult;
    .<\n-00017820: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00017830: 6e6f 223e 2020 3537 373c 2f73 7061 6e3e no\"> 577\n-00017840: 2020 2020 7d3c 2f64 6976 3e0a 3c64 6976 }
    .<\n-00017880: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00017890: 6e6f 223e 2020 3537 383c 2f73 7061 6e3e no\"> 578\n-000178a0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n-000178f0: 2020 3538 303c 2f73 7061 6e3e 2020 2020 580 \n-00017900: 3c73 7061 6e20 636c 6173 733d 226b 6579 template<int l&\n-00017950: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
    .
    581 \n-000179b0: 2020 4669 656c 644d 6174 7269 7826 6c74 FieldMatrix<\n-000179c0: 3b4b 2c6c 2c31 2667 743b 203c 6120 636c ;K,l,1> left\n-00017a20: 6d75 6c74 6970 6c79 616e 793c 2f61 3e20 multiplyany \n-00017a30: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (const FieldMatrix&\n-00017a60: 6c74 3b4b 2c6c 2c31 2667 743b 2661 6d70 lt;K,l,1>&\n-00017a70: 3b20 3c61 2063 6c61 7373 3d22 636f 6465 ; M) \n-00017ae0: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
    582\n-00017b40: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 \n-00017b60: 203c 2f73 7061 6e3e 7b3c 2f64 6976 3e0a {
    .\n-00017b70: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-00017c20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00017c30: 6e6f 223e 2020 3538 343c 2f73 7061 6e3e no\"> 584
    \n-00017c40: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-00017c60: 666f 723c 2f73 7061 6e3e 2028 3c61 2063 for (size\n-00017cc0: 5f74 7970 653c 2f61 3e20 6a3d 303b 206a _type j=0; j\n-00017cd0: 266c 743b 6c3b 206a 2b2b 293c 2f64 6976 <l; j++).
    585<\n-00017d30: 2f73 7061 6e3e 2020 2020 2020 2020 435b /span> C[\n-00017d40: 6a5d 5b30 5d20 3d20 3c61 2063 6c61 7373 j][0] = M[j\n-00017da0: 5d5b 305d 2a28 2a3c 7370 616e 2063 6c61 ][0]*(*thi\n-00017dc0: 733c 2f73 7061 6e3e 295b 305d 5b30 5d3b s)[0][0];\n-00017dd0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00017e20: 2035 3836 3c2f 7370 616e 3e20 2020 2020 586 \n-00017e30: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n-00017e50: 6e3c 2f73 7061 6e3e 2043 3b3c 2f64 6976 n C;.
    587<\n-00017eb0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    588<\n-00017f10: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n-00017f30: 3c61 2069 643d 226c 3030 3539 3022 206e 590 FieldMatr\n-00017fd0: 6978 3c2f 613e 2661 6d70 3b20 3c61 2063 ix& rig\n-00018030: 6874 6d75 6c74 6970 6c79 3c2f 613e 2028 htmultiply (\n-00018040: 3c73 7061 6e20 636c 6173 733d 226b 6579 const FieldMatrix<\n-000180c0: 2f61 3e26 616d 703b 203c 6120 636c 6173 /a>& M)\n-00018120: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00018170: 2035 3931 3c2f 7370 616e 3e20 2020 207b 591 {\n-00018180: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000181d0: 2035 3932 3c2f 7370 616e 3e20 2020 2020 592 \n-000181e0: 205f 6461 7461 5b30 5d20 2a3d 203c 6120 _data[0] *= M<\n-00018240: 2f61 3e5b 305d 5b30 5d3b 3c2f 6469 763e /a>[0][0];
    \n-00018250: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-00018310: 6120 6964 3d22 6c30 3035 3934 2220 6e61 a id=\"l00594\" na\n-00018320: 6d65 3d22 6c30 3035 3934 223e 3c2f 613e me=\"l00594\">\n-00018330: 3c73 7061 6e20 636c 6173 733d 226c 696e 594 }
    .<\n-00018370: 6120 6964 3d22 6c30 3035 3935 2220 6e61 a id=\"l00595\" na\n-00018380: 6d65 3d22 6c30 3035 3935 223e 3c2f 613e me=\"l00595\">\n-00018390: 3c73 7061 6e20 636c 6173 733d 226c 696e 595
    .
    597 \n-00018410: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n-00018430: 2f73 7061 6e3e 266c 743b 3c73 7061 6e20 /span><int l\n-00018460: 2667 743b 3c2f 6469 763e 0a3c 6469 7620 >
    .
    598 \n-000184c0: 2020 2046 6965 6c64 4d61 7472 6978 266c FieldMatrix&l\n-000184d0: 743b 4b2c 312c 6c26 6774 3b20 3c61 2063 t;K,1,l> rig\n-00018530: 6874 6d75 6c74 6970 6c79 616e 793c 2f61 htmultiplyany (const FieldMatri\n-00018570: 7826 6c74 3b4b 2c31 2c6c 2667 743b 2661 x<K,1,l>&a\n-00018580: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; M) const.
    5\n-00018650: 3939 3c2f 7370 616e 3e3c 7370 616e 2063 99 \n-00018670: 2020 203c 2f73 7061 6e3e 7b3c 2f64 6976 {.
    600<\n-000186d0: 2f73 7061 6e3e 2020 2020 2020 4669 656c /span> Fiel\n-000186e0: 644d 6174 7269 7826 6c74 3b4b 2c31 2c6c dMatrix<K,1,l\n-000186f0: 2667 743b 2043 3b3c 2f64 6976 3e0a 3c64 > C;
    .\n-00018710: 3c61 2069 643d 226c 3030 3630 3122 206e 601
    .
    602 \n-000187b0: 2020 2020 3c73 7061 6e20 636c 6173 733d fo\n-000187d0: 723c 2f73 7061 6e3e 2028 3c61 2063 6c61 r (size_t\n-00018830: 7970 653c 2f61 3e20 6a3d 303b 206a 266c ype j=0; j&l\n-00018840: 743b 6c3b 206a 2b2b 293c 2f64 6976 3e0a t;l; j++)
    .\n-00018850: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n-00018880: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 603 C[0]\n-000188b0: 5b6a 5d20 3d20 3c61 2063 6c61 7373 3d22 [j] = M[0][\n-00018910: 6a5d 2a5f 6461 7461 5b30 5d3b 3c2f 6469 j]*_data[0];.
    604\n-00018970: 3c2f 7370 616e 3e20 2020 2020 203c 7370 return C;
    .\n-000189c0: 3c61 2069 643d 226c 3030 3630 3522 206e 605 }
    .\n-00018a20: 3c61 2069 643d 226c 3030 3630 3622 206e 606
    .
    607 \n-00018ac0: 2020 3c73 7061 6e20 636c 6173 733d 2263 // make \n-00018ae0: 7468 6973 2074 6869 6e67 2061 206d 6174 this thing a mat\n-00018af0: 7269 783c 2f73 7061 6e3e 3c2f 6469 763e rix
    \n-00018b00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00018b30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 608 s\n-00018b70: 7461 7469 633c 2f73 7061 6e3e 203c 7370 tatic constexpr size_type mat_rows(\n-00018c60: 2920 7b20 3c73 7061 6e20 636c 6173 733d ) { re\n-00018c80: 7475 726e 3c2f 7370 616e 3e20 313b 207d turn 1; }\n-00018c90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00018ce0: 2036 3039 3c2f 7370 616e 3e20 2020 203c 609 <\n-00018cf0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00018d00: 6f72 6422 3e73 7461 7469 633c 2f73 7061 ord\">static constex\n-00018d30: 7072 3c2f 7370 616e 3e20 3c61 2063 6c61 pr size_t\n-00018d90: 7970 653c 2f61 3e20 3c61 2063 6c61 7373 ype mat_col\n-00018df0: 733c 2f61 3e28 2920 7b20 3c73 7061 6e20 s() { return 1; }
    .<\n-00018e40: 6120 6964 3d22 6c30 3036 3130 2220 6e61 a id=\"l00610\" na\n-00018e50: 6d65 3d22 6c30 3036 3130 223e 3c2f 613e me=\"l00610\">\n-00018e60: 3c73 7061 6e20 636c 6173 733d 226c 696e 610
    ..<\n-00019050: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00019060: 6e6f 223e 2020 3631 323c 2f73 7061 6e3e no\"> 612\n-00019070: 2020 2020 7b3c 2f64 6976 3e0a 3c64 6976 {
    .<\n-000190b0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-000190c0: 6e6f 223e 2020 3631 333c 2f73 7061 6e3e no\"> 613\n-000190d0: 2020 2020 2020 3c61 2063 6c61 7373 3d22 DUNE_ASSER\n-00019130: 545f 424f 554e 4453 3c2f 613e 2869 203d T_BOUNDS(i =\n-00019140: 3d20 3029 3b3c 2f64 6976 3e0a 3c64 6976 = 0);
    .<\n-00019180: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00019190: 6e6f 223e 2020 3631 343c 2f73 7061 6e3e no\"> 614\n-000191a0: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-000191c0: 7265 7475 726e 3c2f 7370 616e 3e20 5f64 return _d\n-000191d0: 6174 613b 3c2f 6469 763e 0a3c 6469 7620 ata;
    .
    615 \n-00019230: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
    .
    616 \n-00019290: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000192e0: 2036 3137 3c2f 7370 616e 3e20 2020 203c 617 <\n-000192f0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-00019300: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef\" href=\"\n-00019310: 6130 3134 3038 2e68 746d 6c23 6132 3930 a01408.html#a290\n-00019320: 6430 6236 3937 3131 6439 6538 6166 3137 d0b69711d9e8af17\n-00019330: 3833 6263 3533 3232 6664 6334 6522 3e63 83bc5322fdc4e\">c\n-00019340: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n-00019350: 6365 3c2f 613e 203c 6120 636c 6173 733d ce mat_acce\n-000193b0: 7373 3c2f 613e 2028 5b5b 6d61 7962 655f ss ([[maybe_\n-000193c0: 756e 7573 6564 5d5d 203c 6120 636c 6173 unused]] size_ty\n-00019420: 7065 3c2f 613e 2069 293c 7370 616e 2063 pe i) \n-00019440: 636f 6e73 743c 2f73 7061 6e3e 3c2f 6469 const.
    618\n-000194a0: 3c2f 7370 616e 3e3c 7370 616e 2063 6c61 \n-000194c0: 203c 2f73 7061 6e3e 7b3c 2f64 6976 3e0a {
    .\n-000194d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-000195a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-00019630: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-00019640: 3e3c 6120 6964 3d22 6c30 3036 3231 2220 > 621 }
    .<\n-00019690: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-000196a0: 3e3c 6120 6964 3d22 6c30 3036 3232 2220 > 622
    .
    624 \n-00019740: 2020 203c 6120 636c 6173 733d 2263 6f64 FieldMatrix<\n-000197a0: 2f61 3e26 616d 703b 203c 6120 636c 6173 /a>& operat\n-00019800: 6f72 2b3d 203c 2f61 3e28 3c73 7061 6e20 or+= (\n-00019820: 636f 6e73 743c 2f73 7061 6e3e 204b 2661 const K&a\n-00019830: 6d70 3b20 6b29 3c2f 6469 763e 0a3c 6469 mp; k)
    .<\n-00019850: 6120 6964 3d22 6c30 3036 3235 2220 6e61 a id=\"l00625\" na\n-00019860: 6d65 3d22 6c30 3036 3235 223e 3c2f 613e me=\"l00625\">\n-00019870: 3c73 7061 6e20 636c 6173 733d 226c 696e 625 {
    .<\n-000198b0: 6120 6964 3d22 6c30 3036 3236 2220 6e61 a id=\"l00626\" na\n-000198c0: 6d65 3d22 6c30 3036 3236 223e 3c2f 613e me=\"l00626\">\n-000198d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 626 _data[0] \n-00019900: 2b3d 206b 3b3c 2f64 6976 3e0a 3c64 6976 += k;
    .<\n-00019940: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-00019950: 6e6f 223e 2020 3632 373c 2f73 7061 6e3e no\"> 627\n-00019960: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-00019980: 7265 7475 726e 3c2f 7370 616e 3e20 282a return (*\n-00019990: 3c73 7061 6e20 636c 6173 733d 226b 6579 this);
    .
    628 \n-00019a10: 2020 7d3c 2f64 6976 3e0a 3c64 6976 2063 }
    .
    629 <\n-00019a70: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00019ac0: 3633 313c 2f73 7061 6e3e 2020 2020 3c61 631 F\n-00019b20: 6965 6c64 4d61 7472 6978 3c2f 613e 2661 ieldMatrix&a\n-00019b30: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; operator-= \n-00019b90: 3c2f 613e 283c 7370 616e 2063 6c61 7373 (const\n-00019bb0: 3c2f 7370 616e 3e20 4b26 616d 703b 206b K& k\n-00019bc0: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
    .
    \n-00019c10: 2020 3633 323c 2f73 7061 6e3e 2020 2020 632 \n-00019c20: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n-00019c70: 2020 3633 333c 2f73 7061 6e3e 2020 2020 633 \n-00019c80: 2020 5f64 6174 615b 305d 202d 3d20 6b3b _data[0] -= k;\n-00019c90: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00019ce0: 2036 3334 3c2f 7370 616e 3e20 2020 2020 634 \n-00019cf0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n-00019d10: 6e3c 2f73 7061 6e3e 2028 2a3c 7370 616e n (*this);.
    6\n-00019d90: 3335 3c2f 7370 616e 3e20 2020 207d 3c2f 35 }.
    6\n-00019df0: 3336 3c2f 7370 616e 3e20 3c2f 6469 763e 36
    \n-00019e00: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00019e30: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 638 FieldM\n-00019eb0: 6174 7269 783c 2f61 3e26 616d 703b 203c atrix& <\n-00019ec0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-00019ed0: 5f66 756e 6374 696f 6e22 2068 7265 663d _function\" href=\n-00019ee0: 2261 3031 3430 302e 6874 6d6c 2361 3732 \"a01400.html#a72\n-00019ef0: 3162 3262 6334 6432 3239 3538 6561 3562 1b2bc4d22958ea5b\n-00019f00: 3037 6165 3535 3935 6636 3239 3537 223e 07ae5595f62957\">\n-00019f10: 6f70 6572 6174 6f72 2a3d 203c 2f61 3e28 operator*= (\n-00019f20: 3c73 7061 6e20 636c 6173 733d 226b 6579 const K& k).
    639\n-00019fa0: 3c2f 7370 616e 3e20 2020 207b 3c2f 6469 {.
    640\n-0001a000: 3c2f 7370 616e 3e20 2020 2020 205f 6461 _da\n-0001a010: 7461 5b30 5d20 2a3d 206b 3b3c 2f64 6976 ta[0] *= k;.
    641<\n-0001a070: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return (*this\n-0001a0c0: 3c2f 7370 616e 3e29 3b3c 2f64 6976 3e0a );
    .\n-0001a0d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-0001a130: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-0001a1c0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0001a1d0: 6e6f 223e 2020 3634 353c 2f73 7061 6e3e no\"> 645\n-0001a1e0: 2020 2020 3c61 2063 6c61 7373 3d22 636f FieldMatrix\n-0001a240: 3c2f 613e 2661 6d70 3b20 3c61 2063 6c61 & opera\n-0001a2a0: 746f 722f 3d20 3c2f 613e 283c 7370 616e tor/= (const K&\n-0001a2d0: 616d 703b 206b 293c 2f64 6976 3e0a 3c64 amp; k)
    .\n-0001a2f0: 3c61 2069 643d 226c 3030 3634 3622 206e 646 {
    .\n-0001a350: 3c61 2069 643d 226c 3030 3634 3722 206e 647 _data[0]\n-0001a3a0: 202f 3d20 6b3b 3c2f 6469 763e 0a3c 6469 /= k;
    .<\n-0001a3c0: 6120 6964 3d22 6c30 3036 3438 2220 6e61 a id=\"l00648\" na\n-0001a3d0: 6d65 3d22 6c30 3036 3438 223e 3c2f 613e me=\"l00648\">\n-0001a3e0: 3c73 7061 6e20 636c 6173 733d 226c 696e 648 return (\n-0001a430: 2a3c 7370 616e 2063 6c61 7373 3d22 6b65 *this);
    .
    649 \n-0001a4b0: 2020 207d 3c2f 6469 763e 0a3c 6469 7620 }
    .
    650 \n-0001a510: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001a560: 2036 3531 3c2f 7370 616e 3e20 2020 203c 651 <\n-0001a570: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class=\"comm\n-0001a580: 656e 7422 3e2f 2f3d 3d3d 3d3d 2063 6f6e ent\">//===== con\n-0001a590: 7665 7273 696f 6e20 6f70 6572 6174 6f72 version operator\n-0001a5a0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
    .\n-0001a5c0: 3c61 2069 643d 226c 3030 3635 3222 206e 652
    .
    653 \n-0001a660: 2020 3c73 7061 6e20 636c 6173 733d 226b operator\n-0001a680: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c co\n-0001a6a0: 6e73 743c 2f73 7061 6e3e 204b 2661 6d70 nst K&\n-0001a6b0: 3b20 2829 203c 7370 616e 2063 6c61 7373 ; () const\n-0001a6d0: 3c2f 7370 616e 3e20 7b20 3c73 7061 6e20 { return _data[0]; }.
    65\n-0001a760: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n-0001a770: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-0001a7d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001a7e0: 3e3c 6120 6964 3d22 6c30 3036 3536 2220 > 656
    .
    658 \n-0001a880: 203c 7370 616e 2063 6c61 7373 3d22 6b65 template<\n-0001a8a0: 2f73 7061 6e3e 266c 743b 3c73 7061 6e20 /span><\n-0001a8c0: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n-0001a8d0: 4b26 6774 3b3c 2f64 6976 3e0a 3c64 6976 K>
    .<\n-0001a910: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0001a920: 6e6f 223e 2020 3635 393c 2f73 7061 6e3e no\"> 659\n-0001a930: 2020 7374 643a 3a6f 7374 7265 616d 2661 std::ostream&a\n-0001a940: 6d70 3b20 3c61 2063 6c61 7373 3d22 636f mp; operator&l\n-0001a9a0: 743b 266c 743b 203c 2f61 3e28 7374 643a t;< (std:\n-0001a9b0: 3a6f 7374 7265 616d 2661 6d70 3b20 732c :ostream& s,\n-0001a9c0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const FieldMatrix&\n-0001a9f0: 6c74 3b4b 2c31 2c31 2667 743b 2661 6d70 lt;K,1,1>&\n-0001aa00: 3b20 6129 3c2f 6469 763e 0a3c 6469 7620 ; a)
    .
    660 \n-0001aa60: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    661 \n-0001aac0: 2073 2026 6c74 3b26 6c74 3b20 615b 305d s << a[0]\n-0001aad0: 5b30 5d3b 3c2f 6469 763e 0a3c 6469 7620 [0];
    .
    662 \n-0001ab30: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n-0001ab50: 7572 6e3c 2f73 7061 6e3e 2073 3b3c 2f64 urn s;.
    66\n-0001abb0: 333c 2f73 7061 6e3e 2020 7d3c 2f64 6976 3 }.
    664<\n-0001ac10: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n-0001ac30: 3c61 2069 643d 226c 3030 3636 3522 206e 665#en\n-0001ac90: 6469 6620 3c2f 7370 616e 3e3c 7370 616e dif // DOXYGEN
    .
    666 .
    .
    667<\n-0001ade0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> na\n-0001ae00: 6d65 7370 6163 6520 3c2f 7370 616e 3e46 mespace F\n-0001ae10: 4d61 7472 6978 4865 6c70 207b 3c2f 6469 MatrixHelp {.
    668\n-0001ae70: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-0001ae80: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001ae90: 3e3c 6120 6964 3d22 6c30 3036 3730 2220 > 670 tem\n-0001aef0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n-0001af00: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;typename<\n-0001af20: 2f73 7061 6e3e 204b 2667 743b 3c2f 6469 /span> K>.
    .
    671<\n-0001b010: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-0001b030: 7374 6174 6963 3c2f 7370 616e 3e20 3c73 static inline K invertMatri\n-0001b0c0: 783c 2f61 3e20 283c 7370 616e 2063 6c61 x (con\n-0001b0e0: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st FieldMatri\n-0001b120: 7826 6c74 3b4b 2c31 2c31 2667 743b 3c2f x<K,1,1> &matrix, \n-0001b140: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n-0001b170: 644d 6174 7269 7826 6c74 3b4b 2c31 2c31 dMatrix<K,1,1\n-0001b180: 2667 743b 3c2f 613e 2026 616d 703b 696e > &in\n-0001b190: 7665 7273 6529 3c2f 6469 763e 0a3c 6469 verse)
    .<\n-0001b1b0: 6120 6964 3d22 6c30 3036 3732 2220 6e61 a id=\"l00672\" na\n-0001b1c0: 6d65 3d22 6c30 3036 3732 223e 3c2f 613e me=\"l00672\">\n-0001b1d0: 3c73 7061 6e20 636c 6173 733d 226c 696e 672 {
    .<\n-0001b210: 6120 6964 3d22 6c30 3036 3733 2220 6e61 a id=\"l00673\" na\n-0001b220: 6d65 3d22 6c30 3036 3733 223e 3c2f 613e me=\"l00673\">\n-0001b230: 3c73 7061 6e20 636c 6173 733d 226c 696e 673 usi\n-0001b270: 6e67 203c 2f73 7061 6e3e 7265 616c 5f74 ng real_t\n-0001b280: 7970 6520 3d20 3c73 7061 6e20 636c 6173 ype = type\n-0001b2a0: 6e61 6d65 3c2f 7370 616e 3e20 3c61 2063 name Fiel\n-0001b300: 6454 7261 6974 7326 6c74 3b4b 2667 743b dTraits<K>\n-0001b310: 3a3a 7265 616c 5f74 7970 653c 2f61 3e3b ::real_type;\n-0001b320: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001b370: 2036 3734 3c2f 7370 616e 3e20 2020 2020 674 \n-0001b380: 2069 6e76 6572 7365 5b30 5d5b 305d 203d inverse[0][0] =\n-0001b390: 2072 6561 6c5f 7479 7065 2831 2e30 292f real_type(1.0)/\n-0001b3a0: 6d61 7472 6978 5b30 5d5b 305d 3b3c 2f64 matrix[0][0];.
    67\n-0001b400: 353c 2f73 7061 6e3e 2020 2020 2020 3c73 5 return matrix[0][\n-0001b440: 305d 3b3c 2f64 6976 3e0a 3c64 6976 2063 0];
    .
    676 \n-0001b4a0: 2020 7d3c 2f64 6976 3e0a 3c2f 6469 763e }
    .
    \n-0001b4b0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n-0001b520: 6120 6964 3d22 6c30 3036 3739 2220 6e61 a id=\"l00679\" na\n-0001b530: 6d65 3d22 6c30 3036 3739 223e 3c2f 613e me=\"l00679\">\n-0001b540: 3c73 7061 6e20 636c 6173 733d 226c 696e 679 templ\n-0001b580: 6174 653c 2f73 7061 6e3e 2026 6c74 3b3c ate <<\n-0001b590: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0001b5a0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord\">typename K>
    \n-0001b5c0: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
    .
    <\n-0001b650: 6120 636c 6173 733d 226c 696e 6522 2068 a class=\"line\" h\n-0001b660: 7265 663d 2261 3030 3433 362e 6874 6d6c ref=\"a00436.html\n-0001b670: 2361 3637 3135 3538 3135 6230 3334 3737 #a67155815b03477\n-0001b680: 3331 3239 6432 3162 6665 3339 3932 6630 3129d21bfe3992f0\n-0001b690: 6236 223e 2020 3638 303c 2f61 3e3c 2f73 b6\"> 680 st\n-0001b6c0: 6174 6963 3c2f 7370 616e 3e20 3c73 7061 atic inline \n-0001b6f0: 4b20 3c61 2063 6c61 7373 3d22 636f 6465 K invertMatrix_\n-0001b750: 7265 7454 7261 6e73 706f 7365 643c 2f61 retTransposed (const FieldMatrix<\n-0001b7c0: 3b4b 2c31 2c31 2667 743b 3c2f 613e 2026 ;K,1,1> &\n-0001b7d0: 616d 703b 6d61 7472 6978 2c20 3c61 2063 amp;matrix, FieldMat\n-0001b810: 7269 7826 6c74 3b4b 2c31 2c31 2667 743b rix<K,1,1>\n-0001b820: 3c2f 613e 2026 616d 703b 696e 7665 7273 &invers\n-0001b830: 6529 3c2f 6469 763e 0a3c 6469 7620 636c e)
    .
    681 \n-0001b890: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    682 \n-0001b8f0: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret\n-0001b910: 7572 6e3c 2f73 7061 6e3e 203c 6120 636c urn inve\n-0001b970: 7274 4d61 7472 6978 3c2f 613e 286d 6174 rtMatrix(mat\n-0001b980: 7269 782c 696e 7665 7273 6529 3b3c 2f64 rix,inverse);.
    68\n-0001b9e0: 333c 2f73 7061 6e3e 2020 2020 7d3c 2f64 3 }.
    .
    684 \n-0001ba50: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001baa0: 2036 3835 3c2f 7370 616e 3e20 3c2f 6469 685 .
    687\n-0001bb00: 3c2f 7370 616e 3e20 2020 203c 7370 616e template\n-0001bb30: 2026 6c74 3b3c 7370 616e 2063 6c61 7373 <typen\n-0001bb50: 616d 653c 2f73 7061 6e3e 204b 2667 743b ame K>\n-0001bb60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    .<\n-0001bbc0: 6120 6964 3d22 6c30 3036 3838 2220 6e61 a id=\"l00688\" na\n-0001bbd0: 6d65 3d22 6c30 3036 3838 223e 3c2f 613e me=\"l00688\">\n-0001bbe0: 3c73 7061 6e20 636c 6173 733d 226c 696e 688<\n-0001bc40: 2f61 3e3c 2f73 7061 6e3e 2020 2020 3c73 /a> static inline K invertM\n-0001bcf0: 6174 7269 783c 2f61 3e20 283c 7370 616e atrix (const FieldM\n-0001bd50: 6174 7269 7826 6c74 3b4b 2c32 2c32 2667 atrix<K,2,2&g\n-0001bd60: 743b 3c2f 613e 2026 616d 703b 6d61 7472 t; &matr\n-0001bd70: 6978 2c20 3c61 2063 6c61 7373 3d22 636f ix, \n-0001bda0: 4669 656c 644d 6174 7269 7826 6c74 3b4b FieldMatrix<K\n-0001bdb0: 2c32 2c32 2667 743b 3c2f 613e 2026 616d ,2,2> &am\n-0001bdc0: 703b 696e 7665 7273 6529 3c2f 6469 763e p;inverse)
    \n-0001bdd0: 0a3c 6469 7620 636c 6173 733d 226c 696e .\n-0001be30: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0001be60: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 690 using re\n-0001beb0: 616c 5f74 7970 6520 3d20 3c73 7061 6e20 al_type = \n-0001bed0: 7479 7065 6e61 6d65 3c2f 7370 616e 3e20 typename \n-0001bee0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 \n-0001bf30: 4669 656c 6454 7261 6974 7326 6c74 3b4b FieldTraits<K\n-0001bf40: 2667 743b 3a3a 7265 616c 5f74 7970 653c >::real_type<\n-0001bf50: 2f61 3e3b 3c2f 6469 763e 0a3c 6469 7620 /a>;
    .
    691 \n-0001bfb0: 2020 2020 203c 7370 616e 2063 6c61 7373 // co\n-0001bfd0: 6465 2067 656e 6572 6174 6564 2062 7920 de generated by \n-0001bfe0: 6d61 706c 653c 2f73 7061 6e3e 3c2f 6469 maple.
    692\n-0001c040: 3c2f 7370 616e 3e20 2020 2020 204b 2064 K d\n-0001c050: 6574 203d 2028 6d61 7472 6978 5b30 5d5b et = (matrix[0][\n-0001c060: 305d 2a6d 6174 7269 785b 315d 5b31 5d20 0]*matrix[1][1] \n-0001c070: 2d20 6d61 7472 6978 5b30 5d5b 315d 2a6d - matrix[0][1]*m\n-0001c080: 6174 7269 785b 315d 5b30 5d29 3b3c 2f64 atrix[1][0]);.
    69\n-0001c0e0: 333c 2f73 7061 6e3e 2020 2020 2020 4b20 3 K \n-0001c0f0: 6465 745f 3120 3d20 7265 616c 5f74 7970 det_1 = real_typ\n-0001c100: 6528 312e 3029 2f64 6574 3b3c 2f64 6976 e(1.0)/det;.
    694<\n-0001c160: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n-0001c170: 7273 655b 305d 5b30 5d20 3d20 2020 6d61 rse[0][0] = ma\n-0001c180: 7472 6978 5b31 5d5b 315d 202a 2064 6574 trix[1][1] * det\n-0001c190: 5f31 3b3c 2f64 6976 3e0a 3c64 6976 2063 _1;
    .
    695 \n-0001c1f0: 2020 2020 696e 7665 7273 655b 305d 5b31 inverse[0][1\n-0001c200: 5d20 3d20 2d20 6d61 7472 6978 5b30 5d5b ] = - matrix[0][\n-0001c210: 315d 202a 2064 6574 5f31 3b3c 2f64 6976 1] * det_1;.
    696<\n-0001c270: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n-0001c280: 7273 655b 315d 5b30 5d20 3d20 2d20 6d61 rse[1][0] = - ma\n-0001c290: 7472 6978 5b31 5d5b 305d 202a 2064 6574 trix[1][0] * det\n-0001c2a0: 5f31 3b3c 2f64 6976 3e0a 3c64 6976 2063 _1;
    .
    697 \n-0001c300: 2020 2020 696e 7665 7273 655b 315d 5b31 inverse[1][1\n-0001c310: 5d20 3d20 2020 6d61 7472 6978 5b30 5d5b ] = matrix[0][\n-0001c320: 305d 202a 2064 6574 5f31 3b3c 2f64 6976 0] * det_1;.
    698<\n-0001c380: 2f73 7061 6e3e 2020 2020 2020 3c73 7061 /span> return det;
    .<\n-0001c3c0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001c3d0: 3e3c 6120 6964 3d22 6c30 3036 3939 2220 > 699 }
    .<\n-0001c420: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001c470: 3730 303c 2f73 7061 6e3e 203c 2f64 6976 700 .
    703<\n-0001c4d0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-0001c4f0: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n-0001c500: 266c 743b 3c73 7061 6e20 636c 6173 733d <typena\n-0001c520: 6d65 3c2f 7370 616e 3e20 4b26 6774 3b3c me K><\n-0001c530: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>..\n-0001c7c0: 3c61 2069 643d 226c 3030 3730 3522 206e 705 {
    .\n-0001c820: 3c61 2069 643d 226c 3030 3730 3622 206e 706 us\n-0001c880: 696e 6720 3c2f 7370 616e 3e72 6561 6c5f ing real_\n-0001c890: 7479 7065 203d 203c 7370 616e 2063 6c61 type = typ\n-0001c8b0: 656e 616d 653c 2f73 7061 6e3e 203c 6120 ename Fie\n-0001c910: 6c64 5472 6169 7473 266c 743b 4b26 6774 ldTraits<K>\n-0001c920: 3b3a 3a72 6561 6c5f 7479 7065 3c2f 613e ;::real_type\n-0001c930: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-0001c980: 2020 3730 373c 2f73 7061 6e3e 2020 2020 707 \n-0001c990: 2020 3c73 7061 6e20 636c 6173 733d 2263 // code \n-0001c9b0: 6765 6e65 7261 7465 6420 6279 206d 6170 generated by map\n-0001c9c0: 6c65 3c2f 7370 616e 3e3c 2f64 6976 3e0a le
    .\n-0001c9d0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 \n-0001ca70: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0001caa0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 709 K det\n-0001cad0: 5f31 203d 2072 6561 6c5f 7479 7065 2831 _1 = real_type(1\n-0001cae0: 2e30 292f 6465 743b 3c2f 6469 763e 0a3c .0)/det;
    .<\n-0001caf0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001cb00: 3e3c 6120 6964 3d22 6c30 3037 3130 2220 > 710 inverse\n-0001cb50: 5b30 5d5b 305d 203d 2020 206d 6174 7269 [0][0] = matri\n-0001cb60: 785b 315d 5b31 5d20 2a20 6465 745f 313b x[1][1] * det_1;\n-0001cb70: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001cbc0: 2037 3131 3c2f 7370 616e 3e20 2020 2020 711 \n-0001cbd0: 2069 6e76 6572 7365 5b31 5d5b 305d 203d inverse[1][0] =\n-0001cbe0: 202d 206d 6174 7269 785b 305d 5b31 5d20 - matrix[0][1] \n-0001cbf0: 2a20 6465 745f 313b 3c2f 6469 763e 0a3c * det_1;
    .<\n-0001cc00: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001cc10: 3e3c 6120 6964 3d22 6c30 3037 3132 2220 > 712 inverse\n-0001cc60: 5b30 5d5b 315d 203d 202d 206d 6174 7269 [0][1] = - matri\n-0001cc70: 785b 315d 5b30 5d20 2a20 6465 745f 313b x[1][0] * det_1;\n-0001cc80: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001ccd0: 2037 3133 3c2f 7370 616e 3e20 2020 2020 713 \n-0001cce0: 2069 6e76 6572 7365 5b31 5d5b 315d 203d inverse[1][1] =\n-0001ccf0: 2020 206d 6174 7269 785b 305d 5b30 5d20 matrix[0][0] \n-0001cd00: 2a20 6465 745f 313b 3c2f 6469 763e 0a3c * det_1;
    .<\n-0001cd10: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001cd20: 3e3c 6120 6964 3d22 6c30 3037 3134 2220 > 714 return\n-0001cd90: 2064 6574 3b3c 2f64 6976 3e0a 3c64 6976 det;
    .<\n-0001cdd0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0001cde0: 6e6f 223e 2020 3731 353c 2f73 7061 6e3e no\"> 715\n-0001cdf0: 2020 2020 7d3c 2f64 6976 3e0a 3c2f 6469 }
    ..
    716\n-0001ce50: 3c2f 7370 616e 3e20 3c2f 6469 763e 0a3c
    .<\n-0001ce60: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001ce70: 3e3c 6120 6964 3d22 6c30 3037 3138 2220 > 718 tem\n-0001ced0: 706c 6174 653c 2f73 7061 6e3e 2026 6c74 plate <\n-0001cee0: 3b3c 7370 616e 2063 6c61 7373 3d22 6b65 ;typename<\n-0001cf00: 2f73 7061 6e3e 204b 2667 743b 3c2f 6469 /span> K>.
    .
    719<\n-0001cff0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-0001d010: 7374 6174 6963 3c2f 7370 616e 3e20 3c73 static inline K invertMatri\n-0001d0a0: 783c 2f61 3e20 283c 7370 616e 2063 6c61 x (con\n-0001d0c0: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st FieldMatri\n-0001d100: 7826 6c74 3b4b 2c33 2c33 2667 743b 3c2f x<K,3,3> &matrix, \n-0001d120: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n-0001d150: 644d 6174 7269 7826 6c74 3b4b 2c33 2c33 dMatrix<K,3,3\n-0001d160: 2667 743b 3c2f 613e 2026 616d 703b 696e > &in\n-0001d170: 7665 7273 6529 3c2f 6469 763e 0a3c 6469 verse)
    .<\n-0001d190: 6120 6964 3d22 6c30 3037 3230 2220 6e61 a id=\"l00720\" na\n-0001d1a0: 6d65 3d22 6c30 3037 3230 223e 3c2f 613e me=\"l00720\">\n-0001d1b0: 3c73 7061 6e20 636c 6173 733d 226c 696e 720 {
    .<\n-0001d1f0: 6120 6964 3d22 6c30 3037 3231 2220 6e61 a id=\"l00721\" na\n-0001d200: 6d65 3d22 6c30 3037 3231 223e 3c2f 613e me=\"l00721\">\n-0001d210: 3c73 7061 6e20 636c 6173 733d 226c 696e 721 usi\n-0001d250: 6e67 203c 2f73 7061 6e3e 7265 616c 5f74 ng real_t\n-0001d260: 7970 6520 3d20 3c73 7061 6e20 636c 6173 ype = type\n-0001d280: 6e61 6d65 3c2f 7370 616e 3e20 3c61 2063 name Fiel\n-0001d2e0: 6454 7261 6974 7326 6c74 3b4b 2667 743b dTraits<K>\n-0001d2f0: 3a3a 7265 616c 5f74 7970 653c 2f61 3e3b ::real_type;\n-0001d300: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001d350: 2037 3232 3c2f 7370 616e 3e20 2020 2020 722 \n-0001d360: 203c 7370 616e 2063 6c61 7373 3d22 636f // code g\n-0001d380: 656e 6572 6174 6564 2062 7920 6d61 706c enerated by mapl\n-0001d390: 653c 2f73 7061 6e3e 3c2f 6469 763e 0a3c e
    .<\n-0001d3a0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001d3b0: 3e3c 6120 6964 3d22 6c30 3037 3233 2220 > 723 K t4 =\n-0001d400: 206d 6174 7269 785b 305d 5b30 5d20 2a20 matrix[0][0] * \n-0001d410: 6d61 7472 6978 5b31 5d5b 315d 3b3c 2f64 matrix[1][1];.
    72\n-0001d470: 343c 2f73 7061 6e3e 2020 2020 2020 4b20 4 K \n-0001d480: 7436 2020 3d20 6d61 7472 6978 5b30 5d5b t6 = matrix[0][\n-0001d490: 305d 202a 206d 6174 7269 785b 315d 5b32 0] * matrix[1][2\n-0001d4a0: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
    .
    725 \n-0001d500: 2020 204b 2074 3820 203d 206d 6174 7269 K t8 = matri\n-0001d510: 785b 305d 5b31 5d20 2a20 6d61 7472 6978 x[0][1] * matrix\n-0001d520: 5b31 5d5b 305d 3b3c 2f64 6976 3e0a 3c64 [1][0];
    .\n-0001d540: 3c61 2069 643d 226c 3030 3732 3622 206e 726 K t10 = \n-0001d590: 6d61 7472 6978 5b30 5d5b 325d 202a 206d matrix[0][2] * m\n-0001d5a0: 6174 7269 785b 315d 5b30 5d3b 3c2f 6469 atrix[1][0];.
    727\n-0001d600: 3c2f 7370 616e 3e20 2020 2020 204b 2074 K t\n-0001d610: 3132 203d 206d 6174 7269 785b 305d 5b31 12 = matrix[0][1\n-0001d620: 5d20 2a20 6d61 7472 6978 5b32 5d5b 305d ] * matrix[2][0]\n-0001d630: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-0001d680: 2020 3732 383c 2f73 7061 6e3e 2020 2020 728 \n-0001d690: 2020 4b20 7431 3420 3d20 6d61 7472 6978 K t14 = matrix\n-0001d6a0: 5b30 5d5b 325d 202a 206d 6174 7269 785b [0][2] * matrix[\n-0001d6b0: 325d 5b30 5d3b 3c2f 6469 763e 0a3c 6469 2][0];
    .<\n-0001d6d0: 6120 6964 3d22 6c30 3037 3239 2220 6e61 a id=\"l00729\" na\n-0001d6e0: 6d65 3d22 6c30 3037 3239 223e 3c2f 613e me=\"l00729\">\n-0001d6f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 729
    .
    730 \n-0001d770: 2020 204b 2064 6574 203d 2028 7434 2a6d K det = (t4*m\n-0001d780: 6174 7269 785b 325d 5b32 5d2d 7436 2a6d atrix[2][2]-t6*m\n-0001d790: 6174 7269 785b 325d 5b31 5d2d 7438 2a6d atrix[2][1]-t8*m\n-0001d7a0: 6174 7269 785b 325d 5b32 5d2b 3c2f 6469 atrix[2][2]+.
    731\n-0001d800: 3c2f 7370 616e 3e20 2020 2020 2020 2020 \n-0001d810: 2020 2020 2020 7431 302a 6d61 7472 6978 t10*matrix\n-0001d820: 5b32 5d5b 315d 2b74 3132 2a6d 6174 7269 [2][1]+t12*matri\n-0001d830: 785b 315d 5b32 5d2d 7431 342a 6d61 7472 x[1][2]-t14*matr\n-0001d840: 6978 5b31 5d5b 315d 293b 3c2f 6469 763e ix[1][1]);
    \n-0001d850: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0001d880: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 732 K t17\n-0001d8b0: 203d 2072 6561 6c5f 7479 7065 2831 2e30 = real_type(1.0\n-0001d8c0: 292f 6465 743b 3c2f 6469 763e 0a3c 6469 )/det;
    .<\n-0001d8e0: 6120 6964 3d22 6c30 3037 3333 2220 6e61 a id=\"l00733\" na\n-0001d8f0: 6d65 3d22 6c30 3037 3333 223e 3c2f 613e me=\"l00733\">\n-0001d900: 3c73 7061 6e20 636c 6173 733d 226c 696e 733
    .
    734 \n-0001d980: 2020 2069 6e76 6572 7365 5b30 5d5b 305d inverse[0][0]\n-0001d990: 203d 2020 286d 6174 7269 785b 315d 5b31 = (matrix[1][1\n-0001d9a0: 5d20 2a20 6d61 7472 6978 5b32 5d5b 325d ] * matrix[2][2]\n-0001d9b0: 202d 206d 6174 7269 785b 315d 5b32 5d20 - matrix[1][2] \n-0001d9c0: 2a20 6d61 7472 6978 5b32 5d5b 315d 292a * matrix[2][1])*\n-0001d9d0: 7431 373b 3c2f 6469 763e 0a3c 6469 7620 t17;
    .
    735 \n-0001da30: 2020 2020 2069 6e76 6572 7365 5b30 5d5b inverse[0][\n-0001da40: 315d 203d 202d 286d 6174 7269 785b 305d 1] = -(matrix[0]\n-0001da50: 5b31 5d20 2a20 6d61 7472 6978 5b32 5d5b [1] * matrix[2][\n-0001da60: 325d 202d 206d 6174 7269 785b 305d 5b32 2] - matrix[0][2\n-0001da70: 5d20 2a20 6d61 7472 6978 5b32 5d5b 315d ] * matrix[2][1]\n-0001da80: 292a 7431 373b 3c2f 6469 763e 0a3c 6469 )*t17;
    .<\n-0001daa0: 6120 6964 3d22 6c30 3037 3336 2220 6e61 a id=\"l00736\" na\n-0001dab0: 6d65 3d22 6c30 3037 3336 223e 3c2f 613e me=\"l00736\">\n-0001dac0: 3c73 7061 6e20 636c 6173 733d 226c 696e 736 inverse[0\n-0001daf0: 5d5b 325d 203d 2020 286d 6174 7269 785b ][2] = (matrix[\n-0001db00: 305d 5b31 5d20 2a20 6d61 7472 6978 5b31 0][1] * matrix[1\n-0001db10: 5d5b 325d 202d 206d 6174 7269 785b 305d ][2] - matrix[0]\n-0001db20: 5b32 5d20 2a20 6d61 7472 6978 5b31 5d5b [2] * matrix[1][\n-0001db30: 315d 292a 7431 373b 3c2f 6469 763e 0a3c 1])*t17;
    .<\n-0001db40: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001db50: 3e3c 6120 6964 3d22 6c30 3037 3337 2220 > 737 inverse\n-0001dba0: 5b31 5d5b 305d 203d 202d 286d 6174 7269 [1][0] = -(matri\n-0001dbb0: 785b 315d 5b30 5d20 2a20 6d61 7472 6978 x[1][0] * matrix\n-0001dbc0: 5b32 5d5b 325d 202d 206d 6174 7269 785b [2][2] - matrix[\n-0001dbd0: 315d 5b32 5d20 2a20 6d61 7472 6978 5b32 1][2] * matrix[2\n-0001dbe0: 5d5b 305d 292a 7431 373b 3c2f 6469 763e ][0])*t17;
    \n-0001dbf0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0001dc20: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 738 inver\n-0001dc50: 7365 5b31 5d5b 315d 203d 2020 286d 6174 se[1][1] = (mat\n-0001dc60: 7269 785b 305d 5b30 5d20 2a20 6d61 7472 rix[0][0] * matr\n-0001dc70: 6978 5b32 5d5b 325d 202d 2074 3134 2920 ix[2][2] - t14) \n-0001dc80: 2a20 7431 373b 3c2f 6469 763e 0a3c 6469 * t17;
    .<\n-0001dca0: 6120 6964 3d22 6c30 3037 3339 2220 6e61 a id=\"l00739\" na\n-0001dcb0: 6d65 3d22 6c30 3037 3339 223e 3c2f 613e me=\"l00739\">\n-0001dcc0: 3c73 7061 6e20 636c 6173 733d 226c 696e 739 inverse[1\n-0001dcf0: 5d5b 325d 203d 202d 2874 362d 7431 3029 ][2] = -(t6-t10)\n-0001dd00: 202a 2074 3137 3b3c 2f64 6976 3e0a 3c64 * t17;
    .\n-0001dd20: 3c61 2069 643d 226c 3030 3734 3022 206e 740 inverse[\n-0001dd70: 325d 5b30 5d20 3d20 2028 6d61 7472 6978 2][0] = (matrix\n-0001dd80: 5b31 5d5b 305d 202a 206d 6174 7269 785b [1][0] * matrix[\n-0001dd90: 325d 5b31 5d20 2d20 6d61 7472 6978 5b31 2][1] - matrix[1\n-0001dda0: 5d5b 315d 202a 206d 6174 7269 785b 325d ][1] * matrix[2]\n-0001ddb0: 5b30 5d29 202a 2074 3137 3b3c 2f64 6976 [0]) * t17;.
    741<\n-0001de10: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n-0001de20: 7273 655b 325d 5b31 5d20 3d20 2d28 6d61 rse[2][1] = -(ma\n-0001de30: 7472 6978 5b30 5d5b 305d 202a 206d 6174 trix[0][0] * mat\n-0001de40: 7269 785b 325d 5b31 5d20 2d20 7431 3229 rix[2][1] - t12)\n-0001de50: 202a 2074 3137 3b3c 2f64 6976 3e0a 3c64 * t17;
    .\n-0001de70: 3c61 2069 643d 226c 3030 3734 3222 206e 742 inverse[\n-0001dec0: 325d 5b32 5d20 3d20 2028 7434 2d74 3829 2][2] = (t4-t8)\n-0001ded0: 202a 2074 3137 3b3c 2f64 6976 3e0a 3c64 * t17;
    .\n-0001def0: 3c61 2069 643d 226c 3030 3734 3322 206e 743
    .
    744 \n-0001df90: 2020 2020 3c73 7061 6e20 636c 6173 733d re\n-0001dfb0: 7475 726e 3c2f 7370 616e 3e20 6465 743b turn det;\n-0001dfc0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001e010: 2037 3435 3c2f 7370 616e 3e20 2020 207d 745 }\n-0001e020: 3c2f 6469 763e 0a3c 2f64 6976 3e0a 3c64
    .
    .\n-0001e040: 3c61 2069 643d 226c 3030 3734 3622 206e 746
    .
    748 \n-0001e0e0: 2020 3c73 7061 6e20 636c 6173 733d 226b template\n-0001e100: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <typename K>
    ..
    749 stati\n-0001e240: 633c 2f73 7061 6e3e 203c 7370 616e 2063 c i\n-0001e260: 6e6c 696e 653c 2f73 7061 6e3e 204b 203c nline K <\n-0001e270: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-0001e280: 5f66 756e 6374 696f 6e22 2068 7265 663d _function\" href=\n-0001e290: 2261 3030 3433 362e 6874 6d6c 2361 3637 \"a00436.html#a67\n-0001e2a0: 3135 3538 3135 6230 3334 3737 3331 3239 155815b034773129\n-0001e2b0: 6432 3162 6665 3339 3932 6630 6236 223e d21bfe3992f0b6\">\n-0001e2c0: 696e 7665 7274 4d61 7472 6978 5f72 6574 invertMatrix_ret\n-0001e2d0: 5472 616e 7370 6f73 6564 3c2f 613e 2028 Transposed (\n-0001e2e0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const F\n-0001e330: 6965 6c64 4d61 7472 6978 266c 743b 4b2c ieldMatrix<K,\n-0001e340: 332c 3326 6774 3b3c 2f61 3e20 2661 6d70 3,3> &\n-0001e350: 3b6d 6174 7269 782c 203c 6120 636c 6173 ;matrix, FieldMatrix\n-0001e390: 266c 743b 4b2c 332c 3326 6774 3b3c 2f61 <K,3,3> &inverse)<\n-0001e3b0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001e400: 3735 303c 2f73 7061 6e3e 2020 2020 7b3c 750 {<\n-0001e410: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001e460: 3735 313c 2f73 7061 6e3e 2020 2020 2020 751 \n-0001e470: 3c73 7061 6e20 636c 6173 733d 226b 6579 using real_type = <\n-0001e4a0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0001e4b0: 6f72 6422 3e74 7970 656e 616d 653c 2f73 ord\">typename FieldTraits\n-0001e520: 266c 743b 4b26 6774 3b3a 3a72 6561 6c5f <K>::real_\n-0001e530: 7479 7065 3c2f 613e 3b3c 2f64 6976 3e0a type;
    .\n-0001e540: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    \n-0001e620: 2020 3735 333c 2f73 7061 6e3e 2020 2020 753 \n-0001e630: 2020 4b20 7434 2020 3d20 6d61 7472 6978 K t4 = matrix\n-0001e640: 5b30 5d5b 305d 202a 206d 6174 7269 785b [0][0] * matrix[\n-0001e650: 315d 5b31 5d3b 3c2f 6469 763e 0a3c 6469 1][1];
    .<\n-0001e670: 6120 6964 3d22 6c30 3037 3534 2220 6e61 a id=\"l00754\" na\n-0001e680: 6d65 3d22 6c30 3037 3534 223e 3c2f 613e me=\"l00754\">\n-0001e690: 3c73 7061 6e20 636c 6173 733d 226c 696e 754 K t6 = m\n-0001e6c0: 6174 7269 785b 305d 5b30 5d20 2a20 6d61 atrix[0][0] * ma\n-0001e6d0: 7472 6978 5b31 5d5b 325d 3b3c 2f64 6976 trix[1][2];.
    755<\n-0001e730: 2f73 7061 6e3e 2020 2020 2020 4b20 7438 /span> K t8\n-0001e740: 2020 3d20 6d61 7472 6978 5b30 5d5b 315d = matrix[0][1]\n-0001e750: 202a 206d 6174 7269 785b 315d 5b30 5d3b * matrix[1][0];\n-0001e760: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001e7b0: 2037 3536 3c2f 7370 616e 3e20 2020 2020 756 \n-0001e7c0: 204b 2074 3130 203d 206d 6174 7269 785b K t10 = matrix[\n-0001e7d0: 305d 5b32 5d20 2a20 6d61 7472 6978 5b31 0][2] * matrix[1\n-0001e7e0: 5d5b 305d 3b3c 2f64 6976 3e0a 3c64 6976 ][0];
    .<\n-0001e820: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0001e830: 6e6f 223e 2020 3735 373c 2f73 7061 6e3e no\"> 757
    \n-0001e840: 2020 2020 2020 4b20 7431 3220 3d20 6d61 K t12 = ma\n-0001e850: 7472 6978 5b30 5d5b 315d 202a 206d 6174 trix[0][1] * mat\n-0001e860: 7269 785b 325d 5b30 5d3b 3c2f 6469 763e rix[2][0];
    \n-0001e870: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0001e8a0: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 758 K t14\n-0001e8d0: 203d 206d 6174 7269 785b 305d 5b32 5d20 = matrix[0][2] \n-0001e8e0: 2a20 6d61 7472 6978 5b32 5d5b 305d 3b3c * matrix[2][0];<\n-0001e8f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001e940: 3735 393c 2f73 7061 6e3e 203c 2f64 6976 759 .
    760<\n-0001e9a0: 2f73 7061 6e3e 2020 2020 2020 4b20 6465 /span> K de\n-0001e9b0: 7420 3d20 2874 342a 6d61 7472 6978 5b32 t = (t4*matrix[2\n-0001e9c0: 5d5b 325d 2d74 362a 6d61 7472 6978 5b32 ][2]-t6*matrix[2\n-0001e9d0: 5d5b 315d 2d74 382a 6d61 7472 6978 5b32 ][1]-t8*matrix[2\n-0001e9e0: 5d5b 325d 2b3c 2f64 6976 3e0a 3c64 6976 ][2]+
    .<\n-0001ea20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0001ea30: 6e6f 223e 2020 3736 313c 2f73 7061 6e3e no\"> 761\n-0001ea40: 2020 2020 2020 2020 2020 2020 2020 2074 t\n-0001ea50: 3130 2a6d 6174 7269 785b 325d 5b31 5d2b 10*matrix[2][1]+\n-0001ea60: 7431 322a 6d61 7472 6978 5b31 5d5b 325d t12*matrix[1][2]\n-0001ea70: 2d74 3134 2a6d 6174 7269 785b 315d 5b31 -t14*matrix[1][1\n-0001ea80: 5d29 3b3c 2f64 6976 3e0a 3c64 6976 2063 ]);
    .
    762 \n-0001eae0: 2020 2020 4b20 7431 3720 3d20 7265 616c K t17 = real\n-0001eaf0: 5f74 7970 6528 312e 3029 2f64 6574 3b3c _type(1.0)/det;<\n-0001eb00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001eb50: 3736 333c 2f73 7061 6e3e 203c 2f64 6976 763 .
    764<\n-0001ebb0: 2f73 7061 6e3e 2020 2020 2020 696e 7665 /span> inve\n-0001ebc0: 7273 655b 305d 5b30 5d20 3d20 2028 6d61 rse[0][0] = (ma\n-0001ebd0: 7472 6978 5b31 5d5b 315d 202a 206d 6174 trix[1][1] * mat\n-0001ebe0: 7269 785b 325d 5b32 5d20 2d20 6d61 7472 rix[2][2] - matr\n-0001ebf0: 6978 5b31 5d5b 325d 202a 206d 6174 7269 ix[1][2] * matri\n-0001ec00: 785b 325d 5b31 5d29 2a74 3137 3b3c 2f64 x[2][1])*t17;.
    76\n-0001ec60: 353c 2f73 7061 6e3e 2020 2020 2020 696e 5 in\n-0001ec70: 7665 7273 655b 315d 5b30 5d20 3d20 2d28 verse[1][0] = -(\n-0001ec80: 6d61 7472 6978 5b30 5d5b 315d 202a 206d matrix[0][1] * m\n-0001ec90: 6174 7269 785b 325d 5b32 5d20 2d20 6d61 atrix[2][2] - ma\n-0001eca0: 7472 6978 5b30 5d5b 325d 202a 206d 6174 trix[0][2] * mat\n-0001ecb0: 7269 785b 325d 5b31 5d29 2a74 3137 3b3c rix[2][1])*t17;<\n-0001ecc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001ed10: 3736 363c 2f73 7061 6e3e 2020 2020 2020 766 \n-0001ed20: 696e 7665 7273 655b 325d 5b30 5d20 3d20 inverse[2][0] = \n-0001ed30: 2028 6d61 7472 6978 5b30 5d5b 315d 202a (matrix[0][1] *\n-0001ed40: 206d 6174 7269 785b 315d 5b32 5d20 2d20 matrix[1][2] - \n-0001ed50: 6d61 7472 6978 5b30 5d5b 325d 202a 206d matrix[0][2] * m\n-0001ed60: 6174 7269 785b 315d 5b31 5d29 2a74 3137 atrix[1][1])*t17\n-0001ed70: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-0001edc0: 2020 3736 373c 2f73 7061 6e3e 2020 2020 767 \n-0001edd0: 2020 696e 7665 7273 655b 305d 5b31 5d20 inverse[0][1] \n-0001ede0: 3d20 2d28 6d61 7472 6978 5b31 5d5b 305d = -(matrix[1][0]\n-0001edf0: 202a 206d 6174 7269 785b 325d 5b32 5d20 * matrix[2][2] \n-0001ee00: 2d20 6d61 7472 6978 5b31 5d5b 325d 202a - matrix[1][2] *\n-0001ee10: 206d 6174 7269 785b 325d 5b30 5d29 2a74 matrix[2][0])*t\n-0001ee20: 3137 3b3c 2f64 6976 3e0a 3c64 6976 2063 17;
    .
    768 \n-0001ee80: 2020 2020 696e 7665 7273 655b 315d 5b31 inverse[1][1\n-0001ee90: 5d20 3d20 2028 6d61 7472 6978 5b30 5d5b ] = (matrix[0][\n-0001eea0: 305d 202a 206d 6174 7269 785b 325d 5b32 0] * matrix[2][2\n-0001eeb0: 5d20 2d20 7431 3429 202a 2074 3137 3b3c ] - t14) * t17;<\n-0001eec0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001ef10: 3736 393c 2f73 7061 6e3e 2020 2020 2020 769 \n-0001ef20: 696e 7665 7273 655b 325d 5b31 5d20 3d20 inverse[2][1] = \n-0001ef30: 2d28 7436 2d74 3130 2920 2a20 7431 373b -(t6-t10) * t17;\n-0001ef40: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001ef90: 2037 3730 3c2f 7370 616e 3e20 2020 2020 770 \n-0001efa0: 2069 6e76 6572 7365 5b30 5d5b 325d 203d inverse[0][2] =\n-0001efb0: 2020 286d 6174 7269 785b 315d 5b30 5d20 (matrix[1][0] \n-0001efc0: 2a20 6d61 7472 6978 5b32 5d5b 315d 202d * matrix[2][1] -\n-0001efd0: 206d 6174 7269 785b 315d 5b31 5d20 2a20 matrix[1][1] * \n-0001efe0: 6d61 7472 6978 5b32 5d5b 305d 2920 2a20 matrix[2][0]) * \n-0001eff0: 7431 373b 3c2f 6469 763e 0a3c 6469 7620 t17;
    .
    771 \n-0001f050: 2020 2020 2069 6e76 6572 7365 5b31 5d5b inverse[1][\n-0001f060: 325d 203d 202d 286d 6174 7269 785b 305d 2] = -(matrix[0]\n-0001f070: 5b30 5d20 2a20 6d61 7472 6978 5b32 5d5b [0] * matrix[2][\n-0001f080: 315d 202d 2074 3132 2920 2a20 7431 373b 1] - t12) * t17;\n-0001f090: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001f0e0: 2037 3732 3c2f 7370 616e 3e20 2020 2020 772 \n-0001f0f0: 2069 6e76 6572 7365 5b32 5d5b 325d 203d inverse[2][2] =\n-0001f100: 2020 2874 342d 7438 2920 2a20 7431 373b (t4-t8) * t17;\n-0001f110: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001f160: 2037 3733 3c2f 7370 616e 3e20 3c2f 6469 773 .
    774\n-0001f1c0: 3c2f 7370 616e 3e20 2020 2020 203c 7370 return det;
    .\n-0001f200: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .\n-0001f260: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001f2b0: 2037 3736 3c2f 7370 616e 3e20 3c2f 6469 776 .
    778\n-0001f310: 3c2f 7370 616e 3e20 2020 203c 7370 616e template\n-0001f340: 266c 743b 203c 7370 616e 2063 6c61 7373 < class\n-0001f360: 3c2f 7370 616e 3e20 4b2c 203c 7370 616e K, int \n-0001f390: 6d2c 203c 7370 616e 2063 6c61 7373 3d22 m, int\n-0001f3b0: 3c2f 7370 616e 3e20 6e2c 203c 7370 616e n, int \n-0001f3e0: 7020 2667 743b 3c2f 6469 763e 0a3c 6469 p >
    ..
    \n-0001f4c0: 2020 3737 393c 2f61 3e3c 2f73 7061 6e3e 779\n-0001f4d0: 2020 2020 3c73 7061 6e20 636c 6173 733d static\n-0001f4f0: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c in\n-0001f510: 6c69 6e65 3c2f 7370 616e 3e20 3c73 7061 line void multMatrix ( const<\n-0001f5c0: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldMatrix&l\n-0001f600: 743b 204b 2c20 6d2c 206e 2026 6774 3b3c t; K, m, n ><\n-0001f610: 2f61 3e20 2661 6d70 3b41 2c3c 2f64 6976 /a> &A,.
    780<\n-0001f670: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> \n-0001f680: 2020 2020 2020 2020 2020 2020 2020 2020 \n-0001f690: 2020 2020 2020 2020 2020 3c73 7061 6e20 \n-0001f6b0: 636f 6e73 743c 2f73 7061 6e3e 203c 6120 const FieldMa\n-0001f6f0: 7472 6978 266c 743b 204b 2c20 6e2c 2070 trix< K, n, p\n-0001f700: 2026 6774 3b3c 2f61 3e20 2661 6d70 3b42 > &B\n-0001f710: 2c3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ,
    .
    \n-0001f760: 2020 3738 313c 2f73 7061 6e3e 2020 2020 781 \n-0001f770: 2020 2020 2020 2020 2020 2020 2020 2020 \n-0001f780: 2020 2020 2020 2020 2020 2020 2020 2020 \n-0001f790: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n-0001f7c0: 644d 6174 7269 7826 6c74 3b20 4b2c 206d dMatrix< K, m\n-0001f7d0: 2c20 7020 2667 743b 3c2f 613e 2026 616d , p > &am\n-0001f7e0: 703b 7265 7420 293c 2f64 6976 3e0a 3c64 p;ret )
    .\n-0001f800: 3c61 2069 643d 226c 3030 3738 3222 206e 782 {
    .\n-0001f860: 3c61 2069 643d 226c 3030 3738 3322 206e 783 ty\n-0001f8c0: 7065 6465 663c 2f73 7061 6e3e 203c 7370 pedef typename F\n-0001f920: 6965 6c64 4d61 7472 6978 266c 743b 204b ieldMatrix< K\n-0001f930: 2c20 6d2c 2070 2026 6774 3b3c 2f61 3e20 , m, p > \n-0001f940: 3a3a 2073 697a 655f 7479 7065 2073 697a :: size_type siz\n-0001f950: 655f 7479 7065 3b3c 2f64 6976 3e0a 3c64 e_type;
    .\n-0001f970: 3c61 2069 643d 226c 3030 3738 3422 206e 784
    .
    785 \n-0001fa10: 2020 2020 3c73 7061 6e20 636c 6173 733d fo\n-0001fa30: 723c 2f73 7061 6e3e 2820 7369 7a65 5f74 r( size_t\n-0001fa40: 7970 6520 6920 3d20 303b 2069 2026 6c74 ype i = 0; i <\n-0001fa50: 3b20 6d3b 202b 2b69 2029 3c2f 6469 763e ; m; ++i )
    \n-0001fa60: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-0001fa90: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 786 {.
    787\n-0001fb10: 3c2f 7370 616e 3e20 2020 2020 2020 203c <\n-0001fb20: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-0001fb30: 6f72 6466 6c6f 7722 3e66 6f72 3c2f 7370 ordflow\">for( size_type j\n-0001fb50: 203d 2030 3b20 6a20 266c 743b 2070 3b20 = 0; j < p; \n-0001fb60: 2b2b 6a20 293c 2f64 6976 3e0a 3c64 6976 ++j )
    .<\n-0001fba0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0001fbb0: 6e6f 223e 2020 3738 383c 2f73 7061 6e3e no\"> 788
    \n-0001fbc0: 2020 2020 2020 2020 7b3c 2f64 6976 3e0a {
    .\n-0001fbd0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n-0001fc80: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n-0001fc90: 6e6f 223e 2020 3739 303c 2f73 7061 6e3e no\"> 790\n-0001fca0: 2020 2020 2020 2020 2020 3c73 7061 6e20 for( \n-0001fcd0: 7369 7a65 5f74 7970 6520 6b20 3d20 303b size_type k = 0;\n-0001fce0: 206b 2026 6c74 3b20 6e3b 202b 2b6b 2029 k < n; ++k )\n-0001fcf0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-0001fd40: 2037 3931 3c2f 7370 616e 3e20 2020 2020 791 \n-0001fd50: 2020 2020 2020 2072 6574 5b20 6920 5d5b ret[ i ][\n-0001fd60: 206a 205d 202b 3d20 415b 2069 205d 5b20 j ] += A[ i ][ \n-0001fd70: 6b20 5d20 2a20 425b 206b 205d 5b20 6a20 k ] * B[ k ][ j \n-0001fd80: 5d3b 3c2f 6469 763e 0a3c 6469 7620 636c ];
    .
    792 \n-0001fde0: 2020 2020 207d 3c2f 6469 763e 0a3c 6469 }
    .<\n-0001fe00: 6120 6964 3d22 6c30 3037 3933 2220 6e61 a id=\"l00793\" na\n-0001fe10: 6d65 3d22 6c30 3037 3933 223e 3c2f 613e me=\"l00793\">\n-0001fe20: 3c73 7061 6e20 636c 6173 733d 226c 696e 793 }
    .<\n-0001fe50: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n-0001fe60: 3e3c 6120 6964 3d22 6c30 3037 3934 2220 > 794 }
    .<\n-0001feb0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-0001ff00: 3739 353c 2f73 7061 6e3e 203c 2f64 6976 795 .
    797<\n-0001ff60: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> \n-0001ff80: 7465 6d70 6c61 7465 3c2f 7370 616e 3e20 template \n-0001ff90: 266c 743b 3c73 7061 6e20 636c 6173 733d <typena\n-0001ffb0: 6d65 3c2f 7370 616e 3e20 4b2c 203c 7370 me K, int rows, int col\n-00020010: 7326 6774 3b3c 2f64 6976 3e0a 3c64 6976 s>
    ..
    \n-000200f0: 2037 3938 3c2f 613e 3c2f 7370 616e 3e20 798 \n-00020100: 2020 203c 7370 616e 2063 6c61 7373 3d22 static<\n-00020120: 2f73 7061 6e3e 203c 7370 616e 2063 6c61 /span> inl\n-00020140: 696e 653c 2f73 7061 6e3e 203c 7370 616e ine void\n-00020170: 203c 6120 636c 6173 733d 2263 6f64 6520 multTransposed\n-000201d0: 4d61 7472 6978 3c2f 613e 283c 7370 616e Matrix(const FieldM\n-00020230: 6174 7269 7826 6c74 3b4b 2c72 6f77 732c atrix<K,rows,\n-00020240: 636f 6c73 2667 743b 3c2f 613e 2026 616d cols> &am\n-00020250: 703b 6d61 7472 6978 2c20 3c61 2063 6c61 p;matrix, FieldMatri\n-00020290: 7826 6c74 3b4b 2c63 6f6c 732c 636f 6c73 x<K,cols,cols\n-000202a0: 2667 743b 3c2f 613e 2661 6d70 3b20 7265 >& re\n-000202b0: 7429 3c2f 6469 763e 0a3c 6469 7620 636c t)
    .
    799 \n-00020310: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    800 \n-00020370: 2020 203c 7370 616e 2063 6c61 7373 3d22 typedef\n-00020390: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c ty\n-000203b0: 7065 6e61 6d65 3c2f 7370 616e 3e20 3c61 pename Fi\n-00020410: 656c 644d 6174 7269 7826 6c74 3b4b 2c72 eldMatrix<K,r\n-00020420: 6f77 732c 636f 6c73 2667 743b 3a3a 7369 ows,cols>::si\n-00020430: 7a65 5f74 7970 653c 2f61 3e20 7369 7a65 ze_type size\n-00020440: 5f74 7970 653b 3c2f 6469 763e 0a3c 6469 _type;
    .<\n-00020460: 6120 6964 3d22 6c30 3038 3031 2220 6e61 a id=\"l00801\" na\n-00020470: 6d65 3d22 6c30 3038 3031 223e 3c2f 613e me=\"l00801\">\n-00020480: 3c73 7061 6e20 636c 6173 733d 226c 696e 801
    .
    802 \n-00020500: 2020 203c 7370 616e 2063 6c61 7373 3d22 for\n-00020520: 3c2f 7370 616e 3e28 7369 7a65 5f74 7970 (size_typ\n-00020530: 6520 693d 303b 2069 266c 743b 636f 6c73 e i=0; i<cols\n-00020540: 3b20 692b 2b29 3c2f 6469 763e 0a3c 6469 ; i++)
    .<\n-00020560: 6120 6964 3d22 6c30 3038 3033 2220 6e61 a id=\"l00803\" na\n-00020570: 6d65 3d22 6c30 3038 3033 223e 3c2f 613e me=\"l00803\">\n-00020580: 3c73 7061 6e20 636c 6173 733d 226c 696e 803 for(si\n-000205d0: 7a65 5f74 7970 6520 6a3d 303b 206a 266c ze_type j=0; j&l\n-000205e0: 743b 636f 6c73 3b20 6a2b 2b29 3c2f 6469 t;cols; j++).
    804\n-00020640: 3c2f 7370 616e 3e20 2020 2020 2020 207b {\n-00020650: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000206a0: 2038 3035 3c2f 7370 616e 3e20 2020 2020 805 \n-000206b0: 2020 2020 2072 6574 5b69 5d5b 6a5d 3d30 ret[i][j]=0\n-000206c0: 2e30 3b3c 2f64 6976 3e0a 3c64 6976 2063 .0;
    .
    806 \n-00020720: 2020 2020 2020 2020 3c73 7061 6e20 636c for(siz\n-00020750: 655f 7479 7065 206b 3d30 3b20 6b26 6c74 e_type k=0; k<\n-00020760: 3b72 6f77 733b 206b 2b2b 293c 2f64 6976 ;rows; k++).
    807<\n-000207c0: 2f73 7061 6e3e 2020 2020 2020 2020 2020 /span> \n-000207d0: 2020 7265 745b 695d 5b6a 5d2b 3d6d 6174 ret[i][j]+=mat\n-000207e0: 7269 785b 6b5d 5b69 5d2a 6d61 7472 6978 rix[k][i]*matrix\n-000207f0: 5b6b 5d5b 6a5d 3b3c 2f64 6976 3e0a 3c64 [k][j];
    .\n-00020810: 3c61 2069 643d 226c 3030 3830 3822 206e 808 }.
    809<\n-000208b0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    810 .
    8\n-00020970: 3131 3c2f 7370 616e 3e20 2020 203c 7370 11 using \n-000209a0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Dune::DenseMatr\n-00020a00: 6978 4865 6c70 3a3a 6d75 6c74 4173 7369 ixHelp::multAssi\n-00020a10: 676e 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 gn;
    .\n-00020a30: 3c61 2069 643d 226c 3030 3831 3222 206e 812
    .
    814 \n-00020ad0: 2020 3c73 7061 6e20 636c 6173 733d 226b template\n-00020af0: 3c2f 7370 616e 3e20 266c 743b 3c73 7061 <typename K, i\n-00020b40: 6e74 3c2f 7370 616e 3e20 726f 7773 2c20 nt rows, \n-00020b50: 3c73 7061 6e20 636c 6173 733d 226b 6579 int cols>.
    .
    815\n-00020c60: 3c2f 7370 616e 3e20 2020 203c 7370 616e static <\n-00020c90: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00020ca0: 6f72 6422 3e69 6e6c 696e 653c 2f73 7061 ord\">inline voi\n-00020cd0: 643c 2f73 7061 6e3e 203c 6120 636c 6173 d multAs\n-00020d30: 7369 676e 5472 616e 7370 6f73 6564 3c2f signTransposed( const<\n-00020d60: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> FieldMatrix&l\n-00020da0: 743b 4b2c 726f 7773 2c63 6f6c 7326 6774 t;K,rows,cols>\n-00020db0: 3b3c 2f61 3e20 2661 6d70 3b6d 6174 7269 ; &matri\n-00020dc0: 782c 203c 7370 616e 2063 6c61 7373 3d22 x, const FieldVector<\n-00020e20: 3b4b 2c72 6f77 7326 6774 3b3c 2f61 3e20 ;K,rows> \n-00020e30: 2661 6d70 3b20 782c 203c 6120 636c 6173 & x, FieldVector\n-00020e70: 266c 743b 4b2c 636f 6c73 2667 743b 3c2f <K,cols> & ret).
    81\n-00020ee0: 363c 2f73 7061 6e3e 2020 2020 7b3c 2f64 6 {.
    81\n-00020f40: 373c 2f73 7061 6e3e 2020 2020 2020 3c73 7 typedef typenam\n-00020f90: 653c 2f73 7061 6e3e 203c 6120 636c 6173 e FieldMa\n-00020ff0: 7472 6978 266c 743b 4b2c 726f 7773 2c63 trix<K,rows,c\n-00021000: 6f6c 7326 6774 3b3a 3a73 697a 655f 7479 ols>::size_ty\n-00021010: 7065 3c2f 613e 2073 697a 655f 7479 7065 pe size_type\n-00021020: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-00021070: 2020 3831 383c 2f73 7061 6e3e 203c 2f64 818 .
    81\n-000210d0: 393c 2f73 7061 6e3e 2020 2020 2020 3c73 9 for(size_type i=0\n-00021110: 3b20 6926 6c74 3b63 6f6c 733b 202b 2b69 ; i<cols; ++i\n-00021120: 293c 2f64 6976 3e0a 3c64 6976 2063 6c61 )
    .
    \n-00021170: 2020 3832 303c 2f73 7061 6e3e 2020 2020 820 \n-00021180: 2020 7b3c 2f64 6976 3e0a 3c64 6976 2063 {
    .
    821 \n-000211e0: 2020 2020 2020 7265 745b 695d 203d 2030 ret[i] = 0\n-000211f0: 2e30 3b3c 2f64 6976 3e0a 3c64 6976 2063 .0;
    .
    822 \n-00021250: 2020 2020 2020 3c73 7061 6e20 636c 6173 \n-00021270: 666f 723c 2f73 7061 6e3e 2873 697a 655f for(size_\n-00021280: 7479 7065 206a 3d30 3b20 6a26 6c74 3b72 type j=0; j<r\n-00021290: 6f77 733b 202b 2b6a 293c 2f64 6976 3e0a ows; ++j)
    .\n-000212a0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 \n-00021320: 0a3c 6469 7620 636c 6173 733d 226c 696e .
    \n-00021350: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 824 }.
    825\n-000213d0: 3c2f 7370 616e 3e20 2020 207d 3c2f 6469 }.
    .
    826 <\n-00021440: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00021490: 3832 383c 2f73 7061 6e3e 2020 2020 3c73 828 template <ty\n-000214e0: 7065 6e61 6d65 3c2f 7370 616e 3e20 4b2c pename K,\n-000214f0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 int rows, int\n-00021540: 2063 6f6c 7326 6774 3b3c 2f64 6976 3e0a cols>
    .\n-00021550: 3c64 6976 2063 6c61 7373 3d22 666f 6c64
    .
    829 sta\n-00021650: 7469 633c 2f73 7061 6e3e 203c 7370 616e tic inline <\n-00021680: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n-00021690: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class\" href=\"a0\n-000216a0: 3134 3132 2e68 746d 6c22 3e46 6965 6c64 1412.html\">Field\n-000216b0: 5665 6374 6f72 266c 743b 4b2c 726f 7773 Vector<K,rows\n-000216c0: 2667 743b 3c2f 613e 203c 6120 636c 6173 > mult(const FieldMatrix<\n-00021780: 3b4b 2c72 6f77 732c 636f 6c73 2667 743b ;K,rows,cols>\n-00021790: 3c2f 613e 2026 616d 703b 6d61 7472 6978 &matrix\n-000217a0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , const FieldVector<\n-00021800: 4b2c 636f 6c73 2667 743b 3c2f 613e 2026 K,cols> &\n-00021810: 616d 703b 2078 293c 2f64 6976 3e0a 3c64 amp; x)
    .\n-00021830: 3c61 2069 643d 226c 3030 3833 3022 206e 830 {
    .\n-00021890: 3c61 2069 643d 226c 3030 3833 3122 206e 831 FieldVector&\n-00021910: 6c74 3b4b 2c72 6f77 7326 6774 3b3c 2f61 lt;K,rows> ret;
    .<\n-00021940: 6120 6964 3d22 6c30 3038 3332 2220 6e61 a id=\"l00832\" na\n-00021950: 6d65 3d22 6c30 3038 3332 223e 3c2f 613e me=\"l00832\">\n-00021960: 3c73 7061 6e20 636c 6173 733d 226c 696e 832 multAssig\n-00021990: 6e28 6d61 7472 6978 2c78 2c72 6574 293b n(matrix,x,ret);\n-000219a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-000219f0: 2038 3333 3c2f 7370 616e 3e20 2020 2020 833 \n-00021a00: 203c 7370 616e 2063 6c61 7373 3d22 6b65 retur\n-00021a20: 6e3c 2f73 7061 6e3e 2072 6574 3b3c 2f64 n ret;.
    83\n-00021a80: 343c 2f73 7061 6e3e 2020 2020 7d3c 2f64 4 }.
    .
    835 \n-00021af0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    \n-00021b40: 2038 3337 3c2f 7370 616e 3e20 2020 203c 837 <\n-00021b50: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00021b60: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord\">template <t\n-00021b90: 7970 656e 616d 653c 2f73 7061 6e3e 204b ypename K\n-00021ba0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , int<\n-00021bc0: 2f73 7061 6e3e 2072 6f77 732c 203c 7370 /span> rows, int cols>
    \n-00021c00: 0a3c 6469 7620 636c 6173 733d 2266 6f6c .
    .
    <\n-00021c90: 6120 636c 6173 733d 226c 696e 6522 2068 a class=\"line\" h\n-00021ca0: 7265 663d 2261 3030 3433 362e 6874 6d6c ref=\"a00436.html\n-00021cb0: 2361 3635 3937 3633 6262 6564 3437 6439 #a659763bbed47d9\n-00021cc0: 3362 3061 3033 6439 6463 3264 3439 6336 3b0a03d9dc2d49c6\n-00021cd0: 6630 223e 2020 3833 383c 2f61 3e3c 2f73 f0\"> 838 st\n-00021d00: 6174 6963 3c2f 7370 616e 3e20 3c73 7061 atic inline \n-00021d30: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n-00021d60: 6456 6563 746f 7226 6c74 3b4b 2c63 6f6c dVector<K,col\n-00021d70: 7326 6774 3b3c 2f61 3e20 3c61 2063 6c61 s> multT\n-00021dd0: 7261 6e73 706f 7365 643c 2f61 3e28 3c73 ransposed(const\n-00021e00: 203c 6120 636c 6173 733d 2263 6f64 6520 Fie\n-00021e30: 6c64 4d61 7472 6978 266c 743b 4b2c 726f ldMatrix<K,ro\n-00021e40: 7773 2c63 6f6c 7326 6774 3b3c 2f61 3e20 ws,cols> \n-00021e50: 2661 6d70 3b6d 6174 7269 782c 203c 7370 &matrix, const \n-00021e80: 3c61 2063 6c61 7373 3d22 636f 6465 2068 Fiel\n-00021eb0: 6456 6563 746f 7226 6c74 3b4b 2c72 6f77 dVector<K,row\n-00021ec0: 7326 6774 3b3c 2f61 3e20 2661 6d70 3b20 s> & \n-00021ed0: 7829 3c2f 6469 763e 0a3c 6469 7620 636c x)
    .
    839 \n-00021f30: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
    .
    840 \n-00021f90: 2020 203c 6120 636c 6173 733d 2263 6f64 F\n-00021fc0: 6965 6c64 5665 6374 6f72 266c 743b 4b2c ieldVector<K,\n-00021fd0: 636f 6c73 2667 743b 3c2f 613e 2072 6574 cols> ret\n-00021fe0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n-00022030: 2020 3834 313c 2f73 7061 6e3e 2020 2020 841 \n-00022040: 2020 3c61 2063 6c61 7373 3d22 636f 6465 multAssignTra\n-000220a0: 6e73 706f 7365 643c 2f61 3e28 206d 6174 nsposed( mat\n-000220b0: 7269 782c 2078 2c20 7265 7420 293b 3c2f rix, x, ret );.
    8\n-00022110: 3432 3c2f 7370 616e 3e20 2020 2020 203c 42 <\n-00022120: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n-00022130: 6f72 6466 6c6f 7722 3e72 6574 7572 6e3c ordflow\">return<\n-00022140: 2f73 7061 6e3e 2072 6574 3b3c 2f64 6976 /span> ret;.
    843<\n-000221a0: 2f73 7061 6e3e 2020 2020 7d3c 2f64 6976 /span> }.
    .
    844 .
    8\n-00022260: 3435 3c2f 7370 616e 3e20 207d 203c 7370 45 } // end namesp\n-00022290: 6163 6520 464d 6174 7269 7848 656c 703c ace FMatrixHelp<\n-000222a0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 2f64 /span>
    ..
    84\n-00022300: 363c 2f73 7061 6e3e 203c 2f64 6976 3e0a 6
    .\n-00022310: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .
    850 <\n-000223f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n-00022440: 3835 313c 2f73 7061 6e3e 3c73 7061 6e20 851#include &q\n-00022470: 756f 743b 3c61 2063 6c61 7373 3d22 636f uot;fmatrixev\n-000224a0: 2e68 683c 2f61 3e26 7175 6f74 3b3c 2f73 .hh"
    .
    852<\n-00022510: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class=\"prep\n-00022520: 726f 6365 7373 6f72 223e 2365 6e64 6966 rocessor\">#endif\n-00022530: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
    .
    matri\n-00022590: 7863 6f6e 6365 7074 732e 6868 3c2f 613e xconcepts.hh\n-000225a0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n-000225d0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
    densem\n-00022600: 6174 7269 782e 6868 3c2f 613e 3c2f 6469 atrix.hh
    Implements \n-00022630: 6120 6d61 7472 6978 2063 6f6e 7374 7275 a matrix constru\n-00022640: 6374 6564 2066 726f 6d20 6120 6769 7665 cted from a give\n-00022650: 6e20 7479 7065 2072 6570 7265 7365 6e74 n type represent\n-00022660: 696e 6720 6120 6669 656c 6420 616e 6420 ing a field and \n-00022670: 6120 636f 6d70 696c 652d 7469 6d65 2067 a compile-time g\n-00022680: 6976 656e 206e 756d 6265 2e2e 2e3c 2f64 iven numbe...
    .
    boundsche\n-000226f0: 636b 696e 672e 6868 3c2f 613e 3c2f 6469 cking.hh
    Macro for w\n-00022720: 7261 7070 696e 6720 626f 756e 6461 7279 rapping boundary\n-00022730: 2063 6865 636b 732e 3c2f 6469 763e 3c2f checks.
    .
    fvector.hh\n-000227a0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Impleme\n-000227c0: 6e74 7320 6120 7665 6374 6f72 2063 6f6e nts a vector con\n-000227d0: 7374 7275 6374 6564 2066 726f 6d20 6120 structed from a \n-000227e0: 6769 7665 6e20 7479 7065 2072 6570 7265 given type repre\n-000227f0: 7365 6e74 696e 6720 6120 6669 656c 6420 senting a field \n-00022800: 616e 6420 6120 636f 6d70 696c 652d 7469 and a compile-ti\n-00022810: 6d65 2067 6976 656e 2073 697a 652e 3c2f me given size.
    .Eigenvalue comp\n-000228b0: 7574 6174 696f 6e73 2066 6f72 2074 6865 utations for the\n-000228c0: 2046 6965 6c64 4d61 7472 6978 2063 6c61 FieldMatrix cla\n-000228d0: 7373 2e3c 2f64 6976 3e3c 2f64 6976 3e0a ss.
    .\n-000228e0: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    typ\n-00022930: 6574 7261 6974 732e 6868 3c2f 613e 3c2f etraits.hh
    Traits fo\n-00022960: 7220 7479 7065 2063 6f6e 7665 7273 696f r type conversio\n-00022970: 6e73 2061 6e64 2074 7970 6520 696e 666f ns and type info\n-00022980: 726d 6174 696f 6e2e 3c2f 6469 763e 3c2f rmation.
    .
    Compute type of\n-00022a20: 2074 6865 2072 6573 756c 7420 6f66 2061 the result of a\n-00022a30: 6e20 6172 6974 686d 6574 6963 206f 7065 n arithmetic ope\n-00022a40: 7261 7469 6f6e 2069 6e76 6f6c 7669 6e67 ration involving\n-00022a50: 2074 776f 2064 6966 6665 7265 6e74 206e two different n\n-00022a60: 756d 6265 7220 7479 7065 732e 3c2f 6469 umber types.
    .
    \n-00022ab0: 3c61 2068 7265 663d 2261 3030 3331 342e precision.\n-00022ad0: 6868 3c2f 613e 3c2f 6469 763e 3c64 6976 hh
    V\n-00022af0: 6172 696f 7573 2070 7265 6369 7369 6f6e arious precision\n-00022b00: 2073 6574 7469 6e67 7320 666f 7220 6361 settings for ca\n-00022b10: 6c63 756c 6174 696f 6e73 2077 6974 6820 lculations with \n-00022b20: 4669 656c 644d 6174 7269 7820 616e 6420 FieldMatrix and \n-00022b30: 4669 656c 6456 6563 746f 722e 3c2f 6469 FieldVector.
    .
    \n-00022b80: 3c61 2068 7265 663d 2261 3030 3334 372e exceptions\n-00022ba0: 2e68 683c 2f61 3e3c 2f64 6976 3e3c 6469 .hh
    \n-00022bc0: 4120 6665 7720 636f 6d6d 6f6e 2065 7863 A few common exc\n-00022bd0: 6570 7469 6f6e 2063 6c61 7373 6573 2e3c eption classes.<\n-00022be0: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .
    #\n-00022cb0: 6465 6669 6e65 2044 554e 455f 4153 5345 define DUNE_ASSE\n-00022cc0: 5254 5f42 4f55 4e44 5328 636f 6e64 293c RT_BOUNDS(cond)<\n-00022cd0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    If DUNE_\n-00022cf0: 4348 4543 4b5f 424f 554e 4453 2069 7320 CHECK_BOUNDS is \n-00022d00: 6465 6669 6e65 643a 2063 6865 636b 2069 defined: check i\n-00022d10: 6620 636f 6e64 6974 696f 6e20 636f 6e64 f condition cond\n-00022d20: 2068 6f6c 6473 3b20 6f74 6865 7277 6973 holds; otherwis\n-00022d30: 652c 2064 6f20 6e6f 7468 696e 672e 3c2f e, do nothing.
    Defini\n-00022d60: 7469 6f6e 3c2f 623e 2062 6f75 6e64 7363 tion boundsc\n-00022d70: 6865 636b 696e 672e 6868 3a33 303c 2f64 hecking.hh:30
    .
    \n-00022dd0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 std::ostream &a\n-00022e60: 6d70 3b20 6f70 6572 6174 6f72 266c 743b mp; operator<\n-00022e70: 266c 743b 2873 7464 3a3a 6f73 7472 6561 <(std::ostrea\n-00022e80: 6d20 2661 6d70 3b73 2c20 636f 6e73 7420 m &s, const \n-00022e90: 6269 6775 6e73 6967 6e65 6469 6e74 266c bigunsignedint&l\n-00022ea0: 743b 206b 2026 6774 3b20 2661 6d70 3b78 t; k > &x\n-00022eb0: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    Def\n-00022ed0: 696e 6974 696f 6e3c 2f62 3e20 6269 6775 inition bigu\n-00022ee0: 6e73 6967 6e65 6469 6e74 2e68 683a 3237 nsignedint.hh:27\n-00022ef0: 383c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 8
    .typename Overlo\n-00022fd0: 6164 733a 3a53 6361 6c61 7254 7970 6526 ads::ScalarType&\n-00022fe0: 6c74 3b20 7374 643a 3a64 6563 6179 5f74 lt; std::decay_t\n-00022ff0: 266c 743b 2056 2026 6774 3b20 2667 743b < V > >\n-00023000: 3a3a 7479 7065 2053 6361 6c61 723c 2f64 ::type Scalar
    Element ty\n-00023030: 7065 206f 6620 736f 6d65 2053 494d 4420 pe of some SIMD \n-00023040: 7479 7065 2e3c 2f64 6976 3e3c 6469 7620 type.
    Definition \n-00023070: 7369 6d64 2f69 6e74 6572 6661 6365 2e68 simd/interface.h\n-00023080: 683a 3233 353c 2f64 6976 3e3c 2f64 6976 h:235
    .
    \n-00023100: 4475 6e65 206e 616d 6573 7061 6365 2e3c Dune namespace.<\n-00023110: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n-00023130: 6974 696f 6e3c 2f62 3e20 616c 6967 6e65 ition aligne\n-00023140: 6461 6c6c 6f63 6174 6f72 2e68 683a 3133 dallocator.hh:13\n-00023150: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n-000232d0: 6361 6c63 756c 6174 6573 2072 6574 203d calculates ret =\n-000232e0: 206d 6174 7269 7820 2a20 783c 2f64 6976 matrix * x
    Definitio\n-00023310: 6e3c 2f62 3e20 6465 6e73 656d 6174 7269 n densematri\n-00023320: 782e 6868 3a31 3136 393c 2f64 6976 3e3c x.hh:1169
    <\n-00023330: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n-00023390: 6120 6872 6566 3d22 6130 3034 3336 2e68 a href=\"a00436.h\n-000233a0: 746d 6c23 6136 3539 3736 3362 6265 6434 tml#a659763bbed4\n-000233b0: 3764 3933 6230 6130 3364 3964 6332 6434 7d93b0a03d9dc2d4\n-000233c0: 3963 3666 3022 3e44 756e 653a 3a46 4d61 9c6f0\">Dune::FMa\n-000233d0: 7472 6978 4865 6c70 3a3a 6d75 6c74 5472 trixHelp::multTr\n-000233e0: 616e 7370 6f73 6564 3c2f 613e 3c2f 6469 ansposed
    static Fie\n-00023410: 6c64 5665 6374 6f72 266c 743b 204b 2c20 ldVector< K, \n-00023420: 636f 6c73 2026 6774 3b20 6d75 6c74 5472 cols > multTr\n-00023430: 616e 7370 6f73 6564 2863 6f6e 7374 2046 ansposed(const F\n-00023440: 6965 6c64 4d61 7472 6978 266c 743b 204b ieldMatrix< K\n-00023450: 2c20 726f 7773 2c20 636f 6c73 2026 6774 , rows, cols >\n-00023460: 3b20 2661 6d70 3b6d 6174 7269 782c 2063 ; &matrix, c\n-00023470: 6f6e 7374 2046 6965 6c64 5665 6374 6f72 onst FieldVector\n-00023480: 266c 743b 204b 2c20 726f 7773 2026 6774 < K, rows >\n-00023490: 3b20 2661 6d70 3b78 293c 2f64 6976 3e3c ; &x)
    <\n-000234a0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n-000234b0: 223e 6361 6c63 756c 6174 6573 2072 6574 \">calculates ret\n-000234c0: 203d 206d 6174 7269 785e 5420 2a20 783c = matrix^T * x<\n-000234d0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n-000234f0: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n-00023500: 782e 6868 3a38 3338 3c2f 6469 763e 3c2f x.hh:838
    .
    Dune::FMat\n-000235b0: 7269 7848 656c 703a 3a69 6e76 6572 744d rixHelp::invertM\n-000235c0: 6174 7269 785f 7265 7454 7261 6e73 706f atrix_retTranspo\n-000235d0: 7365 643c 2f61 3e3c 2f64 6976 3e3c 6469 sed
    static K invert\n-00023600: 4d61 7472 6978 5f72 6574 5472 616e 7370 Matrix_retTransp\n-00023610: 6f73 6564 2863 6f6e 7374 2046 6965 6c64 osed(const Field\n-00023620: 4d61 7472 6978 266c 743b 204b 2c20 312c Matrix< K, 1,\n-00023630: 2031 2026 6774 3b20 2661 6d70 3b6d 6174 1 > &mat\n-00023640: 7269 782c 2046 6965 6c64 4d61 7472 6978 rix, FieldMatrix\n-00023650: 266c 743b 204b 2c20 312c 2031 2026 6774 < K, 1, 1 >\n-00023660: 3b20 2661 6d70 3b69 6e76 6572 7365 293c ; &inverse)<\n-00023670: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    invert s\n-00023690: 6361 6c61 7220 7769 7468 6f75 7420 6368 calar without ch\n-000236a0: 616e 6769 6e67 2074 6865 206f 7269 6769 anging the origi\n-000236b0: 6e61 6c20 6d61 7472 6978 3c2f 6469 763e nal matrix
    \n-000236c0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n-000236e0: 3c2f 623e 2066 6d61 7472 6978 2e68 683a fmatrix.hh:\n-000236f0: 3638 303c 2f64 6976 3e3c 2f64 6976 3e0a 680
    .\n-00023700: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    stat\n-000237d0: 6963 2076 6f69 6420 6d75 6c74 4d61 7472 ic void multMatr\n-000237e0: 6978 2863 6f6e 7374 2046 6965 6c64 4d61 ix(const FieldMa\n-000237f0: 7472 6978 266c 743b 204b 2c20 6d2c 206e trix< K, m, n\n-00023800: 2026 6774 3b20 2661 6d70 3b41 2c20 636f > &A, co\n-00023810: 6e73 7420 4669 656c 644d 6174 7269 7826 nst FieldMatrix&\n-00023820: 6c74 3b20 4b2c 206e 2c20 7020 2667 743b lt; K, n, p >\n-00023830: 2026 616d 703b 422c 2046 6965 6c64 4d61 &B, FieldMa\n-00023840: 7472 6978 266c 743b 204b 2c20 6d2c 2070 trix< K, m, p\n-00023850: 2026 6774 3b20 2661 6d70 3b72 6574 293c > &ret)<\n-00023860: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    calculat\n-00023880: 6573 2072 6574 203d 2041 202a 2042 3c2f es ret = A * B
    Defini\n-000238b0: 7469 6f6e 3c2f 623e 2066 6d61 7472 6978 tion fmatrix\n-000238c0: 2e68 683a 3737 393c 2f64 6976 3e3c 2f64 .hh:779
    .
    static K inver\n-000239b0: 744d 6174 7269 7828 636f 6e73 7420 4669 tMatrix(const Fi\n-000239c0: 656c 644d 6174 7269 7826 6c74 3b20 4b2c eldMatrix< K,\n-000239d0: 2031 2c20 3120 2667 743b 2026 616d 703b 1, 1 > &\n-000239e0: 6d61 7472 6978 2c20 4669 656c 644d 6174 matrix, FieldMat\n-000239f0: 7269 7826 6c74 3b20 4b2c 2031 2c20 3120 rix< K, 1, 1 \n-00023a00: 2667 743b 2026 616d 703b 696e 7665 7273 > &invers\n-00023a10: 6529 3c2f 6469 763e 3c64 6976 2063 6c61 e)
    inver\n-00023a30: 7420 7363 616c 6172 2077 6974 686f 7574 t scalar without\n-00023a40: 2063 6861 6e67 696e 6720 7468 6520 6f72 changing the or\n-00023a50: 6967 696e 616c 206d 6174 7269 783c 2f64 iginal matrix
    Definit\n-00023a80: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n-00023a90: 6868 3a36 3731 3c2f 6469 763e 3c2f 6469 hh:671
    .
    Dune::FMatri\n-00023b40: 7848 656c 703a 3a6d 756c 743c 2f61 3e3c xHelp::mult<\n-00023b50: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    static \n-00023b70: 4669 656c 6456 6563 746f 7226 6c74 3b20 FieldVector< \n-00023b80: 4b2c 2072 6f77 7320 2667 743b 206d 756c K, rows > mul\n-00023b90: 7428 636f 6e73 7420 4669 656c 644d 6174 t(const FieldMat\n-00023ba0: 7269 7826 6c74 3b20 4b2c 2072 6f77 732c rix< K, rows,\n-00023bb0: 2063 6f6c 7320 2667 743b 2026 616d 703b cols > &\n-00023bc0: 6d61 7472 6978 2c20 636f 6e73 7420 4669 matrix, const Fi\n-00023bd0: 656c 6456 6563 746f 7226 6c74 3b20 4b2c eldVector< K,\n-00023be0: 2063 6f6c 7320 2667 743b 2026 616d 703b cols > &\n-00023bf0: 7829 3c2f 6469 763e 3c64 6976 2063 6c61 x)
    calcu\n-00023c10: 6c61 7465 7320 7265 7420 3d20 6d61 7472 lates ret = matr\n-00023c20: 6978 202a 2078 3c2f 6469 763e 3c64 6976 ix * x
    <\n-00023c40: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n-00023c50: 2066 6d61 7472 6978 2e68 683a 3832 393c fmatrix.hh:829<\n-00023c60: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .static void mu\n-00023d50: 6c74 5472 616e 7370 6f73 6564 4d61 7472 ltTransposedMatr\n-00023d60: 6978 2863 6f6e 7374 2046 6965 6c64 4d61 ix(const FieldMa\n-00023d70: 7472 6978 266c 743b 204b 2c20 726f 7773 trix< K, rows\n-00023d80: 2c20 636f 6c73 2026 6774 3b20 2661 6d70 , cols > &\n-00023d90: 3b6d 6174 7269 782c 2046 6965 6c64 4d61 ;matrix, FieldMa\n-00023da0: 7472 6978 266c 743b 204b 2c20 636f 6c73 trix< K, cols\n-00023db0: 2c20 636f 6c73 2026 6774 3b20 2661 6d70 , cols > &\n-00023dc0: 3b72 6574 293c 2f64 6976 3e3c 6469 7620 ;ret)
    ca\n-00023de0: 6c63 756c 6174 6573 2072 6574 3d20 415f lculates ret= A_\n-00023df0: 742a 413c 2f64 6976 3e3c 6469 7620 636c t*A
    D\n-00023e10: 6566 696e 6974 696f 6e3c 2f62 3e20 666d efinition fm\n-00023e20: 6174 7269 782e 6868 3a37 3938 3c2f 6469 atrix.hh:798
    .
    s\n-00023f10: 7461 7469 6320 766f 6964 206d 756c 7441 tatic void multA\n-00023f20: 7373 6967 6e54 7261 6e73 706f 7365 6428 ssignTransposed(\n-00023f30: 636f 6e73 7420 4669 656c 644d 6174 7269 const FieldMatri\n-00023f40: 7826 6c74 3b20 4b2c 2072 6f77 732c 2063 x< K, rows, c\n-00023f50: 6f6c 7320 2667 743b 2026 616d 703b 6d61 ols > &ma\n-00023f60: 7472 6978 2c20 636f 6e73 7420 4669 656c trix, const Fiel\n-00023f70: 6456 6563 746f 7226 6c74 3b20 4b2c 2072 dVector< K, r\n-00023f80: 6f77 7320 2667 743b 2026 616d 703b 782c ows > &x,\n-00023f90: 2046 6965 6c64 5665 6374 6f72 266c 743b FieldVector<\n-00023fa0: 204b 2c20 636f 6c73 2026 6774 3b20 2661 K, cols > &a\n-00023fb0: 6d70 3b72 6574 293c 2f64 6976 3e3c 6469 mp;ret)
    \n-00023fd0: 6361 6c63 756c 6174 6573 2072 6574 203d calculates ret =\n-00023fe0: 206d 6174 7269 785e 5420 2a20 783c 2f64 matrix^T * x
    Definit\n-00024010: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n-00024020: 6868 3a38 3135 3c2f 6469 763e 3c2f 6469 hh:815
    .
    A \n-000240b0: 6465 6e73 6520 6e20 7820 6d20 6d61 7472 dense n x m matr\n-000240c0: 6978 2e3c 2f64 6976 3e3c 6469 7620 636c ix.
    D\n-000240e0: 6566 696e 6974 696f 6e3c 2f62 3e20 6465 efinition de\n-000240f0: 6e73 656d 6174 7269 782e 6868 3a31 3430 nsematrix.hh:140\n-00024100: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .void mtv(const\n-000241e0: 2058 2026 616d 703b 782c 2059 2026 616d X &x, Y &am\n-000241f0: 703b 7929 2063 6f6e 7374 3c2f 6469 763e p;y) const
    \n-00024200: 3c64 6976 2063 6c61 7373 3d22 7474 646f
    y = A^T x
    Definiti\n-00024240: 6f6e 3c2f 623e 2064 656e 7365 6d61 7472 on densematr\n-00024250: 6978 2e68 683a 3338 373c 2f64 6976 3e3c ix.hh:387
    <\n-00024260: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n-000242c0: 6120 6872 6566 3d22 6130 3134 3030 2e68 a href=\"a01400.h\n-000242d0: 746d 6c23 6135 6434 3339 3561 6563 3163 tml#a5d4395aec1c\n-000242e0: 6330 3538 3065 6439 3635 3165 3962 3030 c0580ed9651e9b00\n-000242f0: 3433 3462 3722 3e44 756e 653a 3a44 656e 434b7\">Dune::Den\n-00024300: 7365 4d61 7472 6978 266c 743b 2046 6965 seMatrix< Fie\n-00024310: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n-00024320: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n-00024330: 2667 743b 3a3a 4d3c 2f61 3e3c 2f64 6976 >::M
    constexpr s\n-00024360: 697a 655f 7479 7065 204d 2829 2063 6f6e ize_type M() con\n-00024370: 7374 3c2f 6469 763e 3c64 6976 2063 6c61 st
    numbe\n-00024390: 7220 6f66 2063 6f6c 756d 6e73 3c2f 6469 r of columns
    Definiti\n-000243c0: 6f6e 3c2f 623e 2064 656e 7365 6d61 7472 on densematr\n-000243d0: 6978 2e68 683a 3730 333c 2f64 6976 3e3c ix.hh:703
    <\n-000243e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n-00024440: 6120 6872 6566 3d22 6130 3134 3030 2e68 a href=\"a01400.h\n-00024450: 746d 6c23 6136 3563 3861 6638 6538 6666 tml#a65c8af8e8ff\n-00024460: 3232 3135 3563 3238 3663 3961 3765 6230 22155c286c9a7eb0\n-00024470: 3335 3438 3222 3e44 756e 653a 3a44 656e 35482\">Dune::Den\n-00024480: 7365 4d61 7472 6978 266c 743b 2046 6965 seMatrix< Fie\n-00024490: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n-000244a0: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n-000244b0: 2667 743b 3a3a 7269 6768 746d 756c 7469 >::rightmulti\n-000244c0: 706c 793c 2f61 3e3c 2f64 6976 3e3c 6469 ply
    FieldMatrix<\n-000244f0: 204b 2c20 524f 5753 2c20 434f 4c53 2026 K, ROWS, COLS &\n-00024500: 6774 3b20 2661 6d70 3b20 7269 6768 746d gt; & rightm\n-00024510: 756c 7469 706c 7928 636f 6e73 7420 4465 ultiply(const De\n-00024520: 6e73 654d 6174 7269 7826 6c74 3b20 4d32 nseMatrix< M2\n-00024530: 2026 6774 3b20 2661 6d70 3b4d 293c 2f64 > &M)
    Multiplies\n-00024560: 204d 2066 726f 6d20 7468 6520 7269 6768 M from the righ\n-00024570: 7420 746f 2074 6869 7320 6d61 7472 6978 t to this matrix\n-00024580: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
    Def\n-000245a0: 696e 6974 696f 6e3c 2f62 3e20 6465 6e73 inition dens\n-000245b0: 656d 6174 7269 782e 6868 3a36 3435 3c2f ematrix.hh:645
    .
    \n-00024610: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 <\n-000246b0: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n-000246c0: 6922 3e64 6572 6976 6564 5f74 7970 6520 i\">derived_type \n-000246d0: 2661 6d70 3b20 6f70 6572 6174 6f72 2f3d & operator/=\n-000246e0: 2863 6f6e 7374 2066 6965 6c64 5f74 7970 (const field_typ\n-000246f0: 6520 2661 6d70 3b6b 293c 2f64 6976 3e3c e &k)
    <\n-00024700: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n-00024710: 223e 7665 6374 6f72 2073 7061 6365 2064 \">vector space d\n-00024720: 6976 6973 696f 6e20 6279 2073 6361 6c61 ivision by scala\n-00024730: 723c 2f64 6976 3e3c 6469 7620 636c 6173 r
    Def\n-00024750: 696e 6974 696f 6e3c 2f62 3e20 6465 6e73 inition dens\n-00024760: 656d 6174 7269 782e 6868 3a33 3239 3c2f ematrix.hh:329
    .
    \n-000247c0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 <\n-00024860: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n-00024870: 6922 3e64 6572 6976 6564 5f74 7970 6520 i\">derived_type \n-00024880: 2661 6d70 3b20 6f70 6572 6174 6f72 2a3d & operator*=\n-00024890: 2863 6f6e 7374 2066 6965 6c64 5f74 7970 (const field_typ\n-000248a0: 6520 2661 6d70 3b6b 293c 2f64 6976 3e3c e &k)
    <\n-000248b0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n-000248c0: 223e 7665 6374 6f72 2073 7061 6365 206d \">vector space m\n-000248d0: 756c 7469 706c 6963 6174 696f 6e20 7769 ultiplication wi\n-000248e0: 7468 2073 6361 6c61 723c 2f64 6976 3e3c th scalar
    <\n-000248f0: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n-00024900: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n-00024910: 2f62 3e20 6465 6e73 656d 6174 7269 782e /b> densematrix.\n-00024920: 6868 3a33 3231 3c2f 6469 763e 3c2f 6469 hh:321
    .
    .\n-00024bd0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    static const\n-00024bf0: 6578 7072 2069 6e74 2062 6c6f 636b 6c65 expr int blockle\n-00024c00: 7665 6c3c 2f64 6976 3e3c 6469 7620 636c vel
    The \n-00024c20: 6e75 6d62 6572 206f 6620 626c 6f63 6b20 number of block \n-00024c30: 6c65 7665 6c73 2077 6520 636f 6e74 6169 levels we contai\n-00024c40: 6e2e 2054 6869 7320 6973 2074 6865 206c n. This is the l\n-00024c50: 6561 662c 2074 6861 7420 6973 2c20 312e eaf, that is, 1.\n-00024c60: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n-00024c80: 6e69 7469 6f6e 3c2f 623e 2064 656e 7365 nition dense\n-00024c90: 6d61 7472 6978 2e68 683a 3137 383c 2f64 matrix.hh:178
    .\n-00024da0: 5472 6169 7473 3a3a 726f 775f 7479 7065 Traits::row_type\n-00024db0: 2072 6f77 5f74 7970 653c 2f64 6976 3e3c row_type
    <\n-00024dc0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n-00024dd0: 223e 5468 6520 7479 7065 2075 7365 6420 \">The type used \n-00024de0: 746f 2072 6570 7265 7365 6e74 2061 2072 to represent a r\n-00024df0: 6f77 2028 6d75 7374 2066 756c 6669 6c6c ow (must fulfill\n-00024e00: 2074 6865 2044 756e 653a 3a44 656e 7365 the Dune::Dense\n-00024e10: 5665 6374 6f72 2069 6e74 6572 6661 6365 Vector interface\n-00024e20: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    Def\n-00024e40: 696e 6974 696f 6e3c 2f62 3e20 6465 6e73 inition dens\n-00024e50: 656d 6174 7269 782e 6868 3a31 3639 3c2f ematrix.hh:169
    .
    \n-00024eb0: 3c64 6976 2063 6c61 7373 3d22 7474 6e61 Traits::size_t\n-00024f70: 7970 6520 7369 7a65 5f74 7970 653c 2f64 ype size_type
    The type u\n-00024fa0: 7365 6420 666f 7220 7468 6520 696e 6465 sed for the inde\n-00024fb0: 7820 6163 6365 7373 2061 6e64 2073 697a x access and siz\n-00024fc0: 6520 6f70 6572 6174 696f 6e2e 3c2f 6469 e operation.
    Definiti\n-00024ff0: 6f6e 3c2f 623e 2064 656e 7365 6d61 7472 on densematr\n-00025000: 6978 2e68 683a 3136 363c 2f64 6976 3e3c ix.hh:166
    <\n-00025010: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n-00025070: 6120 6872 6566 3d22 6130 3134 3030 2e68 a href=\"a01400.h\n-00025080: 746d 6c23 6164 3839 3134 6266 3431 3434 tml#ad8914bf4144\n-00025090: 3936 3765 3130 3931 6534 6530 3231 3565 967e1091e4e0215e\n-000250a0: 6665 3330 3522 3e44 756e 653a 3a44 656e fe305\">Dune::Den\n-000250b0: 7365 4d61 7472 6978 266c 743b 2046 6965 seMatrix< Fie\n-000250c0: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n-000250d0: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n-000250e0: 2667 743b 3a3a 636f 6e73 745f 726f 775f >::const_row_\n-000250f0: 7265 6665 7265 6e63 653c 2f61 3e3c 2f64 reference
    Traits::c\n-00025120: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n-00025130: 6365 2063 6f6e 7374 5f72 6f77 5f72 6566 ce const_row_ref\n-00025140: 6572 656e 6365 3c2f 6469 763e 3c64 6976 erence
    T\n-00025160: 6865 2074 7970 6520 7573 6564 2074 6f20 he type used to \n-00025170: 7265 7072 6573 656e 7420 6120 7265 6665 represent a refe\n-00025180: 7265 6e63 6520 746f 2061 2063 6f6e 7374 rence to a const\n-00025190: 616e 7420 726f 7720 2875 7375 616c 6c79 ant row (usually\n-000251a0: 2063 6f6e 7374 2072 6f77 5f74 7970 6520 const row_type \n-000251b0: 2661 6d70 3b29 3c2f 6469 763e 3c64 6976 &)
    <\n-000251d0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition
    \n-000251e0: 2064 656e 7365 6d61 7472 6978 2e68 683a densematrix.hh:\n-000251f0: 3137 353c 2f64 6976 3e3c 2f64 6976 3e0a 175
    .\n-00025200: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    Trait\n-00025300: 733a 3a72 6f77 5f72 6566 6572 656e 6365 s::row_reference\n-00025310: 2072 6f77 5f72 6566 6572 656e 6365 3c2f row_reference\n-00025520: 7665 6374 6f72 2073 7061 6365 2061 6464 vector space add\n-00025530: 6974 696f 6e3c 2f64 6976 3e3c 6469 7620 ition
    Definition \n-00025560: 6465 6e73 656d 6174 7269 782e 6868 3a32 densematrix.hh:2\n-00025570: 3839 3c2f 6469 763e 3c2f 6469 763e 0a3c 89
    .<\n-00025580: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n-00025590: 6964 3d22 6161 3031 3430 385f 6874 6d6c id=\"aa01408_html\n-000255a0: 223e 3c64 6976 2063 6c61 7373 3d22 7474 \">
    A dens\n-00025600: 6520 6e20 7820 6d20 6d61 7472 6978 2e3c e n x m matrix.<\n-00025610: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n-00025630: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n-00025640: 782e 6868 3a31 3137 3c2f 6469 763e 3c2f x.hh:117
    .
    s\n-00025720: 7461 7469 6320 636f 6e73 7465 7870 7220 tatic constexpr \n-00025730: 7369 7a65 5f74 7970 6520 6d61 745f 636f size_type mat_co\n-00025740: 6c73 2829 3c2f 6469 763e 3c64 6976 2063 ls()
    \n-00025760: 4465 6669 6e69 7469 6f6e 3c2f 623e 2066 Definition f\n-00025770: 6d61 7472 6978 2e68 683a 3336 373c 2f64 matrix.hh:367
    .
    <\n-000257d0: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n-000257e0: 6522 3e3c 6120 6872 6566 3d22 6130 3134 e\">Dune:\n-00025820: 3a46 6965 6c64 4d61 7472 6978 3a3a 4669 :FieldMatrix::Fi\n-00025830: 656c 644d 6174 7269 783c 2f61 3e3c 2f64 eldMatrix
    constexpr\n-00025860: 2046 6965 6c64 4d61 7472 6978 2829 3d64 FieldMatrix()=d\n-00025870: 6566 6175 6c74 3c2f 6469 763e 3c64 6976 efault
    D\n-00025890: 6566 6175 6c74 2063 6f6e 7374 7275 6374 efault construct\n-000258a0: 6f72 2e3c 2f64 6976 3e3c 2f64 6976 3e0a or.
    .\n-000258b0: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    Dune::FieldMatr\n-00025950: 6978 3a3a 636f 6e73 745f 726f 775f 7265 ix::const_row_re\n-00025960: 6665 7265 6e63 653c 2f61 3e3c 2f64 6976 ference
    Base::const\n-00025990: 5f72 6f77 5f72 6566 6572 656e 6365 2063 _row_reference c\n-000259a0: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n-000259b0: 6365 3c2f 6469 763e 3c64 6976 2063 6c61 ce
    De\n-000259d0: 6669 6e69 7469 6f6e 3c2f 623e 2066 6d61 finition fma\n-000259e0: 7472 6978 2e68 683a 3133 313c 2f64 6976 trix.hh:131
    .<\n-00025ab0: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n-00025ac0: 6922 3e46 6965 6c64 4d61 7472 6978 2026 i\">FieldMatrix &\n-00025ad0: 616d 703b 206f 7065 7261 746f 723d 2863 amp; operator=(c\n-00025ae0: 6f6e 7374 2046 6965 6c64 4d61 7472 6978 onst FieldMatrix\n-00025af0: 266c 743b 2054 2c20 524f 5753 2c20 434f < T, ROWS, CO\n-00025b00: 4c53 2026 6774 3b20 2661 6d70 3b78 293c LS > &x)<\n-00025b10: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    copy ass\n-00025b30: 6967 6e6d 656e 7420 6672 6f6d 2046 6965 ignment from Fie\n-00025b40: 6c64 4d61 7472 6978 206f 7665 7220 6120 ldMatrix over a \n-00025b50: 6469 6666 6572 656e 7420 6669 656c 643c different field<\n-00025b60: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n-00025b80: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n-00025b90: 782e 6868 3a31 3631 3c2f 6469 763e 3c2f x.hh:161
    .
    Dune::Fiel\n-00025c40: 644d 6174 7269 783a 3a72 6967 6874 6d75 dMatrix::rightmu\n-00025c50: 6c74 6970 6c79 616e 793c 2f61 3e3c 2f64 ltiplyany
    FieldMatr\n-00025c80: 6978 266c 743b 204b 2c20 726f 7773 2c20 ix< K, rows, \n-00025c90: 6c20 2667 743b 2072 6967 6874 6d75 6c74 l > rightmult\n-00025ca0: 6970 6c79 616e 7928 636f 6e73 7420 4669 iplyany(const Fi\n-00025cb0: 656c 644d 6174 7269 7826 6c74 3b20 4b2c eldMatrix< K,\n-00025cc0: 2063 6f6c 732c 206c 2026 6774 3b20 2661 cols, l > &a\n-00025cd0: 6d70 3b4d 2920 636f 6e73 743c 2f64 6976 mp;M) const
    Multiplies M\n-00025d00: 2066 726f 6d20 7468 6520 7269 6768 7420 from the right \n-00025d10: 746f 2074 6869 7320 6d61 7472 6978 2c20 to this matrix, \n-00025d20: 7468 6973 206d 6174 7269 7820 6973 206e this matrix is n\n-00025d30: 6f74 206d 6f64 6966 6965 642e 3c2f 6469 ot modified.
    Definiti\n-00025d60: 6f6e 3c2f 623e 2066 6d61 7472 6978 2e68 on fmatrix.h\n-00025d70: 683a 3335 313c 2f64 6976 3e3c 2f64 6976 h:351
    .
    .\n-00025f60: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Base::size_t\n-00025f80: 7970 6520 7369 7a65 5f74 7970 653c 2f64 ype size_type
    Definit\n-00025fb0: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n-00025fc0: 6868 3a31 3237 3c2f 6469 763e 3c2f 6469 hh:127
    .
    \n-00026090: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    FieldMatrix&\n-000260b0: 6c74 3b20 4b2c 206c 2c20 636f 6c73 2026 lt; K, l, cols &\n-000260c0: 6774 3b20 6c65 6674 6d75 6c74 6970 6c79 gt; leftmultiply\n-000260d0: 616e 7928 636f 6e73 7420 4669 656c 644d any(const FieldM\n-000260e0: 6174 7269 7826 6c74 3b20 4b2c 206c 2c20 atrix< K, l, \n-000260f0: 726f 7773 2026 6774 3b20 2661 6d70 3b4d rows > &M\n-00026100: 2920 636f 6e73 743c 2f64 6976 3e3c 6469 ) const
    \n-00026120: 4d75 6c74 6970 6c69 6573 204d 2066 726f Multiplies M fro\n-00026130: 6d20 7468 6520 6c65 6674 2074 6f20 7468 m the left to th\n-00026140: 6973 206d 6174 7269 782c 2074 6869 7320 is matrix, this \n-00026150: 6d61 7472 6978 2069 7320 6e6f 7420 6d6f matrix is not mo\n-00026160: 6469 6669 6564 2e3c 2f64 6976 3e3c 6469 dified.
    \n-00026180: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition fmatrix.hh:316\n-000261a0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .M\n-000262e0: 756c 7469 706c 6965 7320 4d20 6672 6f6d ultiplies M from\n-000262f0: 2074 6865 2072 6967 6874 2074 6f20 7468 the right to th\n-00026300: 6973 206d 6174 7269 782e 3c2f 6469 763e is matrix.
    \n-00026310: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n-00026330: 3c2f 623e 2066 6d61 7472 6978 2e68 683a fmatrix.hh:\n-00026340: 3333 343c 2f64 6976 3e3c 2f64 6976 3e0a 334
    .\n-00026350: 3c64 6976 2063 6c61 7373 3d22 7474 6322 .\n-00026480: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    frien\n-00026550: 6420 6175 746f 206f 7065 7261 746f 722a d auto operator*\n-00026560: 2863 6f6e 7374 2046 6965 6c64 4d61 7472 (const FieldMatr\n-00026570: 6978 2026 616d 703b 6d61 7472 6978 2c20 ix &matrix, \n-00026580: 5363 616c 6172 2073 6361 6c61 7229 3c2f Scalar scalar)
    vector sp\n-000265b0: 6163 6520 6d75 6c74 6970 6c69 6361 7469 ace multiplicati\n-000265c0: 6f6e 2077 6974 6820 7363 616c 6172 3c2f on with scalar
    Defini\n-000265f0: 7469 6f6e 3c2f 623e 2066 6d61 7472 6978 tion fmatrix\n-00026600: 2e68 683a 3231 323c 2f64 6976 3e3c 2f64 .hh:212
    .
    F\n-000266e0: 6965 6c64 4d61 7472 6978 2026 616d 703b ieldMatrix &\n-000266f0: 206f 7065 7261 746f 723d 2846 6965 6c64 operator=(Field\n-00026700: 4d61 7472 6978 266c 743b 2054 2c20 726f Matrix< T, ro\n-00026710: 7773 2c20 636f 6c73 2026 6774 3b20 636f ws, cols > co\n-00026720: 6e73 7420 2661 6d70 3b29 3d64 656c 6574 nst &)=delet\n-00026730: 653c 2f64 6976 3e3c 6469 7620 636c 6173 e
    no cop\n-00026750: 7920 6173 7369 676e 6d65 6e74 2066 726f y assignment fro\n-00026760: 6d20 4669 656c 644d 6174 7269 7820 6f66 m FieldMatrix of\n-00026770: 2064 6966 6665 7265 6e74 2073 697a 653c different size<\n-00026780: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .
    Base:\n-00026860: 3a72 6f77 5f72 6566 6572 656e 6365 2072 :row_reference r\n-00026870: 6f77 5f72 6566 6572 656e 6365 3c2f 6469 ow_reference
    Definiti\n-000268a0: 6f6e 3c2f 623e 2066 6d61 7472 6978 2e68 on fmatrix.h\n-000268b0: 683a 3133 303c 2f64 6976 3e3c 2f64 6976 h:130
    .
    ro\n-00026990: 775f 7265 6665 7265 6e63 6520 6d61 745f w_reference mat_\n-000269a0: 6163 6365 7373 2873 697a 655f 7479 7065 access(size_type\n-000269b0: 2069 293c 2f64 6976 3e3c 6469 7620 636c i)
    D\n-000269d0: 6566 696e 6974 696f 6e3c 2f62 3e20 666d efinition fm\n-000269e0: 6174 7269 782e 6868 3a33 3639 3c2f 6469 atrix.hh:369
    .
    s\n-00026ac0: 7461 7469 6320 636f 6e73 7465 7870 7220 tatic constexpr \n-00026ad0: 696e 7420 726f 7773 3c2f 6469 763e 3c64 int rows
    The number of r\n-00026b00: 6f77 732e 3c2f 6469 763e 3c64 6976 2063 ows.
    \n-00026b20: 4465 6669 6e69 7469 6f6e 3c2f 623e 2066 Definition f\n-00026b30: 6d61 7472 6978 2e68 683a 3132 333c 2f64 matrix.hh:123
    .
    <\n-00026b90: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n-00026ba0: 6522 3e3c 6120 6872 6566 3d22 6130 3134 e\">Dune:\n-00026be0: 3a46 6965 6c64 4d61 7472 6978 3a3a 7472 :FieldMatrix::tr\n-00026bf0: 616e 7370 6f73 6564 3c2f 613e 3c2f 6469 ansposed
    FieldMatri\n-00026c20: 7826 6c74 3b20 4b2c 2043 4f4c 532c 2052 x< K, COLS, R\n-00026c30: 4f57 5320 2667 743b 2074 7261 6e73 706f OWS > transpo\n-00026c40: 7365 6428 2920 636f 6e73 743c 2f64 6976 sed() const
    Return trans\n-00026c70: 706f 7365 6420 6f66 2074 6865 206d 6174 posed of the mat\n-00026c80: 7269 7820 6173 2046 6965 6c64 4d61 7472 rix as FieldMatr\n-00026c90: 6978 2e3c 2f64 6976 3e3c 6469 7620 636c ix.
    D\n-00026cb0: 6566 696e 6974 696f 6e3c 2f62 3e20 666d efinition fm\n-00026cc0: 6174 7269 782e 6868 3a31 3732 3c2f 6469 atrix.hh:172
    .<\n-00026d90: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n-00026da0: 6922 3e73 7461 7469 6320 636f 6e73 7465 i\">static conste\n-00026db0: 7870 7220 7369 7a65 5f74 7970 6520 6d61 xpr size_type ma\n-00026dc0: 745f 726f 7773 2829 3c2f 6469 763e 3c64 t_rows()
    Definition fmatrix.hh:36\n-00026e00: 363c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6
    .C\n-00026f50: 6f6e 7374 7275 6374 6f72 2069 6e69 7469 onstructor initi\n-00026f60: 616c 697a 696e 6720 7468 6520 6d61 7472 alizing the matr\n-00026f70: 6978 2066 726f 6d20 6120 6c69 7374 206f ix from a list o\n-00026f80: 6620 7665 6374 6f72 2e3c 2f64 6976 3e3c f vector.
    <\n-00026f90: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n-00026fa0: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n-00026fb0: 2f62 3e20 666d 6174 7269 782e 6868 3a31 /b> fmatrix.hh:1\n-00026fc0: 3430 3c2f 6469 763e 3c2f 6469 763e 0a3c 40
    .<\n-00026fd0: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n-00026fe0: 6964 3d22 6161 3031 3430 385f 6874 6d6c id=\"aa01408_html\n-00026ff0: 5f61 6332 3831 3666 3164 3036 3766 3533 _ac2816f1d067f53\n-00027000: 3333 3636 3239 3763 3035 3366 3037 3039 3366297c053f0709\n-00027010: 3962 223e 3c64 6976 2063 6c61 7373 3d22 9b\">
    \n-00027060: 4475 6e65 3a3a 4669 656c 644d 6174 7269 Dune::FieldMatri\n-00027070: 783a 3a63 6f6c 733c 2f61 3e3c 2f64 6976 x::cols
    static cons\n-000270a0: 7465 7870 7220 696e 7420 636f 6c73 3c2f texpr int cols
    The numbe\n-000270d0: 7220 6f66 2063 6f6c 756d 6e73 2e3c 2f64 r of columns.
    Definit\n-00027100: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n-00027110: 6868 3a31 3235 3c2f 6469 763e 3c2f 6469 hh:125
    .
    fr\n-000271f0: 6965 6e64 2061 7574 6f20 6f70 6572 6174 iend auto operat\n-00027200: 6f72 2f28 636f 6e73 7420 4669 656c 644d or/(const FieldM\n-00027210: 6174 7269 7820 2661 6d70 3b6d 6174 7269 atrix &matri\n-00027220: 782c 2053 6361 6c61 7220 7363 616c 6172 x, Scalar scalar\n-00027230: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    vector\n-00027250: 2073 7061 6365 2064 6976 6973 696f 6e20 space division \n-00027260: 6279 2073 6361 6c61 723c 2f64 6976 3e3c by scalar
    <\n-00027270: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n-00027280: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n-00027290: 2f62 3e20 666d 6174 7269 782e 6868 3a32 /b> fmatrix.hh:2\n-000272a0: 3430 3c2f 6469 763e 3c2f 6469 763e 0a3c 40
    .<\n-000272b0: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n-000272c0: 6964 3d22 6161 3031 3430 385f 6874 6d6c id=\"aa01408_html\n-000272d0: 5f61 6536 3033 3366 3231 3764 3264 6531 _ae6033f217d2de1\n-000272e0: 6337 6330 6464 6431 3038 3435 3966 6638 c7c0ddd108459ff8\n-000272f0: 6163 223e 3c64 6976 2063 6c61 7373 3d22 ac\">
    friend\n-00027380: 2061 7574 6f20 6f70 6572 6174 6f72 2b28 auto operator+(\n-00027390: 636f 6e73 7420 4669 656c 644d 6174 7269 const FieldMatri\n-000273a0: 7820 2661 6d70 3b6d 6174 7269 7841 2c20 x &matrixA, \n-000273b0: 636f 6e73 7420 4669 656c 644d 6174 7269 const FieldMatri\n-000273c0: 7826 6c74 3b20 4f74 6865 7253 6361 6c61 x< OtherScala\n-000273d0: 722c 2052 4f57 532c 2043 4f4c 5320 2667 r, ROWS, COLS &g\n-000273e0: 743b 2026 616d 703b 6d61 7472 6978 4229 t; &matrixB)\n-000273f0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    vector \n-00027410: 7370 6163 6520 6164 6469 7469 6f6e 20e2 space addition .\n-00027420: 8093 2074 776f 2d61 7267 756d 656e 7420 .. two-argument \n-00027430: 7665 7273 696f 6e3c 2f64 6976 3e3c 6469 version
    \n-00027450: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition fmatrix.hh:183\n-00027470: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .
    Du\n-00027510: 6e65 3a3a 4669 656c 644d 6174 7269 783a ne::FieldMatrix:\n-00027520: 3a6f 7065 7261 746f 723d 3c2f 613e 3c2f :operator=
    FieldMat\n-00027550: 7269 7820 2661 6d70 3b20 6f70 6572 6174 rix & operat\n-00027560: 6f72 3d28 636f 6e73 7420 4669 656c 644d or=(const FieldM\n-00027570: 6174 7269 7820 2661 6d70 3b29 3d64 6566 atrix &)=def\n-00027580: 6175 6c74 3c2f 6469 763e 3c64 6976 2063 ault
    cop\n-000275a0: 7920 6173 7369 676e 6d65 6e74 206f 7065 y assignment ope\n-000275b0: 7261 746f 723c 2f64 6976 3e3c 2f64 6976 rator
    .
    vect\n-00027720: 6f72 2073 7061 6365 2073 7562 7472 6163 or space subtrac\n-00027730: 7469 6f6e 20e2 8093 2074 776f 2d61 7267 tion ... two-arg\n-00027740: 756d 656e 7420 7665 7273 696f 6e3c 2f64 ument version
    Definit\n-00027770: 696f 6e3c 2f62 3e20 666d 6174 7269 782e ion fmatrix.\n-00027780: 6868 3a31 3937 3c2f 6469 763e 3c2f 6469 hh:197
    .
    c\n-00027860: 6f6e 7374 5f72 6f77 5f72 6566 6572 656e onst_row_referen\n-00027870: 6365 206d 6174 5f61 6363 6573 7328 7369 ce mat_access(si\n-00027880: 7a65 5f74 7970 6520 6929 2063 6f6e 7374 ze_type i) const\n-00027890: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n-000278b0: 6e69 7469 6f6e 3c2f 623e 2066 6d61 7472 nition fmatr\n-000278c0: 6978 2e68 683a 3337 353c 2f64 6976 3e3c ix.hh:375
    <\n-000278d0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    vector space ou\n-00027960: 7420 6f66 2061 2074 656e 736f 7220 7072 t of a tensor pr\n-00027970: 6f64 7563 7420 6f66 2066 6965 6c64 732e oduct of fields.\n-00027980: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n-000279a0: 6e69 7469 6f6e 3c2f 623e 2066 7665 6374 nition fvect\n-000279b0: 6f72 2e68 683a 3935 3c2f 6469 763e 3c2f or.hh:95
    .
    Dune::Dens\n-00027a60: 654d 6174 5665 6354 7261 6974 7326 6c74 eMatVecTraits<\n-00027a70: 3b20 4669 656c 644d 6174 7269 7826 6c74 ; FieldMatrix<\n-00027a80: 3b20 4b2c 2052 4f57 532c 2043 4f4c 5320 ; K, ROWS, COLS \n-00027a90: 2667 743b 2026 6774 3b3a 3a63 6f6e 7461 > >::conta\n-00027aa0: 696e 6572 5f74 7970 653c 2f61 3e3c 2f64 iner_type
    std::arra\n-00027ad0: 7926 6c74 3b20 726f 775f 7479 7065 2c20 y< row_type, \n-00027ae0: 524f 5753 2026 6774 3b20 636f 6e74 6169 ROWS > contai\n-00027af0: 6e65 725f 7479 7065 3c2f 6469 763e 3c64 ner_type
    Definition fmatrix.hh:95\n-00027b30: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
    .\n-00027cb0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    K\n-00027db0: 2076 616c 7565 5f74 7970 653c 2f64 6976 value_type
    Definitio\n-00027de0: 6e3c 2f62 3e20 666d 6174 7269 782e 6868 n fmatrix.hh\n-00027df0: 3a39 363c 2f64 6976 3e3c 2f64 6976 3e0a :96
    .\n-00027e00: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    Dune::DenseMatV\n-00027ea0: 6563 5472 6169 7473 266c 743b 2046 6965 ecTraits< Fie\n-00027eb0: 6c64 4d61 7472 6978 266c 743b 204b 2c20 ldMatrix< K, \n-00027ec0: 524f 5753 2c20 434f 4c53 2026 6774 3b20 ROWS, COLS > \n-00027ed0: 2667 743b 3a3a 636f 6e73 745f 726f 775f >::const_row_\n-00027ee0: 7265 6665 7265 6e63 653c 2f61 3e3c 2f64 reference
    const row\n-00027f10: 5f74 7970 6520 2661 6d70 3b20 636f 6e73 _type & cons\n-00027f20: 745f 726f 775f 7265 6665 7265 6e63 653c t_row_reference<\n-00027f30: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n-00027f50: 6974 696f 6e3c 2f62 3e20 666d 6174 7269 ition fmatri\n-00027f60: 782e 6868 3a39 333c 2f64 6976 3e3c 2f64 x.hh:93
    .
    Definition \n-000280c0: 666d 6174 7269 782e 6868 3a39 303c 2f64 fmatrix.hh:90
    .
    <\n-00028120: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n-00028130: 6522 3e3c 6120 6872 6566 3d22 6130 3137 e\">Dune:\n-00028170: 3a44 656e 7365 4d61 7456 6563 5472 6169 :DenseMatVecTrai\n-00028180: 7473 266c 743b 2046 6965 6c64 4d61 7472 ts< FieldMatr\n-00028190: 6978 266c 743b 204b 2c20 524f 5753 2c20 ix< K, ROWS, \n-000281a0: 434f 4c53 2026 6774 3b20 2667 743b 3a3a COLS > >::\n-000281b0: 7369 7a65 5f74 7970 653c 2f61 3e3c 2f64 size_type
    container\n-000281e0: 5f74 7970 653a 3a73 697a 655f 7479 7065 _type::size_type\n-000281f0: 2073 697a 655f 7479 7065 3c2f 6469 763e size_type
    \n-00028200: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n-00028220: 3c2f 623e 2066 6d61 7472 6978 2e68 683a fmatrix.hh:\n-00028230: 3937 3c2f 6469 763e 3c2f 6469 763e 0a3c 97
    .<\n-00028240: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n-00028250: 6964 3d22 6161 3031 3733 325f 6874 6d6c id=\"aa01732_html\n-00028260: 5f61 6366 3564 3334 6637 3736 3561 3931 _acf5d34f7765a91\n-00028270: 6137 3837 3661 6436 6664 3663 3637 6434 a7876ad6fd6c67d4\n-00028280: 3131 223e 3c64 6976 2063 6c61 7373 3d22 11\">\n-00028340: 726f 775f 7479 7065 2026 616d 703b 2072 row_type & r\n-00028350: 6f77 5f72 6566 6572 656e 6365 3c2f 6469 ow_reference
    Definiti\n-00028380: 6f6e 3c2f 623e 2066 6d61 7472 6978 2e68 on fmatrix.h\n-00028390: 683a 3932 3c2f 6469 763e 3c2f 6469 763e h:92
    \n-000283a0: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    Dune::FieldTra\n-00028440: 6974 7326 6c74 3b20 4669 656c 644d 6174 its< FieldMat\n-00028450: 7269 7826 6c74 3b20 4b2c 2052 4f57 532c rix< K, ROWS,\n-00028460: 2043 4f4c 5320 2667 743b 2026 6774 3b3a COLS > >:\n-00028470: 3a66 6965 6c64 5f74 7970 653c 2f61 3e3c :field_type<\n-00028480: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    FieldTr\n-000284a0: 6169 7473 266c 743b 204b 2026 6774 3b3a aits< K >:\n-000284b0: 3a66 6965 6c64 5f74 7970 6520 6669 656c :field_type fiel\n-000284c0: 645f 7479 7065 3c2f 6469 763e 3c64 6976 d_type
    <\n-000284e0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n-000284f0: 2066 6d61 7472 6978 2e68 683a 3130 333c fmatrix.hh:103<\n-00028500: 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6976 /div>
    .<\n-000285f0: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n-00028600: 6922 3e46 6965 6c64 5472 6169 7473 266c i\">FieldTraits&l\n-00028610: 743b 204b 2026 6774 3b3a 3a72 6561 6c5f t; K >::real_\n-00028620: 7479 7065 2072 6561 6c5f 7479 7065 3c2f type real_type
    Defini\n-00028650: 7469 6f6e 3c2f 623e 2066 6d61 7472 6978 tion fmatrix\n-00028660: 2e68 683a 3130 343c 2f64 6976 3e3c 2f64 .hh:104
    .
    <\n-000286f0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n-00028700: 2066 7472 6169 7473 2e68 683a 3236 3c2f ftraits.hh:26
    .
    \n-00028760: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
    Dune\n-000287b0: 3a3a 4669 656c 6454 7261 6974 733a 3a66 ::FieldTraits::f\n-000287c0: 6965 6c64 5f74 7970 653c 2f61 3e3c 2f64 ield_type
    T field_t\n-000287f0: 7970 653c 2f64 6976 3e3c 6469 7620 636c ype
    expo\n-00028810: 7274 2074 6865 2074 7970 6520 7265 7072 rt the type repr\n-00028820: 6573 656e 7469 6e67 2074 6865 2066 6965 esenting the fie\n-00028830: 6c64 3c2f 6469 763e 3c64 6976 2063 6c61 ld
    De\n-00028850: 6669 6e69 7469 6f6e 3c2f 623e 2066 7472 finition ftr\n-00028860: 6169 7473 2e68 683a 3238 3c2f 6469 763e aits.hh:28
    \n-00028870: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .T real_type
    export the\n-00028970: 2074 7970 6520 7265 7072 6573 656e 7469 type representi\n-00028980: 6e67 2074 6865 2072 6561 6c20 7479 7065 ng the real type\n-00028990: 206f 6620 7468 6520 6669 656c 643c 2f64 of the field
    Definit\n-000289c0: 696f 6e3c 2f62 3e20 6674 7261 6974 732e ion ftraits.\n-000289d0: 6868 3a33 303c 2f64 6976 3e3c 2f64 6976 hh:30
    .
    \n-00028a50: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n-00028a70: 3c2f 623e 206d 6174 7665 6374 7261 6974 matvectrait\n-00028a80: 732e 6868 3a33 313c 2f64 6976 3e3c 2f64 s.hh:31
    .
    Dune::Promo\n-00028b30: 7469 6f6e 5472 6169 7473 3a3a 5072 6f6d tionTraits::Prom\n-00028b40: 6f74 6564 5479 7065 3c2f 613e 3c2f 6469 otedType
    decltype(s\n-00028b70: 7464 3a3a 6465 636c 7661 6c26 6c74 3b20 td::declval< \n-00028b80: 5431 2026 6774 3b28 292b 7374 643a 3a64 T1 >()+std::d\n-00028b90: 6563 6c76 616c 266c 743b 2054 3220 2667 eclval< T2 &g\n-00028ba0: 743b 2829 2920 5072 6f6d 6f74 6564 5479 t;()) PromotedTy\n-00028bb0: 7065 3c2f 6469 763e 3c64 6976 2063 6c61 pe
    De\n-00028bd0: 6669 6e69 7469 6f6e 3c2f 623e 2070 726f finition pro\n-00028be0: 6d6f 7469 6f6e 7472 6169 7473 2e68 683a motiontraits.hh:\n-00028bf0: 3238 3c2f 6469 763e 3c2f 6469 763e 0a3c 28
    .<\n-00028c00: 2f64 6976 3e3c 212d 2d20 6672 6167 6d65 /div>
    ..
    .Gen\n-00028c80: 6572 6174 6564 2062 7926 2331 3630 3b3c erated by <\n-00028c90: 6120 6872 6566 3d22 6874 7470 733a 2f2f a href=\"https://\n-00028ca0: 7777 772e 646f 7879 6765 6e2e 6f72 672f www.doxygen.org/\n-00028cb0: 696e 6465 782e 6874 6d6c 223e 3c69 6d67 index.html\"> 1.\n-00028d10: 392e 380a 3c2f 736d 616c 6c3e 3c2f 6164 9.8...<\n-00028d30: 2f68 746d 6c3e 0a /html>.\n+000056e0: 3030 3238 3722 206e 616d 653d 226c 3030 00287\" name=\"l00\n+000056f0: 3238 3722 3e3c 2f61 3e3c 7370 616e 2063 287\"> \n+00005710: 3238 373c 2f73 7061 6e3e 2020 2020 2020 287 \n+00005720: 3c61 2063 6c61 7373 3d22 636f 6465 2068 FloatCmp::R\n+00005780: 6f75 6e64 696e 6753 7479 6c65 3c2f 613e oundingStyle\n+00005790: 2072 7374 796c 655f 203d 203c 6120 636c rstyle_ = \n+00005810: 466c 6f61 7443 6d70 3a3a 6465 6661 756c FloatCmp::defaul\n+00005820: 7452 6f75 6e64 696e 6753 7479 6c65 3c2f tRoundingStyle>
    ..
    \n+000058f0: 2032 3838 3c2f 613e 3c2f 7370 616e 3e20 288 \n+00005900: 203c 7370 616e 2063 6c61 7373 3d22 6b65 class \n+00005950: 466c 6f61 7443 6d70 4f70 733c 2f61 3e20 FloatCmpOps \n+00005960: 7b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 {
    .
    \n+000059b0: 2020 3238 393c 2f73 7061 6e3e 2020 2020 289 \n+000059c0: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef FloatC\n+00005a40: 6d70 3a3a 436d 7053 7479 6c65 3c2f 613e mp::CmpStyle\n+00005a50: 203c 6120 636c 6173 733d 2263 6f64 6520 CmpStyle;
    .
    290 \n+00005b10: 2020 3c73 7061 6e20 636c 6173 733d 226b typedef<\n+00005b30: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> Floa\n+00005b90: 7443 6d70 3a3a 526f 756e 6469 6e67 5374 tCmp::RoundingSt\n+00005ba0: 796c 653c 2f61 3e20 3c61 2063 6c61 7373 yle Rou\n+00005c00: 6e64 696e 6753 7479 6c65 3c2f 613e 3b3c ndingStyle;<\n+00005c10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00005c60: 3239 313c 2f73 7061 6e3e 203c 2f64 6976 291 .
    292<\n+00005cc0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> pu\n+00005ce0: 626c 6963 3c2f 7370 616e 3e3a 3c2f 6469 blic:.
    293\n+00005d40: 3c2f 7370 616e 3e20 2020 203c 7370 616e // record templ\n+00005d70: 6174 6520 7061 7261 6d65 7465 7273 3c2f ate parameters
    .<\n+00005dc0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00005dd0: 6e6f 223e 3c61 2063 6c61 7373 3d22 6c69 no\"> 295
    static\n+00005e50: 203c 7370 616e 2063 6c61 7373 3d22 6b65 const CmpStyl\n+00005ed0: 653c 2f61 3e20 3c61 2063 6c61 7373 3d22 e cstyle = cstyle_;.
    \n+00005fd0: 2020 3239 373c 2f61 3e3c 2f73 7061 6e3e 297\n+00005fe0: 2020 2020 3c73 7061 6e20 636c 6173 733d static\n+00006000: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c co\n+00006020: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst \n+00006080: 526f 756e 6469 6e67 5374 796c 653c 2f61 RoundingStyle rstyle = \n+000060f0: 7273 7479 6c65 5f3b 3c2f 6469 763e 0a3c rstyle_;
    .<\n+00006100: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00006110: 3e3c 6120 6964 3d22 6c30 3032 3939 2220 > 29\n+00006190: 393c 2f61 3e3c 2f73 7061 6e3e 2020 2020 9 \n+000061a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 typedef T ValueType\n+00006220: 3c2f 613e 3b3c 2f64 6976 3e0a 3c64 6976 ;
    .<\n+00006260: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00006270: 6e6f 223e 2020 3330 313c 2f73 7061 6e3e no\"> 301\n+00006280: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    .
    \n+000062d0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 304 t\n+00006340: 7970 6564 6566 3c2f 7370 616e 3e20 3c73 ypedef typename FloatCmp::Ep\n+000063d0: 7369 6c6f 6e54 7970 6526 6c74 3b54 2667 silonType<T&g\n+000063e0: 743b 3a3a 5479 7065 3c2f 613e 203c 6120 t;::Type Eps\n+00006440: 696c 6f6e 5479 7065 3c2f 613e 3b3c 2f64 ilonType;.
    30\n+000064a0: 353c 2f73 7061 6e3e 203c 2f64 6976 3e0a 5
    .\n+000064b0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
    <\n+000064e0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 306 priv\n+00006520: 6174 653c 2f73 7061 6e3e 3a3c 2f64 6976 ate:.
    307<\n+00006580: 2f73 7061 6e3e 2020 2020 3c61 2063 6c61 /span> Epsilo\n+000065e0: 6e54 7970 653c 2f61 3e20 6570 7369 6c6f nType epsilo\n+000065f0: 6e5f 3b3c 2f64 6976 3e0a 3c64 6976 2063 n_;
    .
    308 <\n+00006650: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>..<\n+00006780: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+00006790: 3e3c 6120 6964 3d22 6c30 3033 3130 2220 > 310
    .
    311 \n+00006830: 203c 7370 616e 2063 6c61 7373 3d22 6b65 public:
    .<\n+00006890: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+000068a0: 6e6f 223e 2020 3331 333c 2f73 7061 6e3e no\"> 313\n+000068b0: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
    ..\n+00006a80: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00006b10: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00006b20: 6e6f 223e 2020 3331 393c 2f73 7061 6e3e no\"> 319\n+00006b30: 2020 2020 3c61 2063 6c61 7373 3d22 636f EpsilonType<\n+00006b90: 2f61 3e20 3c61 2063 6c61 7373 3d22 636f /a> epsilon\n+00006bf0: 2829 203c 7370 616e 2063 6c61 7373 3d22 () const;
    .<\n+00006c30: 6120 6964 3d22 6c30 3033 3231 2220 6e61 a id=\"l00321\" na\n+00006c40: 6d65 3d22 6c30 3033 3231 223e 3c2f 613e me=\"l00321\">\n+00006c50: 3c73 7061 6e20 636c 6173 733d 226c 696e 321 v\n+00006c90: 6f69 643c 2f73 7061 6e3e 203c 6120 636c oid epsi\n+00006cf0: 6c6f 6e3c 2f61 3e28 3c61 2063 6c61 7373 lon(EpsilonT\n+00006d50: 7970 653c 2f61 3e20 6570 7369 6c6f 6e5f ype epsilon_\n+00006d60: 5f29 3b3c 2f64 6976 3e0a 3c64 6976 2063 _);
    .
    322 <\n+00006dc0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00006e10: 3332 343c 2f73 7061 6e3e 2020 2020 3c73 324 bool eq(const <\n+00006ec0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00006ed0: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef\" href=\"\n+00006ee0: 6130 3137 3230 2e68 746d 6c23 6164 3233 a01720.html#ad23\n+00006ef0: 3035 6537 6530 3531 3431 6631 3634 3730 05e7e05141f16470\n+00006f00: 6164 3163 3431 3738 3833 3463 3222 3e56 ad1c4178834c2\">V\n+00006f10: 616c 7565 5479 7065 3c2f 613e 2026 616d alueType &am\n+00006f20: 703b 6669 7273 742c 203c 7370 616e 2063 p;first, c\n+00006f40: 6f6e 7374 3c2f 7370 616e 3e20 3c61 2063 onst Valu\n+00006fa0: 6554 7970 653c 2f61 3e20 2661 6d70 3b73 eType &s\n+00006fb0: 6563 6f6e 6429 203c 7370 616e 2063 6c61 econd) con\n+00006fd0: 7374 3c2f 7370 616e 3e3b 3c2f 6469 763e st;
    \n+00006fe0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00007050: 6120 6964 3d22 6c30 3033 3239 2220 6e61 a id=\"l00329\" na\n+00007060: 6d65 3d22 6c30 3033 3239 223e 3c2f 613e me=\"l00329\">\n+00007070: 3c73 7061 6e20 636c 6173 733d 226c 696e 329 b\n+000070b0: 6f6f 6c3c 2f73 7061 6e3e 203c 6120 636c ool ne(const ValueType<\n+00007190: 2f61 3e20 2661 6d70 3b66 6972 7374 2c20 /a> &first, \n+000071a0: 3c73 7061 6e20 636c 6173 733d 226b 6579 const ValueType\n+00007220: 2026 616d 703b 7365 636f 6e64 2920 3c73 &second) const\n+00007250: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+000072a0: 2020 3333 313c 2f73 7061 6e3e 203c 2f64 331 .
    33\n+00007300: 353c 2f73 7061 6e3e 2020 2020 3c73 7061 5 bool gt(\n+000073a0: 636f 6e73 743c 2f73 7061 6e3e 203c 6120 const Val\n+00007400: 7565 5479 7065 3c2f 613e 2026 616d 703b ueType &\n+00007410: 6669 7273 742c 203c 7370 616e 2063 6c61 first, con\n+00007430: 7374 3c2f 7370 616e 3e20 3c61 2063 6c61 st ValueT\n+00007490: 7970 653c 2f61 3e20 2661 6d70 3b73 6563 ype &sec\n+000074a0: 6f6e 6429 203c 7370 616e 2063 6c61 7373 ond) const\n+000074c0: 3c2f 7370 616e 3e3b 3c2f 6469 763e 0a3c ;
    .<\n+000074d0: 6469 7620 636c 6173 733d 226c 696e 6522 div class=\"line\"\n+000074e0: 3e3c 6120 6964 3d22 6c30 3033 3337 2220 > 337
    .
    341 \n+00007580: 2020 203c 7370 616e 2063 6c61 7373 3d22 boo\n+000075a0: 6c3c 2f73 7061 6e3e 203c 6120 636c 6173 l lt\n+00007600: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (const ValueType &first, const\n+000076b0: 203c 6120 636c 6173 733d 2263 6f64 6520 ValueType &\n+00007710: 616d 703b 7365 636f 6e64 2920 3c73 7061 amp;second) const;<\n+00007740: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00007790: 3334 333c 2f73 7061 6e3e 203c 2f64 6976 343 .
    347<\n+000077f0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> bool \n+00007820: 3c61 2063 6c61 7373 3d22 636f 6465 2068 ge(co\n+00007890: 6e73 743c 2f73 7061 6e3e 203c 6120 636c nst Value\n+000078f0: 5479 7065 3c2f 613e 2026 616d 703b 6669 Type &fi\n+00007900: 7273 742c 203c 7370 616e 2063 6c61 7373 rst, const\n+00007920: 3c2f 7370 616e 3e20 3c61 2063 6c61 7373 ValueTyp\n+00007980: 653c 2f61 3e20 2661 6d70 3b73 6563 6f6e e &secon\n+00007990: 6429 203c 7370 616e 2063 6c61 7373 3d22 d) const;
    .<\n+000079d0: 6120 6964 3d22 6c30 3033 3439 2220 6e61 a id=\"l00349\" na\n+000079e0: 6d65 3d22 6c30 3033 3439 223e 3c2f 613e me=\"l00349\">\n+000079f0: 3c73 7061 6e20 636c 6173 733d 226c 696e 349
    .
    353 \n+00007a70: 203c 7370 616e 2063 6c61 7373 3d22 6b65 bool<\n+00007a90: 2f73 7061 6e3e 203c 6120 636c 6173 733d /span> le(<\n+00007af0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00007b00: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord\">const ValueType \n+00007b70: 2661 6d70 3b66 6972 7374 2c20 3c73 7061 &first, const <\n+00007ba0: 6120 636c 6173 733d 2263 6f64 6520 686c a class=\"code hl\n+00007bb0: 5f74 7970 6564 6566 2220 6872 6566 3d22 _typedef\" href=\"\n+00007bc0: 6130 3137 3230 2e68 746d 6c23 6164 3233 a01720.html#ad23\n+00007bd0: 3035 6537 6530 3531 3431 6631 3634 3730 05e7e05141f16470\n+00007be0: 6164 3163 3431 3738 3833 3463 3222 3e56 ad1c4178834c2\">V\n+00007bf0: 616c 7565 5479 7065 3c2f 613e 2026 616d alueType &am\n+00007c00: 703b 7365 636f 6e64 2920 3c73 7061 6e20 p;second) \n+00007c20: 636f 6e73 743c 2f73 7061 6e3e 3b3c 2f64 const;.
    35\n+00007c80: 343c 2f73 7061 6e3e 203c 2f64 6976 3e0a 4
    .\n+00007c90: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00007d20: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00007d30: 6e6f 223e 2020 3336 353c 2f73 7061 6e3e no\"> 365\n+00007d40: 2020 2020 3c73 7061 6e20 636c 6173 733d templa\n+00007d60: 7465 3c2f 7370 616e 3e26 6c74 3b3c 7370 te<class \n+00007d90: 4926 6774 3b3c 2f64 6976 3e0a 3c64 6976 I>
    .<\n+00007dd0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00007de0: 6e6f 223e 2020 3336 363c 2f73 7061 6e3e no\"> 366\n+00007df0: 2020 2020 4920 3c61 2063 6c61 7373 3d22 I round\n+00007e50: 283c 7370 616e 2063 6c61 7373 3d22 6b65 (const ValueType &val) const;<\n+00007f00: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00007f50: 3336 373c 2f73 7061 6e3e 203c 2f64 6976 367 .
    369<\n+00007fb0: 2f73 7061 6e3e 203c 2f64 6976 3e0a 3c64 /span>
    .\n+00007fd0: 3c61 2069 643d 226c 3030 3337 3822 206e 378 temp\n+00008030: 6c61 7465 3c2f 7370 616e 3e26 6c74 3b3c late<<\n+00008040: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class=\"keyw\n+00008050: 6f72 6422 3e63 6c61 7373 3c2f 7370 616e ord\">class I>
    .\n+00008080: 3c61 2069 643d 226c 3030 3337 3922 206e 379 I trunc(const ValueType<\n+000081a0: 2f61 3e20 2661 6d70 3b76 616c 2920 3c73 /a> &val) const\n+000081d0: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
    .
    \n+00008220: 2020 3338 303c 2f73 7061 6e3e 203c 2f64 380 .
    38\n+00008280: 313c 2f73 7061 6e3e 2020 7d3b 3c2f 6469 1 };.
    .
    382 <\n+000082f0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    \n+00008340: 3338 333c 2f73 7061 6e3e 7d20 3c73 7061 383} //namespace Du\n+00008370: 6e65 3c2f 7370 616e 3e3c 2f64 6976 3e0a ne
    .\n+00008380: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 .<\n+00008410: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class=\"line\n+00008420: 6e6f 223e 2020 3338 353c 2f73 7061 6e3e no\"> 385\n+00008430: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl\n+00008450: 7564 6520 2671 756f 743b 3c61 2063 6c61 ude "flo\n+00008480: 6174 5f63 6d70 2e63 633c 2f61 3e26 7175 at_cmp.cc&qu\n+00008490: 6f74 3b3c 2f73 7061 6e3e 3c2f 6469 763e ot;
    \n+000084a0: 0a3c 6469 7620 636c 6173 733d 226c 696e ..<\n+00008510: 6120 6964 3d22 6c30 3033 3837 2220 6e61 a id=\"l00387\" na\n+00008520: 6d65 3d22 6c30 3033 3837 223e 3c2f 613e me=\"l00387\">\n+00008530: 3c73 7061 6e20 636c 6173 733d 226c 696e 387#end\n+00008570: 6966 203c 2f73 7061 6e3e 3c73 7061 6e20 if \n+00008590: 2f2f 4455 4e45 5f43 4f4d 4d4f 4e5f 464c //DUNE_COMMON_FL\n+000085a0: 4f41 545f 434d 505f 4848 3c2f 7370 616e OAT_CMP_HH
    .
    <\n+000085f0: 6120 6872 6566 3d22 6130 3031 3730 2e68 a href=\"a00170.h\n+00008600: 746d 6c22 3e66 6c6f 6174 5f63 6d70 2e63 tml\">float_cmp.c\n+00008610: 633c 2f61 3e3c 2f64 6976 3e3c 2f64 6976 c
    .
    Dune::Float\n+000086c0: 436d 703a 3a6e 653c 2f61 3e3c 2f64 6976 Cmp::ne
    bool ne(con\n+000086f0: 7374 2054 2026 616d 703b 6669 7273 742c st T &first,\n+00008700: 2063 6f6e 7374 2054 2026 616d 703b 7365 const T &se\n+00008710: 636f 6e64 2c20 7479 7065 6e61 6d65 2045 cond, typename E\n+00008720: 7073 696c 6f6e 5479 7065 266c 743b 2054 psilonType< T\n+00008730: 2026 6774 3b3a 3a54 7970 6520 6570 7369 >::Type epsi\n+00008740: 6c6f 6e29 3c2f 6469 763e 3c64 6976 2063 lon)
    tes\n+00008760: 7420 666f 7220 696e 6571 7561 6c69 7479 t for inequality\n+00008770: 2075 7369 6e67 2065 7073 696c 6f6e 3c2f using epsilon
    Defini\n+000087a0: 7469 6f6e 3c2f 623e 2066 6c6f 6174 5f63 tion float_c\n+000087b0: 6d70 2e63 633a 3135 313c 2f64 6976 3e3c mp.cc:151
    <\n+000087c0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    C\n+00008890: 6d70 5374 796c 653c 2f64 6976 3e3c 6469 mpStyle
    \n+000088b0: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition float_cmp.hh:1\n+000088d0: 3034 3c2f 6469 763e 3c2f 6469 763e 0a3c 04
    .<\n+000088e0: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n+000088f0: 6964 3d22 6161 3030 3430 395f 6874 6d6c id=\"aa00409_html\n+00008900: 5f67 6135 3063 3933 6536 3933 6631 3032 _ga50c93e693f102\n+00008910: 3239 3863 3631 6563 6231 3437 3538 6638 298c61ecb14758f8\n+00008920: 6435 6222 3e3c 6469 7620 636c 6173 733d d5b\">bool eq(const \n+000089b0: 5420 2661 6d70 3b66 6972 7374 2c20 636f T &first, co\n+000089c0: 6e73 7420 5420 2661 6d70 3b73 6563 6f6e nst T &secon\n+000089d0: 642c 2074 7970 656e 616d 6520 4570 7369 d, typename Epsi\n+000089e0: 6c6f 6e54 7970 6526 6c74 3b20 5420 2667 lonType< T &g\n+000089f0: 743b 3a3a 5479 7065 2065 7073 696c 6f6e t;::Type epsilon\n+00008a00: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    test f\n+00008a20: 6f72 2065 7175 616c 6974 7920 7573 696e or equality usin\n+00008a30: 6720 6570 7369 6c6f 6e3c 2f64 6976 3e3c g epsilon
    <\n+00008a40: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n+00008a50: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n+00008a60: 2f62 3e20 666c 6f61 745f 636d 702e 6363 /b> float_cmp.cc\n+00008a70: 3a31 3434 3c2f 6469 763e 3c2f 6469 763e :144
    \n+00008a80: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    Dune::FloatC\n+00008b20: 6d70 3a3a 726f 756e 643c 2f61 3e3c 2f64 mp::round
    I round(c\n+00008b50: 6f6e 7374 2054 2026 616d 703b 7661 6c2c onst T &val,\n+00008b60: 2074 7970 656e 616d 6520 4570 7369 6c6f typename Epsilo\n+00008b70: 6e54 7970 6526 6c74 3b20 5420 2667 743b nType< T >\n+00008b80: 3a3a 5479 7065 2065 7073 696c 6f6e 293c ::Type epsilon)<\n+00008b90: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    round us\n+00008bb0: 696e 6720 6570 7369 6c6f 6e3c 2f64 6976 ing epsilon
    Definitio\n+00008be0: 6e3c 2f62 3e20 666c 6f61 745f 636d 702e n float_cmp.\n+00008bf0: 6363 3a33 3131 3c2f 6469 763e 3c2f 6469 cc:311
    .
    Dune::Floa\n+00008ca0: 7443 6d70 3a3a 7472 756e 633c 2f61 3e3c tCmp::trunc<\n+00008cb0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    I trunc\n+00008cd0: 2863 6f6e 7374 2054 2026 616d 703b 7661 (const T &va\n+00008ce0: 6c2c 2074 7970 656e 616d 6520 4570 7369 l, typename Epsi\n+00008cf0: 6c6f 6e54 7970 6526 6c74 3b20 5420 2667 lonType< T &g\n+00008d00: 743b 3a3a 5479 7065 2065 7073 696c 6f6e t;::Type epsilon\n+00008d10: 293c 2f64 6976 3e3c 6469 7620 636c 6173 )
    trunca\n+00008d30: 7465 2075 7369 6e67 2065 7073 696c 6f6e te using epsilon\n+00008d40: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n+00008d60: 6e69 7469 6f6e 3c2f 623e 2066 6c6f 6174 nition float\n+00008d70: 5f63 6d70 2e63 633a 3430 373c 2f64 6976 _cmp.cc:407
    .
    Dune:\n+00008e20: 3a46 6c6f 6174 436d 703a 3a52 6f75 6e64 :FloatCmp::Round\n+00008e30: 696e 6753 7479 6c65 3c2f 613e 3c2f 6469 ingStyle
    RoundingSt\n+00008e60: 796c 653c 2f64 6976 3e3c 6469 7620 636c yle
    D\n+00008e80: 6566 696e 6974 696f 6e3c 2f62 3e20 666c efinition fl\n+00008e90: 6f61 745f 636d 702e 6868 3a31 3136 3c2f oat_cmp.hh:116
    .
    bo\n+00008f70: 6f6c 206c 7428 636f 6e73 7420 5420 2661 ol lt(const T &a\n+00008f80: 6d70 3b66 6972 7374 2c20 636f 6e73 7420 mp;first, const \n+00008f90: 5420 2661 6d70 3b73 6563 6f6e 642c 2074 T &second, t\n+00008fa0: 7970 656e 616d 6520 4570 7369 6c6f 6e54 ypename EpsilonT\n+00008fb0: 7970 6526 6c74 3b20 5420 2667 743b 3a3a ype< T >::\n+00008fc0: 5479 7065 2065 7073 696c 6f6e 293c 2f64 Type epsilon)
    test if fi\n+00008ff0: 7273 7420 6c65 7373 6572 2074 6861 6e20 rst lesser than \n+00009000: 7365 636f 6e64 3c2f 6469 763e 3c64 6976 second
    <\n+00009020: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n+00009030: 2066 6c6f 6174 5f63 6d70 2e63 633a 3136 float_cmp.cc:16\n+00009040: 353c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 5
    .bool gt(const T\n+00009120: 2026 616d 703b 6669 7273 742c 2063 6f6e &first, con\n+00009130: 7374 2054 2026 616d 703b 7365 636f 6e64 st T &second\n+00009140: 2c20 7479 7065 6e61 6d65 2045 7073 696c , typename Epsil\n+00009150: 6f6e 5479 7065 266c 743b 2054 2026 6774 onType< T >\n+00009160: 3b3a 3a54 7970 6520 6570 7369 6c6f 6e29 ;::Type epsilon)\n+00009170: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    test if\n+00009190: 2066 6972 7374 2067 7265 6174 6572 2074 first greater t\n+000091a0: 6861 6e20 7365 636f 6e64 3c2f 6469 763e han second
    \n+000091b0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n+000091d0: 3c2f 623e 2066 6c6f 6174 5f63 6d70 2e63 float_cmp.c\n+000091e0: 633a 3135 383c 2f64 6976 3e3c 2f64 6976 c:158
    .
    Dune::Float\n+00009290: 436d 703a 3a67 653c 2f61 3e3c 2f64 6976 Cmp::ge
    bool ge(con\n+000092c0: 7374 2054 2026 616d 703b 6669 7273 742c st T &first,\n+000092d0: 2063 6f6e 7374 2054 2026 616d 703b 7365 const T &se\n+000092e0: 636f 6e64 2c20 7479 7065 6e61 6d65 2045 cond, typename E\n+000092f0: 7073 696c 6f6e 5479 7065 266c 743b 2054 psilonType< T\n+00009300: 2026 6774 3b3a 3a54 7970 6520 6570 7369 >::Type epsi\n+00009310: 6c6f 6e29 3c2f 6469 763e 3c64 6976 2063 lon)
    tes\n+00009330: 7420 6966 2066 6972 7374 2067 7265 6174 t if first great\n+00009340: 6572 206f 7220 6571 7561 6c20 7365 636f er or equal seco\n+00009350: 6e64 3c2f 6469 763e 3c64 6976 2063 6c61 nd
    De\n+00009370: 6669 6e69 7469 6f6e 3c2f 623e 2066 6c6f finition flo\n+00009380: 6174 5f63 6d70 2e63 633a 3137 323c 2f64 at_cmp.cc:172
    .\n+00009540: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    Dune::Fl\n+00009620: 6f61 7443 6d70 3a3a 6465 6661 756c 7443 oatCmp::defaultC\n+00009630: 6d70 5374 796c 653c 2f61 3e3c 2f64 6976 mpStyle
    @ defaultCm\n+00009660: 7053 7479 6c65 3c2f 6469 763e 3c64 6976 pStyle
    t\n+00009680: 6865 2067 6c6f 6261 6c20 6465 6661 756c he global defaul\n+00009690: 7420 636f 6d70 6172 6520 7374 796c 6520 t compare style \n+000096a0: 2872 656c 6174 6976 655f 7765 616b 293c (relative_weak)<\n+000096b0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+000096d0: 6974 696f 6e3c 2f62 3e20 666c 6f61 745f ition float_\n+000096e0: 636d 702e 6868 3a31 3132 3c2f 6469 763e cmp.hh:112
    \n+000096f0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    <\n+00009760: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n+00009770: 6522 3e3c 6120 6872 6566 3d22 6130 3034 e\">Du\n+000097d0: 6e65 3a3a 466c 6f61 7443 6d70 3a3a 7265 ne::FloatCmp::re\n+000097e0: 6c61 7469 7665 5374 726f 6e67 3c2f 613e lativeStrong\n+000097f0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    @ rela\n+00009810: 7469 7665 5374 726f 6e67 3c2f 6469 763e tiveStrong
    \n+00009820: 3c64 6976 2063 6c61 7373 3d22 7474 646f
    |a-b|/|a| <\n+00009840: 3b3d 2065 7073 696c 6f6e 2026 616d 703b ;= epsilon &\n+00009850: 2661 6d70 3b20 7c61 2d62 7c2f 7c62 7c20 & |a-b|/|b| \n+00009860: 266c 743b 3d20 6570 7369 6c6f 6e3c 2f64 <= epsilon
    Definit\n+00009890: 696f 6e3c 2f62 3e20 666c 6f61 745f 636d ion float_cm\n+000098a0: 702e 6868 3a31 3038 3c2f 6469 763e 3c2f p.hh:108
    .
    Dune\n+00009990: 3a3a 466c 6f61 7443 6d70 3a3a 7265 6c61 ::FloatCmp::rela\n+000099a0: 7469 7665 5765 616b 3c2f 613e 3c2f 6469 tiveWeak
    @ relative\n+000099d0: 5765 616b 3c2f 6469 763e 3c64 6976 2063 Weak
    |a-\n+000099f0: 627c 2f7c 617c 2026 6c74 3b3d 2065 7073 b|/|a| <= eps\n+00009a00: 696c 6f6e 207c 7c20 7c61 2d62 7c2f 7c62 ilon || |a-b|/|b\n+00009a10: 7c20 266c 743b 3d20 6570 7369 6c6f 6e3c | <= epsilon<\n+00009a20: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+00009a40: 6974 696f 6e3c 2f62 3e20 666c 6f61 745f ition float_\n+00009a50: 636d 702e 6868 3a31 3036 3c2f 6469 763e cmp.hh:106
    \n+00009a60: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
    .
    <\n+00009ad0: 6469 7620 636c 6173 733d 2274 746e 616d div class=\"ttnam\n+00009ae0: 6522 3e3c 6120 6872 6566 3d22 6130 3034 e\">Du\n+00009b40: 6e65 3a3a 466c 6f61 7443 6d70 3a3a 6162 ne::FloatCmp::ab\n+00009b50: 736f 6c75 7465 3c2f 613e 3c2f 6469 763e solute
    \n+00009b60: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    @ absolute
    |a-b| <\n+00009ba0: 3b3d 2065 7073 696c 6f6e 3c2f 6469 763e ;= epsilon
    \n+00009bb0: 3c64 6976 2063 6c61 7373 3d22 7474 6465
    Definition\n+00009bd0: 3c2f 623e 2066 6c6f 6174 5f63 6d70 2e68 float_cmp.h\n+00009be0: 683a 3131 303c 2f64 6976 3e3c 2f64 6976 h:110
    .
    Dune::F\n+00009cd0: 6c6f 6174 436d 703a 3a74 6f77 6172 645a loatCmp::towardZ\n+00009ce0: 6572 6f3c 2f61 3e3c 2f64 6976 3e3c 6469 ero
    @ towardZero
    always rou\n+00009d30: 6e64 2074 6f77 6172 6420 303c 2f64 6976 nd toward 0
    Definitio\n+00009d60: 6e3c 2f62 3e20 666c 6f61 745f 636d 702e n float_cmp.\n+00009d70: 6868 3a31 3138 3c2f 6469 763e 3c2f 6469 hh:118
    .
    <\n+00009e00: 6120 6872 6566 3d22 6130 3034 3039 2e68 a href=\"a00409.h\n+00009e10: 746d 6c23 6767 6138 3530 3765 3937 3163 tml#gga8507e971c\n+00009e20: 3435 3234 3361 6564 3263 3464 6531 6233 45243aed2c4de1b3\n+00009e30: 3733 3663 6130 3461 3062 6131 6139 6238 736ca04a0ba1a9b8\n+00009e40: 6363 6530 3033 3466 3662 3061 3662 6566 cce0034f6b0a6bef\n+00009e50: 3462 3165 6236 3730 223e 4475 6e65 3a3a 4b1eb670\">Dune::\n+00009e60: 466c 6f61 7443 6d70 3a3a 746f 7761 7264 FloatCmp::toward\n+00009e70: 496e 663c 2f61 3e3c 2f64 6976 3e3c 6469 Inf
    @ towardInf
    always roun\n+00009ec0: 6420 6177 6179 2066 726f 6d20 303c 2f64 d away from 0
    Definit\n+00009ef0: 696f 6e3c 2f62 3e20 666c 6f61 745f 636d ion float_cm\n+00009f00: 702e 6868 3a31 3230 3c2f 6469 763e 3c2f p.hh:120
    .\n+0000a020: 4020 7570 7761 7264 3c2f 6469 763e 3c64 @ upward
    round toward
    Definit\n+0000a070: 696f 6e3c 2f62 3e20 666c 6f61 745f 636d ion float_cm\n+0000a080: 702e 6868 3a31 3234 3c2f 6469 763e 3c2f p.hh:124
    .@ downward
    round towar\n+0000a1d0: 643c 2f64 6976 3e3c 6469 7620 636c 6173 d
    Def\n+0000a1f0: 696e 6974 696f 6e3c 2f62 3e20 666c 6f61 inition floa\n+0000a200: 745f 636d 702e 6868 3a31 3232 3c2f 6469 t_cmp.hh:122
    .the global defa\n+0000a370: 756c 7420 726f 756e 6469 6e67 2073 7479 ult rounding sty\n+0000a380: 6c65 2028 746f 7761 7264 5f7a 6572 6f29 le (toward_zero)\n+0000a390: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n+0000a3b0: 6e69 7469 6f6e 3c2f 623e 2066 6c6f 6174 nition float\n+0000a3c0: 5f63 6d70 2e68 683a 3132 363c 2f64 6976 _cmp.hh:126
    .
    <\n+0000a410: 6120 6872 6566 3d22 6130 3034 3235 2e68 a href=\"a00425.h\n+0000a420: 746d 6c22 3e44 756e 653c 2f61 3e3c 2f64 tml\">Dune
    Dune names\n+0000a450: 7061 6365 2e3c 2f64 6976 3e3c 6469 7620 pace.
    Definition \n+0000a480: 616c 6967 6e65 6461 6c6c 6f63 6174 6f72 alignedallocator\n+0000a490: 2e68 683a 3133 3c2f 6469 763e 3c2f 6469 .hh:13
    .
    <\n+0000a560: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n+0000a570: 6922 3e54 2054 7970 653c 2f64 6976 3e3c i\">T Type
    <\n+0000a580: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+0000a590: 223e 5468 6520 6570 7369 6c6f 6e20 7479 \">The epsilon ty\n+0000a5a0: 7065 2063 6f72 7265 7370 6f6e 6469 6e67 pe corresponding\n+0000a5b0: 2074 6f20 7661 6c75 6520 7479 7065 2054 to value type T\n+0000a5c0: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
    Def\n+0000a5e0: 696e 6974 696f 6e3c 2f62 3e20 666c 6f61 inition floa\n+0000a5f0: 745f 636d 702e 6363 3a32 353c 2f64 6976 t_cmp.cc:25
    .
    <\n+0000a640: 6120 6872 6566 3d22 6130 3137 3136 2e68 a href=\"a01716.h\n+0000a650: 746d 6c22 3e44 756e 653a 3a46 6c6f 6174 tml\">Dune::Float\n+0000a660: 436d 703a 3a44 6566 6175 6c74 4570 7369 Cmp::DefaultEpsi\n+0000a670: 6c6f 6e3c 2f61 3e3c 2f64 6976 3e3c 6469 lon
    \n+0000a690: 6d61 7070 696e 6720 6672 6f6d 2061 2076 mapping from a v\n+0000a6a0: 616c 7565 2074 7970 6520 616e 6420 6120 alue type and a \n+0000a6b0: 636f 6d70 6172 6520 7374 796c 6520 746f compare style to\n+0000a6c0: 2061 2064 6566 6175 6c74 2065 7073 696c a default epsil\n+0000a6d0: 6f6e 3c2f 6469 763e 3c64 6976 2063 6c61 on
    De\n+0000a6f0: 6669 6e69 7469 6f6e 3c2f 623e 2066 6c6f finition flo\n+0000a700: 6174 5f63 6d70 2e68 683a 3133 383c 2f64 at_cmp.hh:138
    .
    st\n+0000a7f0: 6174 6963 2045 7073 696c 6f6e 5479 7065 atic EpsilonType\n+0000a800: 266c 743b 2054 2026 6774 3b3a 3a54 7970 < T >::Typ\n+0000a810: 6520 7661 6c75 6528 293c 2f64 6976 3e3c e value()
    <\n+0000a820: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+0000a830: 223e 5265 7475 726e 7320 7468 6520 6465 \">Returns the de\n+0000a840: 6661 756c 7420 6570 7369 6c6f 6e20 666f fault epsilon fo\n+0000a850: 7220 7468 6520 6769 7665 6e20 7661 6c75 r the given valu\n+0000a860: 6520 7479 7065 2061 6e64 2063 6f6d 7061 e type and compa\n+0000a870: 7265 2073 7479 6c65 2e3c 2f64 6976 3e3c re style.
    <\n+0000a880: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    Class encapsula\n+0000a910: 7469 6e67 2061 2064 6566 6175 6c74 2065 ting a default e\n+0000a920: 7073 696c 6f6e 2e3c 2f64 6976 3e3c 6469 psilon.
    \n+0000a940: 3c62 3e44 6566 696e 6974 696f 6e3c 2f62 Definition float_cmp.hh:2\n+0000a960: 3838 3c2f 6469 763e 3c2f 6469 763e 0a3c 88
    .<\n+0000a970: 6469 7620 636c 6173 733d 2274 7463 2220 div class=\"ttc\" \n+0000a980: 6964 3d22 6161 3031 3732 305f 6874 6d6c id=\"aa01720_html\n+0000a990: 5f61 3135 3764 6263 3363 6135 3631 3466 _a157dbc3ca5614f\n+0000a9a0: 3533 6531 3239 6266 6333 3232 6564 6535 53e129bfc322ede5\n+0000a9b0: 3964 223e 3c64 6976 2063 6c61 7373 3d22 9d\"><\n+0000aa20: 6469 7620 636c 6173 733d 2274 7464 6563 div class=\"ttdec\n+0000aa30: 6922 3e62 6f6f 6c20 6c65 2863 6f6e 7374 i\">bool le(const\n+0000aa40: 2056 616c 7565 5479 7065 2026 616d 703b ValueType &\n+0000aa50: 6669 7273 742c 2063 6f6e 7374 2056 616c first, const Val\n+0000aa60: 7565 5479 7065 2026 616d 703b 7365 636f ueType &seco\n+0000aa70: 6e64 2920 636f 6e73 743c 2f64 6976 3e3c nd) const
    <\n+0000aa80: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+0000aa90: 223e 7465 7374 2069 6620 6669 7273 7420 \">test if first \n+0000aaa0: 6c65 7373 6572 206f 7220 6571 7561 6c20 lesser or equal \n+0000aab0: 7365 636f 6e64 3c2f 6469 763e 3c64 6976 second
    <\n+0000aad0: 623e 4465 6669 6e69 7469 6f6e 3c2f 623e b>Definition\n+0000aae0: 2066 6c6f 6174 5f63 6d70 2e63 633a 3438 float_cmp.cc:48\n+0000aaf0: 363c 2f64 6976 3e3c 2f64 6976 3e0a 3c64 6
    .bool eq(const \n+0000abd0: 5661 6c75 6554 7970 6520 2661 6d70 3b66 ValueType &f\n+0000abe0: 6972 7374 2c20 636f 6e73 7420 5661 6c75 irst, const Valu\n+0000abf0: 6554 7970 6520 2661 6d70 3b73 6563 6f6e eType &secon\n+0000ac00: 6429 2063 6f6e 7374 3c2f 6469 763e 3c64 d) const
    test for equali\n+0000ac30: 7479 2075 7369 6e67 2065 7073 696c 6f6e ty using epsilon\n+0000ac40: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    Defi\n+0000ac60: 6e69 7469 6f6e 3c2f 623e 2066 6c6f 6174 nition float\n+0000ac70: 5f63 6d70 2e63 633a 3435 313c 2f64 6976 _cmp.cc:451
    .\n+0000ad50: 7374 6174 6963 2063 6f6e 7374 2043 6d70 static const Cmp\n+0000ad60: 5374 796c 6520 6373 7479 6c65 3c2f 6469 Style cstyle
    How compari\n+0000ad90: 736f 6e73 2061 7265 2064 6f6e 652e 3c2f sons are done.
    Defini\n+0000adc0: 7469 6f6e 3c2f 623e 2066 6c6f 6174 5f63 tion float_c\n+0000add0: 6d70 2e68 683a 3239 353c 2f64 6976 3e3c mp.hh:295
    <\n+0000ade0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n+0000ae40: 6120 6872 6566 3d22 6130 3137 3230 2e68 a href=\"a01720.h\n+0000ae50: 746d 6c23 6137 6134 3462 6331 6335 6635 tml#a7a44bc1c5f5\n+0000ae60: 6461 6236 6531 3830 6365 3231 3736 3963 dab6e180ce21769c\n+0000ae70: 3139 3333 3622 3e44 756e 653a 3a46 6c6f 19336\">Dune::Flo\n+0000ae80: 6174 436d 704f 7073 3a3a 6c74 3c2f 613e atCmpOps::lt\n+0000ae90: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    bool l\n+0000aeb0: 7428 636f 6e73 7420 5661 6c75 6554 7970 t(const ValueTyp\n+0000aec0: 6520 2661 6d70 3b66 6972 7374 2c20 636f e &first, co\n+0000aed0: 6e73 7420 5661 6c75 6554 7970 6520 2661 nst ValueType &a\n+0000aee0: 6d70 3b73 6563 6f6e 6429 2063 6f6e 7374 mp;second) const\n+0000aef0: 3c2f 6469 763e 3c64 6976 2063 6c61 7373
    test if\n+0000af10: 2066 6972 7374 206c 6573 7365 7220 7468 first lesser th\n+0000af20: 616e 2073 6563 6f6e 643c 2f64 6976 3e3c an second
    <\n+0000af30: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n+0000af40: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n+0000af50: 2f62 3e20 666c 6f61 745f 636d 702e 6363 /b> float_cmp.cc\n+0000af60: 3a34 3732 3c2f 6469 763e 3c2f 6469 763e :472
    \n+0000af70: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    Dune::FloatCmp\n+0000b010: 4f70 733a 3a67 653c 2f61 3e3c 2f64 6976 Ops::ge
    bool ge(con\n+0000b040: 7374 2056 616c 7565 5479 7065 2026 616d st ValueType &am\n+0000b050: 703b 6669 7273 742c 2063 6f6e 7374 2056 p;first, const V\n+0000b060: 616c 7565 5479 7065 2026 616d 703b 7365 alueType &se\n+0000b070: 636f 6e64 2920 636f 6e73 743c 2f64 6976 cond) const
    test if firs\n+0000b0a0: 7420 6772 6561 7465 7220 6f72 2065 7175 t greater or equ\n+0000b0b0: 616c 2073 6563 6f6e 643c 2f64 6976 3e3c al second
    <\n+0000b0c0: 6469 7620 636c 6173 733d 2274 7464 6566 div class=\"ttdef\n+0000b0d0: 223e 3c62 3e44 6566 696e 6974 696f 6e3c \">Definition<\n+0000b0e0: 2f62 3e20 666c 6f61 745f 636d 702e 6363 /b> float_cmp.cc\n+0000b0f0: 3a34 3739 3c2f 6469 763e 3c2f 6469 763e :479
    \n+0000b100: 0a3c 6469 7620 636c 6173 733d 2274 7463 .
    Dune::FloatCmp\n+0000b1a0: 4f70 733a 3a72 7374 796c 653c 2f61 3e3c Ops::rstyle<\n+0000b1b0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    static \n+0000b1d0: 636f 6e73 7420 526f 756e 6469 6e67 5374 const RoundingSt\n+0000b1e0: 796c 6520 7273 7479 6c65 3c2f 6469 763e yle rstyle
    \n+0000b1f0: 3c64 6976 2063 6c61 7373 3d22 7474 646f
    How rounding \n+0000b210: 6973 2064 6f6e 652e 3c2f 6469 763e 3c64 is done.
    Definition float_cmp.hh:\n+0000b250: 3239 373c 2f64 6976 3e3c 2f64 6976 3e0a 297
    .\n+0000b260: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    Flo\n+0000b330: 6174 436d 703a 3a45 7073 696c 6f6e 5479 atCmp::EpsilonTy\n+0000b340: 7065 266c 743b 2054 2026 6774 3b3a 3a54 pe< T >::T\n+0000b350: 7970 6520 4570 7369 6c6f 6e54 7970 653c ype EpsilonType<\n+0000b360: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Type of \n+0000b380: 7468 6520 6570 7369 6c6f 6e2e 3c2f 6469 the epsilon.
    Definiti\n+0000b3b0: 6f6e 3c2f 623e 2066 6c6f 6174 5f63 6d70 on float_cmp\n+0000b3c0: 2e68 683a 3330 343c 2f64 6976 3e3c 2f64 .hh:304
    .
    Dune::Float\n+0000b470: 436d 704f 7073 3a3a 6e65 3c2f 613e 3c2f CmpOps::ne
    bool ne(\n+0000b4a0: 636f 6e73 7420 5661 6c75 6554 7970 6520 const ValueType \n+0000b4b0: 2661 6d70 3b66 6972 7374 2c20 636f 6e73 &first, cons\n+0000b4c0: 7420 5661 6c75 6554 7970 6520 2661 6d70 t ValueType &\n+0000b4d0: 3b73 6563 6f6e 6429 2063 6f6e 7374 3c2f ;second) const
    test for \n+0000b500: 696e 6571 7561 6c69 7479 2075 7369 6e67 inequality using\n+0000b510: 2065 7073 696c 6f6e 3c2f 6469 763e 3c64 epsilon
    Definition float_cmp.cc:\n+0000b550: 3435 383c 2f64 6976 3e3c 2f64 6976 3e0a 458
    .\n+0000b560: 3c64 6976 2063 6c61 7373 3d22 7474 6322
    T\n+0000b650: 7970 6520 6f66 2074 6865 2076 616c 7565 ype of the value\n+0000b660: 7320 746f 2063 6f6d 7061 7265 2e3c 2f64 s to compare.
    Definit\n+0000b690: 696f 6e3c 2f62 3e20 666c 6f61 745f 636d ion float_cm\n+0000b6a0: 702e 6868 3a32 3939 3c2f 6469 763e 3c2f p.hh:299
    .
    Ep\n+0000b780: 7369 6c6f 6e54 7970 6520 6570 7369 6c6f silonType epsilo\n+0000b790: 6e28 2920 636f 6e73 743c 2f64 6976 3e3c n() const
    <\n+0000b7a0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class=\"ttdoc\n+0000b7b0: 223e 7265 7475 726e 2074 6865 2063 7572 \">return the cur\n+0000b7c0: 7265 6e74 2065 7073 696c 6f6e 3c2f 6469 rent epsilon
    Definiti\n+0000b7f0: 6f6e 3c2f 623e 2066 6c6f 6174 5f63 6d70 on float_cmp\n+0000b800: 2e63 633a 3433 363c 2f64 6976 3e3c 2f64 .cc:436
    .
    round\n+0000b920: 2075 7369 6e67 2065 7073 696c 6f6e 3c2f using epsilon
    Defini\n+0000b950: 7469 6f6e 3c2f 623e 2066 6c6f 6174 5f63 tion float_c\n+0000b960: 6d70 2e63 633a 3439 353c 2f64 6976 3e3c mp.cc:495
    <\n+0000b970: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
    <\n+0000b9d0: 6120 6872 6566 3d22 6130 3137 3230 2e68 a href=\"a01720.h\n+0000b9e0: 746d 6c23 6165 6561 6637 6138 3862 3365 tml#aeeaf7a88b3e\n+0000b9f0: 3738 3236 3535 6431 6231 3333 3661 3962 782655d1b1336a9b\n+0000ba00: 3732 6638 3322 3e44 756e 653a 3a46 6c6f 72f83\">Dune::Flo\n+0000ba10: 6174 436d 704f 7073 3a3a 7472 756e 633c atCmpOps::trunc<\n+0000ba20: 2f61 3e3c 2f64 6976 3e3c 6469 7620 636c /a>
    I t\n+0000ba40: 7275 6e63 2863 6f6e 7374 2056 616c 7565 runc(const Value\n+0000ba50: 5479 7065 2026 616d 703b 7661 6c29 2063 Type &val) c\n+0000ba60: 6f6e 7374 3c2f 6469 763e 3c64 6976 2063 onst
    tru\n+0000ba80: 6e63 6174 6520 7573 696e 6720 6570 7369 ncate using epsi\n+0000ba90: 6c6f 6e3c 2f64 6976 3e3c 6469 7620 636c lon
    D\n+0000bab0: 6566 696e 6974 696f 6e3c 2f62 3e20 666c efinition fl\n+0000bac0: 6f61 745f 636d 702e 6363 3a35 3033 3c2f oat_cmp.cc:503
    .
    \n+0000bb20: 3c64 6976 2063 6c61 7373 3d22 7474 6e61
    b\n+0000bba0: 6f6f 6c20 6774 2863 6f6e 7374 2056 616c ool gt(const Val\n+0000bbb0: 7565 5479 7065 2026 616d 703b 6669 7273 ueType &firs\n+0000bbc0: 742c 2063 6f6e 7374 2056 616c 7565 5479 t, const ValueTy\n+0000bbd0: 7065 2026 616d 703b 7365 636f 6e64 2920 pe &second) \n+0000bbe0: 636f 6e73 743c 2f64 6976 3e3c 6469 7620 const
    te\n+0000bc00: 7374 2069 6620 6669 7273 7420 6772 6561 st if first grea\n+0000bc10: 7465 7220 7468 616e 2073 6563 6f6e 643c ter than second<\n+0000bc20: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
    Defin\n+0000bc40: 6974 696f 6e3c 2f62 3e20 666c 6f61 745f ition float_\n+0000bc50: 636d 702e 6363 3a34 3635 3c2f 6469 763e cmp.cc:465
    \n+0000bc60: 3c2f 6469 763e 0a3c 2f64 6976 3e3c 212d
    .
    .\n+0000bcb0: 0a3c 6872 2063 6c61 7373 3d22 666f 6f74 .
    .Generated b\n+0000bcf0: 7926 2331 3630 3b3c 6120 6872 6566 3d22 y \"doxygen\"/\n+0000bd70: 1.9.8.
    .<\n+0000bd90: 2f62 6f64 793e 0a3c 2f68 746d 6c3e 0a /body>..\n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1059 +1,298 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-fmatrix.hh\n+float_cmp.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 (C) 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_FMATRIX_HH\n-6#define DUNE_FMATRIX_HH\n+5#ifndef DUNE_COMMON_FLOAT_CMP_HH\n+6#define DUNE_COMMON_FLOAT_CMP_HH\n 7\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/_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh>\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/_\bf_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-17#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-18#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-19#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-20#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-21#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b._\bh_\bh>\n-22\n-23namespace _\bD_\bu_\bn_\be\n-24{\n-25\n-26 namespace Impl\n-27 {\n-28\n-29 template\n-30 class ColumnVectorView\n-31 {\n-32 public:\n-33\n-34 using value_type = typename M::value_type;\n-35 using size_type = typename M::size_type;\n-36\n-37 constexpr ColumnVectorView(M& matrix, size_type col) :\n-38 matrix_(matrix),\n-39 col_(col)\n-40 {}\n-41\n-42 constexpr size_type N () const {\n-43 return matrix_.N();\n-44 }\n-45\n-46 template and not std::is_const_v, int> = 0>\n-48 constexpr value_type& operator[] (size_type row) {\n-49 return matrix_[row][col_];\n-50 }\n-51\n-52 constexpr const value_type& operator[] (size_type row) const {\n-53 return matrix_[row][col_];\n-54 }\n-55\n-56 protected:\n-57 M& matrix_;\n-58 const size_type col_;\n-59 };\n-60\n-61 }\n-62\n-63 template\n-64 struct FieldTraits< Impl::ColumnVectorView >\n-65 {\n-66 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-67 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-68 };\n-69\n-81 template< class K, int ROWS, int COLS = ROWS > class FieldMatrix;\n-82\n-83\n-84 template< class K, int ROWS, int COLS >\n-_\b8_\b5 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n-86 {\n-_\b8_\b7 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b> _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n-88\n-89 // each row is implemented by a field vector\n-_\b9_\b0 typedef _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bC_\bO_\bL_\bS_\b> _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-91\n-_\b9_\b2 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be &_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-_\b9_\b3 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-94\n-_\b9_\b5 typedef std::array _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be;\n-_\b9_\b6 typedef K _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b9_\b7 typedef typename container_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-98 };\n-99\n-100 template< class K, int ROWS, int COLS >\n-_\b1_\b0_\b1 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n-102 {\n-_\b1_\b0_\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-_\b1_\b0_\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-105 };\n-106\n-115 template\n-_\b1_\b1_\b6 class _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx : public _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx< FieldMatrix >\n-117 {\n-118 std::array< FieldVector, ROWS > _data;\n-119 typedef _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b> > _\bB_\ba_\bs_\be;\n-120 public:\n-121\n-_\b1_\b2_\b3 constexpr static int _\br_\bo_\bw_\bs = ROWS;\n-_\b1_\b2_\b5 constexpr static int _\bc_\bo_\bl_\bs = COLS;\n-126\n-_\b1_\b2_\b7 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-_\b1_\b2_\b8 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-129\n-_\b1_\b3_\b0 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-_\b1_\b3_\b1 typedef 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 _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\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-133 //===== constructors\n-_\b1_\b3_\b6 constexpr _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx() = default;\n-137\n-_\b1_\b4_\b0 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(std::initializer_list<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bc_\bo_\bl_\bs_\b> > const &l) {\n-141 assert(l.size() == _\br_\bo_\bw_\bs); // Actually, this is not needed any more!\n-142 std::copy_n(l.begin(), std::min(static_cast(ROWS),\n-143 l.size()),\n-144 _data.begin());\n-145 }\n-146\n-147 template ::value>>\n-_\b1_\b4_\b9 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(T const& rhs)\n-150 {\n-151 *this = rhs;\n-152 }\n-153\n-154 using Base::operator=;\n-155\n-_\b1_\b5_\b7 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx&) = default;\n-158\n-160 template\n-_\b1_\b6_\b1 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b>& x)\n-162 {\n-163 _data = x._data;\n-164 return *this;\n-165 }\n-166\n-168 template \n-_\b1_\b6_\b9 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b> const&) = delete;\n-170\n-_\b1_\b7_\b2 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bC_\bO_\bL_\bS_\b,_\b _\bR_\bO_\bW_\bS_\b> _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n-173 {\n-174 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bC_\bO_\bL_\bS_\b,_\b _\bR_\bO_\bW_\bS_\b> AT;\n-175 for( int i = 0; i < ROWS; ++i )\n-176 for( int j = 0; j < COLS; ++j )\n-177 AT[j][i] = (*this)[i][j];\n-178 return AT;\n-179 }\n-180\n-182 template \n-_\b1_\b8_\b3 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-184 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b>& matrixB)\n-185 {\n-186 _\bF_\bi_\be_\bl_\bd_\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,ROWS,COLS> result;\n-187\n-188 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n-189 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n-190 result[i][j] = matrixA[i][j] + matrixB[i][j];\n-191\n-192 return result;\n-193 }\n-194\n-196 template \n-_\b1_\b9_\b7 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-198 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b,_\bR_\bO_\bW_\bS_\b,_\bC_\bO_\bL_\bS_\b>& matrixB)\n-199 {\n-200 _\bF_\bi_\be_\bl_\bd_\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,ROWS,COLS> result;\n-201\n-202 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n-203 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n-204 result[i][j] = matrixA[i][j] - matrixB[i][j];\n-205\n-206 return result;\n-207 }\n-208\n-210 template ::value, int> = 0>\n-_\b2_\b1_\b2 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n-213 {\n-214 _\bF_\bi_\be_\bl_\bd_\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,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,ROWS,COLS>\n-result;\n-215\n-216 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n-217 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n-218 result[i][j] = matrix[i][j] * scalar;\n-219\n-220 return result;\n-221 }\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-224 template ::value, int> = 0>\n-_\b2_\b2_\b6 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( Scalar scalar, const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-227 {\n-228 _\bF_\bi_\be_\bl_\bd_\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,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,ROWS,COLS>\n-result;\n-229\n-230 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n-231 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n-232 result[i][j] = scalar * matrix[i][j];\n-233\n-234 return result;\n-235 }\n-236\n-238 template ::value, int> = 0>\n-_\b2_\b4_\b0 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n-241 {\n-242 _\bF_\bi_\be_\bl_\bd_\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,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,ROWS,COLS>\n-result;\n-243\n-244 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < ROWS; ++i)\n-245 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < COLS; ++j)\n-246 result[i][j] = matrix[i][j] / scalar;\n-247\n-248 return result;\n-249 }\n-250\n-253 template \n-_\b2_\b5_\b4 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-255 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bO_\bt_\bh_\be_\br_\bS_\bc_\ba_\bl_\ba_\br_\b,_\b _\bC_\bO_\bL_\bS_\b,_\b _\bo_\bt_\bh_\be_\br_\bC_\bo_\bl_\bs_\b>& matrixB)\n-256 {\n-257 _\bF_\bi_\be_\bl_\bd_\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,ROWS,otherCols> result;\n-258\n-259 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < matrixA._\bm_\ba_\bt_\b__\br_\bo_\bw_\bs(); ++i)\n-260 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < matrixB._\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs(); ++j)\n-261 {\n-262 result[i][j] = 0;\n-263 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k = 0; k < matrixA._\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs(); ++k)\n-264 result[i][j] += matrixA[i][k] * matrixB[k][j];\n-265 }\n-266\n-267 return result;\n-268 }\n-269\n-276 template \n-278 and not Impl::IsFieldMatrix_v\n-279 , int> = 0>\n-_\b2_\b8_\b0 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-281 const OtherMatrix& matrixB)\n-282 {\n-283 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n-284 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\br_\bo_\bw_\bs_\b _\b,_\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs_\b> result;\n-285 for (std::size_t j=0; j<_\br_\bo_\bw_\bs; ++j)\n-286 matrixB._\bm_\bt_\bv(matrixA[j], result[j]);\n-287 return result;\n-288 }\n-289\n-296 template \n-298 and not Impl::IsFieldMatrix_v\n-299 , int> = 0>\n-_\b3_\b0_\b0 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const OtherMatrix& matrixA,\n-301 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixB)\n-302 {\n-303 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n-304 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs_\b,_\b _\bc_\bo_\bl_\bs_\b> result;\n-305 for (std::size_t j=0; j<_\bc_\bo_\bl_\bs; ++j)\n-306 {\n-307 auto B_j = Impl::ColumnVectorView(matrixB, j);\n-308 auto result_j = Impl::ColumnVectorView(result, j);\n-309 matrixA.mv(B_j, result_j);\n-310 }\n-311 return result;\n-312 }\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-315 template\n-_\b3_\b1_\b6 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> _\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (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-317 {\n-318 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bl_\b,_\bc_\bo_\bl_\bs_\b> C;\n-319\n-320 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b3_\b3_\b4 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\b,_\bc_\b>& _\bM)\n-335 {\n-336 static_assert(r == c, \"Cannot rightmultiply with non-square matrix\");\n-337 static_assert(r == _\bc_\bo_\bl_\bs, \"Size mismatch\");\n-338 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b> C(*this);\n-339\n-340 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs; i++)\n-341 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs; j++) {\n-342 (*this)[i][j] = 0;\n-343 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k<_\bc_\bo_\bl_\bs; k++)\n-344 (*this)[i][j] += C[i][k]*_\bM[k][j];\n-345 }\n-346 return *this;\n-347 }\n-348\n-350 template\n-_\b3_\b5_\b1 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bl_\b> _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b,_\bl_\b>& _\bM)\n-const\n-352 {\n-353 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bl_\b> C;\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-355 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\br_\bo_\bw_\bs; i++) {\n-356 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n-386 class FieldMatrix : public DenseMatrix< FieldMatrix >\n-387 {\n-388 FieldVector _data;\n-389 typedef DenseMatrix< FieldMatrix > Base;\n-390 public:\n-391 // standard constructor and everything is sufficient ...\n-392\n-393 //===== type definitions and constants\n-394\n-396 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-397\n-400 constexpr static int _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl = 1;\n-401\n-402 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-403\n-404 typedef typename _\bB_\ba_\bs_\be_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-405 typedef 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 _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-406\n-409 constexpr static int _\br_\bo_\bw_\bs = 1;\n-412 constexpr static int _\bc_\bo_\bl_\bs = 1;\n-413\n-414 //===== constructors\n-417 constexpr _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx() = default;\n-418\n-421 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(std::initializer_list<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\b1_\b>> const &l)\n-422 {\n-423 std::copy_n(l.begin(), std::min(static_cast< std::size_t >( 1 ), l.size()),\n-&_data);\n-424 }\n-425\n-426 template ::value>>\n-428 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx(T const& rhs)\n-429 {\n-430 *this = rhs;\n-431 }\n-432\n-433 using Base::operator=;\n-434\n-436 FieldMatrix _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd() const\n-437 {\n-438 return *this;\n-439 }\n-440\n-442 template \n-443 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-444 const FieldMatrix& matrixB)\n-445 {\n-446 return FieldMatrix::\n-PromotedType,1,1>{matrixA[0][0] + matrixB[0][0]};\n-447 }\n-448\n-450 template ::value, int> = 0>\n-452 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix,\n-453 const Scalar& scalar)\n-454 {\n-455 return FieldMatrix::PromotedType,1,1>\n-{matrix[0][0] + scalar};\n-456 }\n-457\n-459 template ::value, int> = 0>\n-461 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b ( const Scalar& scalar,\n-462 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-463 {\n-464 return FieldMatrix::PromotedType,1,1>\n-{scalar + matrix[0][0]};\n-465 }\n-466\n-468 template \n-469 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-470 const FieldMatrix& matrixB)\n-471 {\n-472 return FieldMatrix::\n-PromotedType,1,1>{matrixA[0][0] - matrixB[0][0]};\n-473 }\n-474\n-476 template ::value, int> = 0>\n-478 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix,\n-479 const Scalar& scalar)\n-480 {\n-481 return FieldMatrix::PromotedType,1,1>\n-{matrix[0][0] - scalar};\n-482 }\n-483\n-485 template ::value, int> = 0>\n-487 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b ( const Scalar& scalar,\n-488 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-489 {\n-490 return FieldMatrix::PromotedType,1,1>\n-{scalar - matrix[0][0]};\n-491 }\n-492\n-494 template ::value, int> = 0>\n-496 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n-497 {\n-498 return FieldMatrix::PromotedType,1,1>\n-{matrix[0][0] * scalar};\n-499 }\n-500\n-502 template ::value, int> = 0>\n-504 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( Scalar scalar, const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-505 {\n-506 return FieldMatrix::PromotedType,1,1>\n-{scalar * matrix[0][0]};\n-507 }\n-508\n-510 template ::value, int> = 0>\n-512 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar scalar)\n-513 {\n-514 return FieldMatrix::PromotedType,1,1>\n-{matrix[0][0] / scalar};\n-515 }\n-516\n-517 //===== solve\n-518\n-521 template \n-522 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-523 const FieldMatrix& matrixB)\n-524 {\n-525 FieldMatrix::\n-PromotedType,1,otherCols> result;\n-526\n-527 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j = 0; j < matrixB.mat_cols(); ++j)\n-528 result[0][j] = matrixA[0][0] * matrixB[0][j];\n-529\n-530 return result;\n-531 }\n-532\n-539 template \n-541 and not Impl::IsFieldMatrix_v\n-542 and (OtherMatrix::rows==1)\n-543 , int> = 0>\n-544 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixA,\n-545 const OtherMatrix& matrixB)\n-546 {\n-547 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n-548 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\br_\bo_\bw_\bs_\b _\b,_\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs_\b> result;\n-549 for (std::size_t j=0; j<_\br_\bo_\bw_\bs; ++j)\n-550 matrixB.mtv(matrixA[j], result[j]);\n-551 return result;\n-552 }\n-553\n-560 template \n-562 and not Impl::IsFieldMatrix_v\n-563 and (OtherMatrix::cols==1)\n-564 , int> = 0>\n-565 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const OtherMatrix& matrixA,\n-566 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx& matrixB)\n-567 {\n-568 using Field = typename _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:\n-_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be;\n-569 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\b,_\b _\bO_\bt_\bh_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs_\b,_\b _\bc_\bo_\bl_\bs_\b> result;\n-570 for (std::size_t j=0; j<_\bc_\bo_\bl_\bs; ++j)\n-571 {\n-572 auto B_j = Impl::ColumnVectorView(matrixB, j);\n-573 auto result_j = Impl::ColumnVectorView(result, j);\n-574 matrixA.mv(B_j, result_j);\n-575 }\n-576 return result;\n-577 }\n-578\n-580 template\n-581 FieldMatrix _\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (const FieldMatrix& _\bM) const\n-582 {\n-583 FieldMatrix C;\n-584 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n-598 FieldMatrix _\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by (const FieldMatrix& _\bM) const\n-599 {\n-600 FieldMatrix C;\n-601\n-602 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n-659 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const FieldMatrix& a)\n-660 {\n-661 s << a[0][0];\n-662 return s;\n-663 }\n-664\n-665#endif // DOXYGEN\n-666\n-_\b6_\b6_\b7 namespace FMatrixHelp {\n-668\n-670 template \n-_\b6_\b7_\b1 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b> &matrix,\n-_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b> &inverse)\n-672 {\n-673 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-674 inverse[0][0] = real_type(1.0)/matrix[0][0];\n-675 return matrix[0][0];\n-676 }\n-677\n-679 template \n-_\b6_\b8_\b0 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>\n-&matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b> &inverse)\n-681 {\n-682 return _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix,inverse);\n-683 }\n-684\n-685\n-687 template \n-_\b6_\b8_\b8 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b> &matrix,\n-_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b> &inverse)\n-689 {\n-690 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-691 // code generated by maple\n-692 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);\n-693 K det_1 = real_type(1.0)/det;\n-694 inverse[0][0] = matrix[1][1] * det_1;\n-695 inverse[0][1] = - matrix[0][1] * det_1;\n-696 inverse[1][0] = - matrix[1][0] * det_1;\n-697 inverse[1][1] = matrix[0][0] * det_1;\n-698 return det;\n-699 }\n-700\n-703 template \n-_\b7_\b0_\b4 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b>\n-&matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b2_\b,_\b2_\b> &inverse)\n-705 {\n-706 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-707 // code generated by maple\n-708 K det = (matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0]);\n-709 K det_1 = real_type(1.0)/det;\n-710 inverse[0][0] = matrix[1][1] * det_1;\n-711 inverse[1][0] = - matrix[0][1] * det_1;\n-712 inverse[0][1] = - matrix[1][0] * det_1;\n-713 inverse[1][1] = matrix[0][0] * det_1;\n-714 return det;\n-715 }\n-716\n-718 template \n-_\b7_\b1_\b9 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b> &matrix,\n-_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b> &inverse)\n-720 {\n-721 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-722 // code generated by maple\n-723 K t4 = matrix[0][0] * matrix[1][1];\n-724 K t6 = matrix[0][0] * matrix[1][2];\n-725 K t8 = matrix[0][1] * matrix[1][0];\n-726 K t10 = matrix[0][2] * matrix[1][0];\n-727 K t12 = matrix[0][1] * matrix[2][0];\n-728 K t14 = matrix[0][2] * matrix[2][0];\n-729\n-730 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+\n-731 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);\n-732 K t17 = real_type(1.0)/det;\n-733\n-734 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2]\n-[1])*t17;\n-735 inverse[0][1] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2]\n-[1])*t17;\n-736 inverse[0][2] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1]\n-[1])*t17;\n-737 inverse[1][0] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2]\n-[0])*t17;\n-738 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;\n-739 inverse[1][2] = -(t6-t10) * t17;\n-740 inverse[2][0] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0])\n-* t17;\n-741 inverse[2][1] = -(matrix[0][0] * matrix[2][1] - t12) * t17;\n-742 inverse[2][2] = (t4-t8) * t17;\n-743\n-744 return det;\n-745 }\n-746\n-748 template \n-_\b7_\b4_\b9 static inline K _\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b>\n-&matrix, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b3_\b,_\b3_\b> &inverse)\n-750 {\n-751 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-752 // code generated by maple\n-753 K t4 = matrix[0][0] * matrix[1][1];\n-754 K t6 = matrix[0][0] * matrix[1][2];\n-755 K t8 = matrix[0][1] * matrix[1][0];\n-756 K t10 = matrix[0][2] * matrix[1][0];\n-757 K t12 = matrix[0][1] * matrix[2][0];\n-758 K t14 = matrix[0][2] * matrix[2][0];\n-759\n-760 K det = (t4*matrix[2][2]-t6*matrix[2][1]-t8*matrix[2][2]+\n-761 t10*matrix[2][1]+t12*matrix[1][2]-t14*matrix[1][1]);\n-762 K t17 = real_type(1.0)/det;\n-763\n-764 inverse[0][0] = (matrix[1][1] * matrix[2][2] - matrix[1][2] * matrix[2]\n-[1])*t17;\n-765 inverse[1][0] = -(matrix[0][1] * matrix[2][2] - matrix[0][2] * matrix[2]\n-[1])*t17;\n-766 inverse[2][0] = (matrix[0][1] * matrix[1][2] - matrix[0][2] * matrix[1]\n-[1])*t17;\n-767 inverse[0][1] = -(matrix[1][0] * matrix[2][2] - matrix[1][2] * matrix[2]\n-[0])*t17;\n-768 inverse[1][1] = (matrix[0][0] * matrix[2][2] - t14) * t17;\n-769 inverse[2][1] = -(t6-t10) * t17;\n-770 inverse[0][2] = (matrix[1][0] * matrix[2][1] - matrix[1][1] * matrix[2][0])\n-* t17;\n-771 inverse[1][2] = -(matrix[0][0] * matrix[2][1] - t12) * t17;\n-772 inverse[2][2] = (t4-t8) * t17;\n-773\n-774 return det;\n-775 }\n-776\n-778 template< class K, int m, int n, int p >\n-_\b7_\b7_\b9 static inline void _\bm_\bu_\bl_\bt_\bM_\ba_\bt_\br_\bi_\bx ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &A,\n-780 const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bp_\b _\b> &B,\n-781 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bp_\b _\b> &ret )\n-782 {\n-783 typedef typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bp_\b _\b> :: size_type size_type;\n-784\n-785 for( size_type i = 0; i < m; ++i )\n-786 {\n-787 for( size_type j = 0; j < p; ++j )\n-788 {\n-789 ret[ i ][ j ] = K( 0 );\n-790 for( size_type k = 0; k < n; ++k )\n-791 ret[ i ][ j ] += A[ i ][ k ] * B[ k ][ j ];\n-792 }\n-793 }\n-794 }\n-795\n-797 template \n-_\b7_\b9_\b8 static inline void _\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\br_\bi_\bx(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, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b,_\bc_\bo_\bl_\bs_\b>& ret)\n-799 {\n-800 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-801\n-802 for(size_type i=0; i\n-_\b8_\b1_\b5 static inline void _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd( 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-816 {\n-817 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-818\n-819 for(size_type i=0; i\n-_\b8_\b2_\b9 static inline _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> _\bm_\bu_\bl_\bt(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,_\bc_\bo_\bl_\bs_\b> & x)\n-830 {\n-831 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> ret;\n-832 multAssign(matrix,x,ret);\n-833 return ret;\n-834 }\n-835\n-837 template \n-_\b8_\b3_\b8 static inline _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b> _\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd(const\n-_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b,_\bc_\bo_\bl_\bs_\b> &matrix, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\br_\bo_\bw_\bs_\b> & x)\n-839 {\n-840 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bc_\bo_\bl_\bs_\b> ret;\n-841 _\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd( matrix, x, ret );\n-842 return ret;\n-843 }\n-844\n-845 } // end namespace FMatrixHelp\n-846\n-849} // end namespace\n-850\n-851#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\"\n-852#endif\n-_\bm_\ba_\bt_\br_\bi_\bx_\bc_\bo_\bn_\bc_\be_\bp_\bt_\bs_\b._\bh_\bh\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-_\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-_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\n-Eigenvalue computations for the FieldMatrix class.\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-_\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn_\b._\bh_\bh\n-Various precision settings for calculations with FieldMatrix and FieldVector.\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:_\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br\n-typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n-Element type of some SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\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 _\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_\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:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n-static FieldVector< K, cols > multTransposed(const FieldMatrix< K, rows, cols >\n-&matrix, const FieldVector< K, rows > &x)\n-calculates ret = matrix^T * x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:838\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b__\br_\be_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n-static K invertMatrix_retTransposed(const FieldMatrix< K, 1, 1 > &matrix,\n-FieldMatrix< K, 1, 1 > &inverse)\n-invert scalar without changing the original matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:680\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-static void multMatrix(const FieldMatrix< K, m, n > &A, const FieldMatrix< K,\n-n, p > &B, FieldMatrix< K, m, p > &ret)\n-calculates ret = A * B\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:779\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-static K invertMatrix(const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1,\n-1 > &inverse)\n-invert scalar without changing the original matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:671\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt\n-static FieldVector< K, rows > mult(const FieldMatrix< K, rows, cols > &matrix,\n-const FieldVector< K, cols > &x)\n-calculates ret = matrix * x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:829\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-static void multTransposedMatrix(const FieldMatrix< K, rows, cols > &matrix,\n-FieldMatrix< K, cols, cols > &ret)\n-calculates ret= A_t*A\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:798\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp_\b:_\b:_\bm_\bu_\bl_\bt_\bA_\bs_\bs_\bi_\bg_\bn_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n-static void multAssignTransposed(const FieldMatrix< K, rows, cols > &matrix,\n-const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)\n-calculates ret = matrix^T * x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:815\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_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n-FieldMatrix< K, ROWS, COLS > & 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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\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:_\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:_\bm_\ba_\bt_\b__\bc_\bo_\bl_\bs\n-static constexpr size_type mat_cols()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:367\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-constexpr FieldMatrix()=default\n-Default constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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-Base::const_row_reference const_row_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-FieldMatrix & operator=(const FieldMatrix< T, ROWS, COLS > &x)\n-copy assignment from FieldMatrix over a different field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by\n-FieldMatrix< K, rows, l > rightmultiplyany(const FieldMatrix< K, cols, l > &M)\n-const\n-Multiplies M from the right to this matrix, this matrix is not modified.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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 fmatrix.hh:128\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_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bl_\be_\bf_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by_\ba_\bn_\by\n-FieldMatrix< K, l, cols > leftmultiplyany(const FieldMatrix< K, l, rows > &M)\n-const\n-Multiplies M from the left to this matrix, this matrix is not modified.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bi_\bg_\bh_\bt_\bm_\bu_\bl_\bt_\bi_\bp_\bl_\by\n-FieldMatrix & rightmultiply(const FieldMatrix< K, r, c > &M)\n-Multiplies M from the right to this matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:334\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-FieldMatrix(T const &rhs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-friend auto operator*(const FieldMatrix &matrix, Scalar scalar)\n-vector space multiplication with scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:212\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-FieldMatrix & operator=(FieldMatrix< T, rows, cols > const &)=delete\n-no copy assignment from FieldMatrix of different size\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-Base::row_reference row_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n-row_reference mat_access(size_type i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:369\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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 fmatrix.hh:123\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd\n-FieldMatrix< K, COLS, ROWS > transposed() const\n-Return transposed of the matrix as FieldMatrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:172\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\br_\bo_\bw_\bs\n-static constexpr size_type mat_rows()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:366\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-FieldMatrix(std::initializer_list< Dune::FieldVector< K, cols > > const &l)\n-Constructor initializing the matrix from a list of vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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 fmatrix.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/\n-friend auto operator/(const FieldMatrix &matrix, Scalar scalar)\n-vector space division by scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:240\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n-friend auto operator+(const FieldMatrix &matrixA, const FieldMatrix<\n-OtherScalar, ROWS, COLS > &matrixB)\n-vector space addition \u00e2\u0080\u0093 two-argument version\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:183\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-FieldMatrix & operator=(const FieldMatrix &)=default\n-copy assignment operator\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n-friend auto operator-(const FieldMatrix &matrixA, const FieldMatrix<\n-OtherScalar, ROWS, COLS > &matrixB)\n-vector space subtraction \u00e2\u0080\u0093 two-argument version\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:197\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\ba_\bt_\b__\ba_\bc_\bc_\be_\bs_\bs\n-const_row_reference mat_access(size_type i) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:375\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:95\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be\n-std::array< row_type, ROWS > container_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:95\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n-FieldMatrix< K, ROWS, COLS > derived_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:87\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:96\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:93\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-FieldVector< K, COLS > row_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fmatrix.hh:90\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:97\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 _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:92\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_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:103\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_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bR_\bO_\bW_\bS_\b,_\b _\bC_\bO_\bL_\bS_\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 fmatrix.hh:104\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:_\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be\n-decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn promotiontraits.hh:28\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/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: classname.hh File Reference\n+dune-common: dynmatrixev.hh File Reference\n \n \n \n \n \n \n \n@@ -72,47 +72,44 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    classname.hh File Reference
    \n+
    dynmatrixev.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+

    utility functions to compute eigenvalues for dense matrices. \n More...

    \n-
    #include <cstdlib>
    \n+
    #include <algorithm>
    \n #include <memory>
    \n-#include <string>
    \n-#include <typeinfo>
    \n-#include <type_traits>
    \n+#include "dynmatrix.hh"
    \n+#include "fmatrixev.hh"
    \n
    \n

    Go to the source code of this file.

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

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::DynamicMatrixHelp
     
    \n \n-\n-\n-\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.
     
    template<typename K , class C >
    static void Dune::DynamicMatrixHelp::eigenValuesNonSym (const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)
     calculates the eigenvalues of a symmetric field matrix
     
    \n

    Detailed Description

    \n-

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

    \n+

    utility functions to compute eigenvalues for dense matrices.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,34 +1,31 @@\n dune-common\u00a02.9.0\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+dynmatrixev.hh File Reference\n+utility functions to compute eigenvalues for dense matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n-#include \n-#include \n-#include \n+#include \"_\bd_\by_\bn_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\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+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bH_\be_\bl_\bp\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+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\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 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx< K\n+ > &matrix, _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br< C > &eigenValues, std::vector<\n+ _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br< K > > *eigenVectors=nullptr)\n+\u00a0 calculates the eigenvalues of a 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-A free function to provide the demangled class name of a given object or type\n-as a string.\n+utility functions to compute eigenvalues for dense matrices.\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: classname.hh Source File\n+dune-common: dynmatrixev.hh Source File\n \n \n \n \n \n \n \n@@ -74,95 +74,123 @@\n \n
    \n \n
    \n
    \n
    \n-
    classname.hh
    \n+
    dynmatrixev.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 (C) 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+
    5#ifndef DUNE_DYNMATRIXEIGENVALUES_HH
    \n+
    6#define DUNE_DYNMATRIXEIGENVALUES_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+
    8#include <algorithm>
    \n+
    9#include <memory>
    \n+
    10
    \n+
    11#include "dynmatrix.hh"
    \n+
    12#include "fmatrixev.hh"
    \n+
    13
    \n+
    22namespace Dune {
    \n
    23
    \n-
    24namespace Dune {
    \n+
    \n+
    24 namespace DynamicMatrixHelp {
    \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+
    26#if HAVE_LAPACK
    \n+
    27 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall;
    \n+
    28#endif
    \n+
    29
    \n+
    38 template <typename K, class C>
    \n+
    \n+
    39 static void eigenValuesNonSym(const DynamicMatrix<K>& matrix,
    \n+
    40 DynamicVector<C>& eigenValues,
    \n+
    41 std::vector<DynamicVector<K>>* eigenVectors = nullptr
    \n+
    42 )
    \n+
    43 {
    \n+
    44
    \n+
    45#if HAVE_LAPACK
    \n+
    46 {
    \n+
    47 const long int N = matrix.rows();
    \n+
    48 const char jobvl = 'n';
    \n+
    49 const char jobvr = eigenVectors ? 'v' : 'n';
    \n+
    50
    \n+
    51
    \n+
    52 // matrix to put into dgeev
    \n+
    53 auto matrixVector = std::make_unique<double[]>(N*N);
    \n+
    54
    \n+
    55 // copy matrix
    \n+
    56 int row = 0;
    \n+
    57 for(int i=0; i<N; ++i)
    \n+
    58 {
    \n+
    59 for(int j=0; j<N; ++j, ++row)
    \n+
    60 {
    \n+
    61 matrixVector[ row ] = matrix[ i ][ j ];
    \n+
    62 }
    \n+
    63 }
    \n+
    64
    \n+
    65 // working memory
    \n+
    66 auto eigenR = std::make_unique<double[]>(N);
    \n+
    67 auto eigenI = std::make_unique<double[]>(N);
    \n+
    68
    \n+
    69 const long int lwork = eigenVectors ? 4*N : 3*N;
    \n+
    70 auto work = std::make_unique<double[]>(lwork);
    \n+
    71 auto vr = eigenVectors ? std::make_unique<double[]>(N*N) : std::unique_ptr<double[]>{};
    \n+
    72
    \n+
    73 // return value information
    \n+
    74 long int info = 0;
    \n+
    75
    \n+
    76 // call LAPACK routine (see fmatrixev_ext.cc)
    \n+
    77 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N,
    \n+
    78 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(),
    \n+
    79 &lwork, &info);
    \n+
    80
    \n+
    81 if( info != 0 )
    \n+
    82 {
    \n+
    83 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
    \n+
    84 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
    \n+
    85 }
    \n+
    86
    \n+
    87 eigenValues.resize(N);
    \n+
    88 for (int i=0; i<N; ++i)
    \n+
    89 eigenValues[i] = std::complex<double>(eigenR[i], eigenI[i]);
    \n+
    90
    \n+
    91 if (eigenVectors) {
    \n+
    92 eigenVectors->resize(N);
    \n+
    93 for (int i = 0; i < N; ++i) {
    \n+
    94 auto& v = (*eigenVectors)[i];
    \n+
    95 v.resize(N);
    \n+
    96 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]);
    \n+
    97 }
    \n+
    98 }
    \n+
    99 }
    \n+
    100#else // #if HAVE_LAPACK
    \n+
    101 DUNE_THROW(NotImplemented,"LAPACK not found!");
    \n+
    102#endif
    \n+
    103 }
    \n+
    \n+
    104 }
    \n+
    \n+
    105
    \n+
    106}
    \n+
    108#endif
    \n+
    This file implements a dense matrix with dynamic numbers of rows and columns.
    \n+
    Eigenvalue computations for the FieldMatrix class.
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \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+
    static void eigenValuesNonSym(const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)
    calculates the eigenvalues of a symmetric field matrix
    Definition dynmatrixev.hh:39
    \n+
    constexpr size_type rows() const
    number of rows
    Definition densematrix.hh:709
    \n+
    Construct a matrix with a dynamic size.
    Definition dynmatrix.hh:61
    \n+
    Construct a vector with a dynamic size.
    Definition dynvector.hh:59
    \n+
    void resize(size_type n, value_type c=value_type())
    Definition dynvector.hh:141
    \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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,90 +1,140 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-classname.hh\n+dynmatrixev.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 (C) 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+5#ifndef DUNE_DYNMATRIXEIGENVALUES_HH\n+6#define DUNE_DYNMATRIXEIGENVALUES_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+8#include \n+9#include \n+10\n+11#include \"_\bd_\by_\bn_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+12#include \"_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\"\n+13\n+22namespace _\bD_\bu_\bn_\be {\n 23\n-24namespace _\bD_\bu_\bn_\be {\n+_\b2_\b4 namespace DynamicMatrixHelp {\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+26#if HAVE_LAPACK\n+27 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall;\n+28#endif\n+29\n+38 template \n+_\b3_\b9 static void _\be_\bi_\bg_\be_\bn_\bV_\ba_\bl_\bu_\be_\bs_\bN_\bo_\bn_\bS_\by_\bm(const _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b>& matrix,\n+40 _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bC_\b>& eigenValues,\n+41 std::vector<_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b>>* eigenVectors = nullptr\n+42 )\n+43 {\n+44\n+45#if HAVE_LAPACK\n+46 {\n+47 const long int N = matrix._\br_\bo_\bw_\bs();\n+48 const char jobvl = 'n';\n+49 const char jobvr = eigenVectors ? 'v' : 'n';\n+50\n+51\n+52 // matrix to put into dgeev\n+53 auto matrixVector = std::make_unique(N*N);\n+54\n+55 // copy matrix\n+56 int row = 0;\n+57 for(int i=0; i(N);\n+67 auto eigenI = std::make_unique(N);\n+68\n+69 const long int lwork = eigenVectors ? 4*N : 3*N;\n+70 auto work = std::make_unique(lwork);\n+71 auto vr = eigenVectors ? std::make_unique(N*N) : std::\n+unique_ptr{};\n+72\n+73 // return value information\n+74 long int info = 0;\n+75\n+76 // call LAPACK routine (see fmatrixev_ext.cc)\n+77 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N,\n+78 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(),\n+79 &lwork, &info);\n+80\n+81 if( info != 0 )\n+82 {\n+83 std::cerr << \"For matrix \" << matrix << \" eigenvalue calculation failed! \"\n+<< std::endl;\n+84 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bt_\ba_\bt_\be_\bE_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn,\"eigenValues: Eigenvalue calculation\n+failed!\");\n+85 }\n+86\n+87 eigenValues._\br_\be_\bs_\bi_\bz_\be(N);\n+88 for (int i=0; i(eigenR[i], eigenI[i]);\n+90\n+91 if (eigenVectors) {\n+92 eigenVectors->_\br_\be_\bs_\bi_\bz_\be(N);\n+93 for (int i = 0; i < N; ++i) {\n+94 auto& v = (*eigenVectors)[i];\n+95 v.resize(N);\n+96 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]);\n+97 }\n+98 }\n+99 }\n+100#else // #if HAVE_LAPACK\n+101 _\bD_\bU_\bN_\bE_\b__\bT_\bH_\bR_\bO_\bW(_\bN_\bo_\bt_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\be_\bd,\"LAPACK not found!\");\n+102#endif\n+103 }\n+104 }\n+105\n+106}\n+108#endif\n+_\bd_\by_\bn_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+This file implements a dense matrix with dynamic numbers of rows and columns.\n+_\bf_\bm_\ba_\bt_\br_\bi_\bx_\be_\bv_\b._\bh_\bh\n+Eigenvalue computations for the FieldMatrix class.\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_\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+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\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\n+static void eigenValuesNonSym(const DynamicMatrix< K > &matrix, DynamicVector<\n+C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)\n+calculates the eigenvalues of a symmetric field matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynmatrixev.hh:39\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_\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_\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:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type n, value_type c=value_type())\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dynvector.hh:141\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 ===============================================================================\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: math.hh File Reference\n+dune-common: hash.hh File Reference\n \n \n \n \n \n \n \n@@ -74,191 +74,174 @@\n
    \n
    \n \n-
    math.hh File Reference
    \n+
    hash.hh File Reference
    \n
    \n
    \n \n-

    Some useful basic math stuff. \n+

    Support for calculating hash values of objects. \n More...

    \n-
    #include <cmath>
    \n-#include <complex>
    \n-#include <limits>
    \n-#include <type_traits>
    \n-#include <dune/common/typeutilities.hh>
    \n+
    #include <functional>
    \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 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
    struct  Dune::hash< T >
     Functor for hashing objects of type T. 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+\n+\n+\n+\n+\n+\n+\n+\n

    \n Macros

    #define DUNE_COMMON_MATH_ISFUNCTION(function, stdfunction)
     
    #define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR(function)
     
    #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-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\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)
     
    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-

    Some useful basic math stuff.

    \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_COMMON_MATH_ISFUNCTION

    \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 \n \n \n
    #define DUNE_COMMON_MATH_ISFUNCTION#define DUNE_DEFINE_HASH( function, template_args,
     stdfunction type 
    )
    \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+

    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_COMMON_MATH_ISFUNCTION_FUNCTOR

    \n+\n+

    ◆ DUNE_HASH_TYPE

    \n \n
    \n
    \n \n \n- \n+ \n \n \n- \n+ \n \n \n
    #define DUNE_COMMON_MATH_ISFUNCTION_FUNCTOR#define DUNE_HASH_TYPE( 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+

    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 \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,154 +1,129 @@\n dune-common\u00a02.9.0\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+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 _\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+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-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+#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__\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+#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- constexpr Base\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\bo_\bw_\be_\br (Base m, Exponent p)\n-\u00a0 _\bP_\bo_\bw_\be_\br 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+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-Some useful basic math stuff.\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_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+*\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 ===============================================================================\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: math.hh Source File\n+dune-common: hash.hh Source File\n \n \n \n \n \n \n \n@@ -74,373 +74,289 @@\n \n
    \n \n
    \n
    \n
    \n-
    math.hh
    \n+
    hash.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 (C) 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+
    5#ifndef DUNE_COMMON_HASH_HH
    \n+
    6#define DUNE_COMMON_HASH_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-
    \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-
    54 };
    \n-
    \n-
    55
    \n-
    56
    \n-
    64 template< class Field >
    \n-
    \n-\n-
    66 : public StandardMathematicalConstants<Field>
    \n-
    67 {};
    \n-
    \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+
    8#include <functional>
    \n+
    9
    \n+\n+
    11
    \n+
    24// ********************************************************************************
    \n+
    25// Doxygen documentation
    \n+
    26// ********************************************************************************
    \n+
    27
    \n+
    28#ifdef DOXYGEN
    \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
    \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+
    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 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+
    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-
    204
    \n-
    227 namespace MathOverloads {
    \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-
    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+
    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-
    \n-
    263 namespace MathImpl {
    \n+
    263 };
    \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+
    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-
    \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+
    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-
    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+
    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-
    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)
    Definition fvector.hh:604
    \n-
    bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:594
    \n-
    auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:584
    \n-
    bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:614
    \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+
    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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,381 +1,329 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-math.hh\n+hash.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 (C) 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+5#ifndef DUNE_COMMON_HASH_HH\n+6#define DUNE_COMMON_HASH_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-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-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-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+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+27\n+28#ifdef DOXYGEN\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\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+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 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+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-204\n-227 namespace MathOverloads {\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-_\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+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-_\b2_\b6_\b3 namespace MathImpl {\n+263 };\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+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-_\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+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-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+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-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+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 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+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:_\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-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_\bI_\bn_\bf\n-bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:594\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-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:584\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-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:614\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:_\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 ===============================================================================\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: indices.hh File Reference\n+dune-common: math.hh File Reference\n \n \n \n \n \n \n \n@@ -70,114 +70,197 @@\n
    \n \n
    \n
    \n
    \n \n-
    indices.hh File Reference
    \n+Macros |\n+Functions
    \n+
    math.hh File Reference
    \n
    \n
    \n-
    #include <cstddef>
    \n+\n+

    Some useful basic math stuff. \n+More...

    \n+
    #include <cmath>
    \n+#include <complex>
    \n+#include <limits>
    \n #include <type_traits>
    \n-#include <utility>
    \n-#include <dune/common/keywords.hh>
    \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+\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
     
    \n \n \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::MathOverloads
     namespace for customization of math functions with Dune-Semantics
     
    namespace  Dune::MathImpl
     
    \n-\n-\n-\n-\n-\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+Macros

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

    \n Functions

    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>...
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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.
     
    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+

    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 \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,96 +1,154 @@\n dune-common\u00a02.9.0\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 | _\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+_\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 \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bk_\be_\by_\bw_\bo_\br_\bd_\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 _\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:_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-\u00a0 Namespace with predefined compile time indices for the range\n- [0,19].\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-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-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- 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- 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- 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+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- 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+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- 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+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- 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+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- 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+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- 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+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 \u00a0\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-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-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-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-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-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-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+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-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+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-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+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bh_\bI_\bm_\bp_\bl\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+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-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+#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 _\bP_\bo_\bw_\be_\br 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+\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 ===============================================================================\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: indices.hh Source File\n+dune-common: math.hh Source File\n \n \n \n \n \n \n \n@@ -74,120 +74,373 @@\n \n
    \n \n
    \n
    \n
    \n-
    indices.hh
    \n+
    math.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 (C) 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_INDICES_HH
    \n-
    7#define DUNE_COMMON_INDICES_HH
    \n-
    8
    \n-
    9#include <cstddef>
    \n-
    10#include <type_traits>
    \n-
    11#include <utility>
    \n-
    12
    \n-\n-
    14
    \n-
    15namespace Dune
    \n-
    16{
    \n-
    29 template<std::size_t i>
    \n-
    30 using index_constant = std::integral_constant<std::size_t, i>;
    \n-
    31
    \n-
    32
    \n-
    33
    \n-
    \n-
    50 namespace Indices
    \n-
    51 {
    \n-\n-
    54
    \n-\n-
    57
    \n-\n-
    60
    \n-\n-
    63
    \n-\n-
    66
    \n-\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+
    \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+
    54 };
    \n+
    \n+
    55
    \n+
    56
    \n+
    64 template< class Field >
    \n+
    \n+\n+
    66 : public StandardMathematicalConstants<Field>
    \n+
    67 {};
    \n+
    \n+
    68
    \n
    69
    \n-\n-
    72
    \n-\n-
    75
    \n-\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-\n-
    81
    \n-\n-
    84
    \n-\n-
    87
    \n-\n-
    90
    \n-\n-
    93
    \n-\n-
    96
    \n-\n-
    99
    \n-\n-
    102
    \n-\n-
    105
    \n-\n-
    108
    \n-\n-
    111
    \n-
    112 } // namespace Indices
    \n-
    \n-
    113
    \n-
    124 template<class F, class I, I... i>
    \n-
    \n-
    125 decltype(auto) constexpr unpackIntegerSequence(F&& f, std::integer_sequence<I, i...> sequence)
    \n-
    126 {
    \n-
    127 return f(std::integral_constant<I, i>()...);
    \n-
    128 }
    \n-
    \n-
    129
    \n-
    130} //namespace Dune
    \n-
    131
    \n-
    132#endif // DUNE_COMMON_INDICES_HH
    \n-
    Definitions of several macros that conditionally make C++ syntax available.
    \n-
    #define DUNE_INLINE_VARIABLE
    Definition keywords.hh:19
    \n-
    constexpr index_constant< 16 > _16
    Compile time index with value 16.
    Definition indices.hh:101
    \n-
    constexpr index_constant< 15 > _15
    Compile time index with value 15.
    Definition indices.hh:98
    \n-
    constexpr index_constant< 8 > _8
    Compile time index with value 8.
    Definition indices.hh:77
    \n-
    constexpr index_constant< 7 > _7
    Compile time index with value 7.
    Definition indices.hh:74
    \n-
    constexpr index_constant< 0 > _0
    Compile time index with value 0.
    Definition indices.hh:53
    \n-
    constexpr index_constant< 9 > _9
    Compile time index with value 9.
    Definition indices.hh:80
    \n-
    constexpr index_constant< 14 > _14
    Compile time index with value 14.
    Definition indices.hh:95
    \n-
    constexpr index_constant< 1 > _1
    Compile time index with value 1.
    Definition indices.hh:56
    \n-
    constexpr index_constant< 3 > _3
    Compile time index with value 3.
    Definition indices.hh:62
    \n-
    constexpr index_constant< 12 > _12
    Compile time index with value 12.
    Definition indices.hh:89
    \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:125
    \n-
    constexpr index_constant< 11 > _11
    Compile time index with value 11.
    Definition indices.hh:86
    \n-
    constexpr index_constant< 18 > _18
    Compile time index with value 18.
    Definition indices.hh:107
    \n-
    constexpr index_constant< 13 > _13
    Compile time index with value 13.
    Definition indices.hh:92
    \n-
    constexpr index_constant< 5 > _5
    Compile time index with value 5.
    Definition indices.hh:68
    \n-
    constexpr index_constant< 17 > _17
    Compile time index with value 17.
    Definition indices.hh:104
    \n-
    constexpr index_constant< 10 > _10
    Compile time index with value 10.
    Definition indices.hh:83
    \n-
    constexpr index_constant< 2 > _2
    Compile time index with value 2.
    Definition indices.hh:59
    \n-
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:30
    \n-
    constexpr index_constant< 19 > _19
    Compile time index with value 19.
    Definition indices.hh:110
    \n-
    constexpr index_constant< 6 > _6
    Compile time index with value 6.
    Definition indices.hh:71
    \n-
    constexpr index_constant< 4 > _4
    Compile time index with value 4.
    Definition indices.hh:65
    \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
    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)
    Definition fvector.hh:604
    \n+
    bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:594
    \n+
    auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:584
    \n+
    bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:614
    \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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,183 +1,381 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-indices.hh\n+math.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 (C) 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_INDICES_HH\n-7#define DUNE_COMMON_INDICES_HH\n-8\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/_\bk_\be_\by_\bw_\bo_\br_\bd_\bs_\b._\bh_\bh>\n-14\n-15namespace _\bD_\bu_\bn_\be\n-16{\n-29 template\n-_\b3_\b0 using _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt = std::integral_constant;\n-31\n-32\n-33\n-_\b5_\b0 namespace Indices\n-51 {\n-_\b5_\b3 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b0_\b> _\b__\b0 = {};\n-54\n-_\b5_\b6 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b1_\b> _\b__\b1 = {};\n-57\n-_\b5_\b9 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b2_\b> _\b__\b2 = {};\n-60\n-_\b6_\b2 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b3_\b> _\b__\b3 = {};\n-63\n-_\b6_\b5 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b4_\b> _\b__\b4 = {};\n-66\n-_\b6_\b8 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b5_\b> _\b__\b5 = {};\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+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+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+68\n 69\n-_\b7_\b1 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b6_\b> _\b__\b6 = {};\n-72\n-_\b7_\b4 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b7_\b> _\b__\b7 = {};\n-75\n-_\b7_\b7 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b8_\b> _\b__\b8 = {};\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-_\b8_\b0 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b9_\b> _\b__\b9 = {};\n-81\n-_\b8_\b3 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b0_\b> _\b__\b1_\b0 = {};\n-84\n-_\b8_\b6 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b1_\b> _\b__\b1_\b1 = {};\n-87\n-_\b8_\b9 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b2_\b> _\b__\b1_\b2 = {};\n-90\n-_\b9_\b2 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b3_\b> _\b__\b1_\b3 = {};\n-93\n-_\b9_\b5 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b4_\b> _\b__\b1_\b4 = {};\n-96\n-_\b9_\b8 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b5_\b> _\b__\b1_\b5 = {};\n-99\n-_\b1_\b0_\b1 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b6_\b> _\b__\b1_\b6 = {};\n-102\n-_\b1_\b0_\b4 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b7_\b> _\b__\b1_\b7 = {};\n-105\n-_\b1_\b0_\b7 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b8_\b> _\b__\b1_\b8 = {};\n-108\n-_\b1_\b1_\b0 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b9_\b> _\b__\b1_\b9 = {};\n-111\n-112 } // namespace Indices\n-113\n-124 template\n-_\b1_\b2_\b5 decltype(auto) constexpr _\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 sequence)\n-126 {\n-127 return f(std::integral_constant()...);\n-128 }\n-129\n-130} //namespace Dune\n-131\n-132#endif // DUNE_COMMON_INDICES_HH\n-_\bk_\be_\by_\bw_\bo_\br_\bd_\bs_\b._\bh_\bh\n-Definitions of several macros that conditionally make C++ syntax available.\n-_\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE\n-#define DUNE_INLINE_VARIABLE\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn keywords.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b6\n-constexpr index_constant< 16 > _16\n-Compile time index with value 16.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b5\n-constexpr index_constant< 15 > _15\n-Compile time index with value 15.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:98\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b8\n-constexpr index_constant< 8 > _8\n-Compile time index with value 8.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b7\n-constexpr index_constant< 7 > _7\n-Compile time index with value 7.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b0\n-constexpr index_constant< 0 > _0\n-Compile time index with value 0.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b9\n-constexpr index_constant< 9 > _9\n-Compile time index with value 9.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b4\n-constexpr index_constant< 14 > _14\n-Compile time index with value 14.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1\n-constexpr index_constant< 1 > _1\n-Compile time index with value 1.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b3\n-constexpr index_constant< 3 > _3\n-Compile time index with value 3.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b2\n-constexpr index_constant< 12 > _12\n-Compile time index with value 12.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:89\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:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b1\n-constexpr index_constant< 11 > _11\n-Compile time index with value 11.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b8\n-constexpr index_constant< 18 > _18\n-Compile time index with value 18.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b3\n-constexpr index_constant< 13 > _13\n-Compile time index with value 13.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b5\n-constexpr index_constant< 5 > _5\n-Compile time index with value 5.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b7\n-constexpr index_constant< 17 > _17\n-Compile time index with value 17.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b0\n-constexpr index_constant< 10 > _10\n-Compile time index with value 10.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b2\n-constexpr index_constant< 2 > _2\n-Compile time index with value 2.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n-std::integral_constant< std::size_t, i > index_constant\n-An index constant with value i.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b9\n-constexpr index_constant< 19 > _19\n-Compile time index with value 19.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b6\n-constexpr index_constant< 6 > _6\n-Compile time index with value 6.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b4\n-constexpr index_constant< 4 > _4\n-Compile time index with value 4.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:65\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 _\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+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_\bI_\bn_\bf\n+bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:594\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:584\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:614\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 ===============================================================================\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.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00137.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: base.hh File Reference\n+dune-common: indent.hh File Reference\n \n \n \n \n \n \n \n@@ -65,53 +65,54 @@\n
    \n
    \n
    \n
    \n \n \n
    \n \n+
    indent.hh File Reference
    \n
    \n
    \n \n-

    Basic definitions for SIMD Implementations. \n+

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

    \n-\n+
    #include <ostream>
    \n+#include <string>
    \n+
    \n

    Go to the source code of this file.

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

    \n Classes

    struct  Dune::Simd::Overloads::ADLTag< i >
     
    struct  Dune::Simd::Overloads::ADLTag< 0 >
    class  Dune::Indent
     Utility class for handling nested indentation in output. More...
     
    \n \n \n \n \n-\n-\n-\n-\n-\n-\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    \n+\n+\n+\n+\n

    \n+Functions

    std::ostream & Dune::operator<< (std::ostream &s, const Indent &indent)
     write indentation to a stream
     
    \n

    Detailed Description

    \n-

    Basic definitions for SIMD Implementations.

    \n-

    This file provides basic definitions and template declarations that are used to write SIMD abstraction layers.

    \n-

    This file should never be included by users of the SIMD abstraction. Include <dune/common/simd/simd.hh> instead.

    \n+

    Utility class for handling nested indentation in output.

    \n+
    Author
    J\u00f6 Fahlke
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-us-ascii\n+utf-8\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,37 +1,31 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-base.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bA_\bb_\bs_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-Basic definitions for SIMD Implementations. _\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+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 _\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_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b _\bi_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b _\b0_\b _\b>\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:_\bS_\bi_\bm_\bd\n-\u00a0 Namespace for vectorization interface functions used by library\n- developers.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n-\u00a0 Namespace for the overloads and specializations that make up a SIMD\n- implementation.\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 \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-Basic definitions for SIMD Implementations.\n-This file provides basic definitions and template declarations that are used to\n-write SIMD abstraction layers.\n-This file should never be included by users of the SIMD abstraction. Include\n-<_\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+Utility class for handling nested indentation in output.\n+ Author\n+ J\u00c3\u00b6 Fahlke\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: base.hh Source File\n+dune-common: indent.hh Source File\n \n \n \n \n \n \n \n@@ -70,66 +70,111 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    base.hh
    \n+
    indent.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_BASE_HH
    \n-
    4#define DUNE_COMMON_SIMD_BASE_HH
    \n-
    5
    \n-
    92namespace Dune {
    \n-
    93 namespace Simd {
    \n-
    94
    \n-
    97
    \n-
    112 namespace Overloads {
    \n-
    113
    \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 (C) 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+
    7
    \n+
    8#include <ostream>
    \n+
    9#include <string>
    \n+
    10
    \n+
    11namespace Dune {
    \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+
    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+
    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+
    112
    \n+
    115} // namespace Dune
    \n
    116
    \n-
    118
    \n-
    181 template<unsigned i, bool = true>
    \n-
    182 struct ADLTag;
    \n-
    183
    \n-
    184 template<unsigned i>
    \n-
    185 struct ADLTag<i> : ADLTag<i-1> {};
    \n-
    186
    \n-
    187 template<>
    \n-
    188 struct ADLTag<0> {};
    \n-
    189
    \n-
    191
    \n-
    195 template<class V, class SFINAETag = void>
    \n-
    196 struct ScalarType;
    \n-
    197
    \n-
    199
    \n-
    203 template<class S, class V, class SFINAETag = void>
    \n-
    204 struct RebindType;
    \n-
    205
    \n-
    207
    \n-
    211 template<class V, class SFINAETag = void>
    \n-
    212 struct LaneCount;
    \n-
    213
    \n-
    215
    \n-
    216 } // namespace Overloads
    \n-
    217 } // namespace Simd
    \n-
    218} // namespace Dune
    \n-
    219
    \n-
    220#endif // DUNE_COMMON_SIMD_BASE_HH
    \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
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n-
    should have a member type type
    Definition standard.hh:60
    \n-
    should have a member type type
    Definition standard.hh:67
    \n-
    should be derived from a Dune::index_constant
    Definition standard.hh:74
    \n+
    Utility class for handling nested indentation in output.
    Definition indent.hh:53
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,67 +1,119 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-base.hh\n+indent.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 (C) 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 (C) 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_BASE_HH\n-4#define DUNE_COMMON_SIMD_BASE_HH\n-5\n-92namespace _\bD_\bu_\bn_\be {\n-93 namespace Simd {\n-94\n-97\n-112 namespace Overloads {\n-113\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+7\n+8#include \n+9#include \n+10\n+11namespace _\bD_\bu_\bn_\be {\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+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+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+112\n+115} // namespace Dune\n 116\n-118\n-181 template\n-_\b1_\b8_\b2 struct _\bA_\bD_\bL_\bT_\ba_\bg;\n-183\n-184 template\n-_\b1_\b8_\b5 struct _\bA_\bD_\bL_\bT_\ba_\bg : _\bA_\bD_\bL_\bT_\ba_\bg {};\n-186\n-187 template<>\n-_\b1_\b8_\b8 struct _\bA_\bD_\bL_\bT_\ba_\bg<0> {};\n-189\n-191\n-195 template\n-196 struct _\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be;\n-197\n-199\n-203 template\n-204 struct _\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be;\n-205\n-207\n-211 template\n-212 struct _\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt;\n-213\n-215\n-216 } // namespace Overloads\n-217 } // namespace Simd\n-218} // namespace Dune\n-219\n-220#endif // DUNE_COMMON_SIMD_BASE_HH\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 _\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_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n-Tag used to force late-binding lookup in Dune::Simd::Overloads.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt\n-should be derived from a Dune::index_constant\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bn_\bt\n+Utility class for handling nested indentation in output.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indent.hh:53\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: standard.hh File Reference\n+dune-common: tuplevector.hh File Reference\n \n \n \n \n \n \n \n@@ -65,86 +65,57 @@\n
    \n
    \n
    \n
    \n \n \n
    \n \n+
    tuplevector.hh File Reference
    \n
    \n
    \n \n-

    SIMD abstractions for the standard built-in types. \n+

    Provides the TupleVector class that augments std::tuple by operator[]. \n More...

    \n-
    #include <cstddef>
    \n-#include <type_traits>
    \n+
    #include <tuple>
    \n #include <utility>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/simd/base.hh>
    \n-#include <dune/common/simd/defaults.hh>
    \n+#include <dune/common/indices.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/std/type_traits.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

    struct  Dune::Simd::Overloads::ScalarType< V, class >
     should have a member type type More...
     
    struct  Dune::Simd::Overloads::RebindType< S, class, class >
     should have a member type type More...
     
    struct  Dune::Simd::Overloads::LaneCount< class, class >
     should be derived from a Dune::index_constant More...
    class  Dune::TupleVector< T >
     A class augmenting std::tuple by element access via operator[]. More...
     
    \n \n \n \n \n-\n-\n-\n-\n-\n-\n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    \n \n-\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

    Specialized classes and overloaded functions
    template<class V >
    Dune::Simd::Overloads::lane (ADLTag< 2 >, std::size_t, V v)
     implements Simd::lane()
     
    template<class V >
    V & Dune::Simd::Overloads::lane (ADLTag< 3 >, std::size_t, V &v)
     
    bool Dune::Simd::Overloads::anyTrue (ADLTag< 2 >, bool mask)
     implements Simd::anyTrue()
     
    bool Dune::Simd::Overloads::allTrue (ADLTag< 2 >, bool mask)
     implements Simd::allTrue()
     
    bool Dune::Simd::Overloads::anyFalse (ADLTag< 2 >, bool mask)
     implements Simd::anyFalse()
     
    bool Dune::Simd::Overloads::allFalse (ADLTag< 2 >, bool mask)
     implements Simd::allFalse()
     
    template<class... T>
    constexpr auto Dune::makeTupleVector (T &&... t)
     
    \n

    Detailed Description

    \n-

    SIMD abstractions for the standard built-in types.

    \n-

    This file should not normally be included by users of the SIMD abstraction (i.e. other Dune headers). Neither should it be included by the translation units passing built-in types to Dune headers that in turn support SIMD types through the SIMD abstraction. Dune-functionality always supports built-in types. Either because that functionality does not support SIMD types and so only supports built-in types, or if it does support SIMD types it must include <dune/common/simd/simd.hh>, which in turn includes this header.

    \n+

    Provides the TupleVector class that augments std::tuple by operator[].

    \n+
    Author
    Carsten Gr\u00e4ser
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-us-ascii\n+utf-8\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,73 +1,33 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-standard.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bA_\bp_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be \u00bb _\bS_\bI_\bM_\bD_\b _\bA_\bb_\bs_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn\n-_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bf_\bo_\br_\b _\bs_\bt_\ba_\bn_\bd_\ba_\br_\bd_\b _\bt_\by_\bp_\be_\bs\n-SIMD abstractions for the standard built-in types. _\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 | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+tuplevector.hh File Reference\n+Provides the TupleVector class that augments std::tuple by operator[]. _\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/_\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_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\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+#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 _\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_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b<_\b _\bV_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n-\u00a0 should have a member type type _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be_\b<_\b _\bS_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n-\u00a0 should have a member type type _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n-\u00a0 should be derived from a _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 A class augmenting std::tuple by element access via operator[]. _\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_\bi_\bm_\bd\n-\u00a0 Namespace for vectorization interface functions used by library\n- developers.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n-\u00a0 Namespace for the overloads and specializations that make up a SIMD\n- implementation.\n-\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-Specialized classes and overloaded functions\n-template\n- V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, std::size_t, V v)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\b(_\b)\n-\u00a0\n-template\n- V &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 3 >, std::size_t, V &v)\n-\u00a0\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be_\b(_\b)\n-\u00a0\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be_\b(_\b)\n-\u00a0\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be_\b(_\b)\n-\u00a0\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 2 >, bool _\bm_\ba_\bs_\bk)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be_\b(_\b)\n+template\n+constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br (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-SIMD abstractions for the standard built-in types.\n-This file should not normally be included by users of the SIMD abstraction\n-(i.e. other _\bD_\bu_\bn_\be headers). Neither should it be included by the translation\n-units passing built-in types to _\bD_\bu_\bn_\be headers that in turn support SIMD types\n-through the SIMD abstraction. Dune-functionality always supports built-in\n-types. Either because that functionality does not support SIMD types and so\n-only supports built-in types, or if it does support SIMD types it must include\n-<_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>, which in turn includes this header.\n+Provides the TupleVector class that augments std::tuple by operator[].\n+ Author\n+ Carsten Gr\u00c3\u00a4ser\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: standard.hh Source File\n+dune-common: tuplevector.hh Source File\n \n \n \n \n \n \n \n@@ -70,102 +70,124 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    standard.hh
    \n+
    tuplevector.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_STANDARD_HH
    \n-
    4#define DUNE_COMMON_SIMD_STANDARD_HH
    \n-
    5
    \n-
    20#include <cstddef>
    \n-
    21#include <type_traits>
    \n-
    22#include <utility>
    \n-
    23
    \n-\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 (C) 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_TUPLEVECTOR_HH
    \n+
    6#define DUNE_COMMON_TUPLEVECTOR_HH
    \n+
    7
    \n+
    8#include <tuple>
    \n+
    9#include <utility>
    \n+
    10
    \n+\n+\n+\n+
    14
    \n+
    15
    \n+
    16
    \n+
    23namespace Dune
    \n+
    24{
    \n+
    25
    \n+
    26
    \n
    27
    \n-
    45namespace Dune {
    \n-
    46 namespace Simd {
    \n-
    47
    \n-
    48 namespace Overloads {
    \n-
    49
    \n-
    56
    \n-
    59 template<class V, class>
    \n-
    60 struct ScalarType { using type = V; };
    \n-
    61
    \n+
    33template<class... T>
    \n+
    \n+
    34class TupleVector : public std::tuple<T...>
    \n+
    35{
    \n+
    36 using Base = std::tuple<T...>;
    \n+
    37
    \n+
    38 template<class... TT>
    \n+
    39 using TupleConstructorDetector = decltype(Base(std::declval<TT&&>()...));
    \n+
    40
    \n+
    41 template<class... TT>
    \n+
    42 using hasTupleConstructor = Dune::Std::is_detected<TupleConstructorDetector, TT...>;
    \n+
    43
    \n+
    44
    \n+
    45public:
    \n+
    46
    \n+
    53 template<class... TT,
    \n+
    54 std::enable_if_t<hasTupleConstructor<TT...>::value, int> = 0>
    \n+
    \n+
    55 constexpr TupleVector(TT&&... tt) :
    \n+
    56 Base(std::forward<TT>(tt)...)
    \n+
    57 {}
    \n+
    \n+
    58
    \n+
    \n+
    61 constexpr TupleVector()
    \n+
    62 {}
    \n+
    \n
    63
    \n-
    66 template<class S, class, class>
    \n-
    67 struct RebindType { using type = S; };
    \n-
    68
    \n-
    70
    \n-
    73 template<class, class>
    \n-
    74 struct LaneCount : public index_constant<1> { };
    \n-
    75
    \n-
    77
    \n-
    86 template<class V>
    \n-
    \n-
    87 V lane(ADLTag<2>, std::size_t, V v)
    \n-
    88 {
    \n-
    89 return v;
    \n-
    90 }
    \n-
    \n-
    91
    \n-
    92 template<class V>
    \n-
    \n-
    93 V &lane(ADLTag<3>, std::size_t, V &v)
    \n-
    94 {
    \n-
    95 return v;
    \n-
    96 }
    \n+
    66 template<std::size_t i>
    \n+
    \n+
    67 constexpr decltype(auto) operator[](const Dune::index_constant<i>&) const
    \n+
    68 {
    \n+
    69 return std::get<i>(*this);
    \n+
    70 }
    \n+
    \n+
    71
    \n+
    74 template<std::size_t i>
    \n+
    \n+
    75 decltype(auto) operator[](const Dune::index_constant<i>&)
    \n+
    76 {
    \n+
    77 return std::get<i>(*this);
    \n+
    78 }
    \n+
    \n+
    79
    \n+
    \n+
    81 static constexpr std::size_t size()
    \n+
    82 {
    \n+
    83 return std::tuple_size<Base>::value;
    \n+
    84 }
    \n+
    \n+
    85};
    \n+
    \n+
    86
    \n+
    87
    \n+
    88
    \n+
    89template<class... T>
    \n+
    \n+
    90constexpr auto makeTupleVector(T&&... t)
    \n+
    91{
    \n+
    92 // The std::decay_t<T> is is a slight simplification,
    \n+
    93 // because std::reference_wrapper needs special care.
    \n+
    94 return TupleVector<std::decay_t<T>...>(std::forward<T>(t)...);
    \n+
    95}
    \n
    \n+
    96
    \n
    97
    \n-
    98 // No Simd::cond() implementation, the overload for bool masks in the
    \n-
    99 // interface is sufficient
    \n+
    98
    \n+
    99} // namespace Dune
    \n
    100
    \n-
    102 inline bool anyTrue(ADLTag<2>, bool mask) { return mask; }
    \n-
    103
    \n-
    105 inline bool allTrue(ADLTag<2>, bool mask) { return mask; }
    \n-
    106
    \n-
    108 inline bool anyFalse(ADLTag<2>, bool mask) { return !mask; }
    \n-
    109
    \n-
    111 inline bool allFalse(ADLTag<2>, bool mask) { return !mask; }
    \n-
    112
    \n-
    114
    \n-
    115 } // namespace Overloads
    \n-
    116 } // namespace Simd
    \n-
    117} // namespace Dune
    \n-
    118
    \n-
    119#endif // DUNE_COMMON_SIMD_STANDARD_HH
    \n-\n-
    Basic definitions for SIMD Implementations.
    \n-
    Default implementations for SIMD Implementations.
    \n+
    101#endif // DUNE_COMMON_TUPLEVECTOR_HH
    \n+\n+
    Traits for type conversions and type information.
    \n+\n
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:30
    \n-
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n-
    bool allFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::allFalse()
    Definition defaults.hh:124
    \n-
    bool allTrue(ADLTag< 0 >, const Mask &mask)
    implements Simd::allTrue()
    Definition defaults.hh:104
    \n-
    bool anyFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::anyFalse()
    Definition defaults.hh:114
    \n+
    typename detected_or< nonesuch, Op, Args... >::value_t is_detected
    Detects whether Op<Args...> is valid.
    Definition type_traits.hh:141
    \n+
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
    Definition debugalign.hh:543
    \n-
    T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
    Definition debugalign.hh:520
    \n-
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n-
    should have a member type type
    Definition standard.hh:60
    \n-
    V type
    Definition standard.hh:60
    \n-
    should have a member type type
    Definition standard.hh:67
    \n-
    S type
    Definition standard.hh:67
    \n-
    should be derived from a Dune::index_constant
    Definition standard.hh:74
    \n+
    constexpr auto makeTupleVector(T &&... t)
    Definition tuplevector.hh:90
    \n+
    A class augmenting std::tuple by element access via operator[].
    Definition tuplevector.hh:35
    \n+
    static constexpr std::size_t size()
    Number of elements of the tuple.
    Definition tuplevector.hh:81
    \n+
    constexpr TupleVector(TT &&... tt)
    Construct from a set of arguments.
    Definition tuplevector.hh:55
    \n+
    constexpr TupleVector()
    Default constructor.
    Definition tuplevector.hh:61
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,124 +1,124 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-standard.hh\n+tuplevector.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 (C) 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 (C) 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_STANDARD_HH\n-4#define DUNE_COMMON_SIMD_STANDARD_HH\n-5\n-20#include \n-21#include \n-22#include \n-23\n-24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n-26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs_\b._\bh_\bh>\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_COMMON_TUPLEVECTOR_HH\n+6#define DUNE_COMMON_TUPLEVECTOR_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/_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh>\n+13#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+14\n+15\n+16\n+23namespace _\bD_\bu_\bn_\be\n+24{\n+25\n+26\n 27\n-45namespace _\bD_\bu_\bn_\be {\n-46 namespace Simd {\n-47\n-48 namespace Overloads {\n-49\n-56\n-59 template\n-_\b6_\b0 struct _\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be { using _\bt_\by_\bp_\be = V; };\n-61\n+33template\n+_\b3_\b4class _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br : public std::tuple\n+35{\n+36 using Base = std::tuple;\n+37\n+38 template\n+39 using TupleConstructorDetector = decltype(Base(std::declval()...));\n+40\n+41 template\n+42 using hasTupleConstructor = _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd;\n+43\n+44\n+45public:\n+46\n+53 template::value, int> = 0>\n+_\b5_\b5 constexpr _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br(TT&&... tt) :\n+56 Base(_\bs_\bt_\bd::forward(tt)...)\n+57 {}\n+58\n+_\b6_\b1 constexpr _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br()\n+62 {}\n 63\n-66 template\n-_\b6_\b7 struct _\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be { using _\bt_\by_\bp_\be = S; };\n-68\n-70\n-73 template\n-_\b7_\b4 struct _\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt : public _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt<1> { };\n-75\n-77\n-86 template\n-_\b8_\b7 V _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, std::size_t, V v)\n-88 {\n-89 return v;\n-90 }\n-91\n-92 template\n-_\b9_\b3 V &_\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b3_\b>, std::size_t, V &v)\n-94 {\n-95 return v;\n-96 }\n+66 template\n+_\b6_\b7 constexpr decltype(auto) operator[](const _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>&) const\n+68 {\n+69 return std::get(*this);\n+70 }\n+71\n+74 template\n+_\b7_\b5 decltype(auto) operator[](const _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\bi_\b>&)\n+76 {\n+77 return std::get(*this);\n+78 }\n+79\n+_\b8_\b1 static constexpr std::size_t _\bs_\bi_\bz_\be()\n+82 {\n+83 return std::tuple_size::value;\n+84 }\n+85};\n+86\n+87\n+88\n+89template\n+_\b9_\b0constexpr auto _\bm_\ba_\bk_\be_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br(T&&... t)\n+91{\n+92 // The std::decay_t is is a slight simplification,\n+93 // because std::reference_wrapper needs special care.\n+94 return _\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bd_\be_\bc_\ba_\by_\b__\bt_\b<_\bT_\b>...>(std::forward(t)...);\n+95}\n+96\n 97\n-98 // No Simd::cond() implementation, the overload for bool masks in the\n-99 // interface is sufficient\n+98\n+99} // namespace Dune\n 100\n-_\b1_\b0_\b2 inline bool _\ba_\bn_\by_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return _\bm_\ba_\bs_\bk; }\n-103\n-_\b1_\b0_\b5 inline bool _\ba_\bl_\bl_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return _\bm_\ba_\bs_\bk; }\n-106\n-_\b1_\b0_\b8 inline bool _\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return !_\bm_\ba_\bs_\bk; }\n-109\n-_\b1_\b1_\b1 inline bool _\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b2_\b>, bool _\bm_\ba_\bs_\bk) { return !_\bm_\ba_\bs_\bk; }\n-112\n-114\n-115 } // namespace Overloads\n-116 } // namespace Simd\n-117} // namespace Dune\n-118\n-119#endif // DUNE_COMMON_SIMD_STANDARD_HH\n+101#endif // DUNE_COMMON_TUPLEVECTOR_HH\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 _\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh\n-_\bb_\ba_\bs_\be_\b._\bh_\bh\n-Basic definitions for SIMD Implementations.\n-_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs_\b._\bh_\bh\n-Default implementations for SIMD Implementations.\n _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n std::integral_constant< std::size_t, i > index_constant\n An index constant with value i.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:30\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-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n-bool allFalse(ADLTag< 0 >, const Mask &mask)\n-implements Simd::allFalse()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be\n-bool allTrue(ADLTag< 0 >, const Mask &mask)\n-implements Simd::allTrue()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n-bool anyFalse(ADLTag< 0 >, const Mask &mask)\n-implements Simd::anyFalse()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:114\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:141\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_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n-bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:543\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be\n-T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:520\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n-Tag used to force late-binding lookup in Dune::Simd::Overloads.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n-V type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n-S type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt\n-should be derived from a Dune::index_constant\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n+constexpr auto makeTupleVector(T &&... t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n+A class augmenting std::tuple by element access via operator[].\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr std::size_t size()\n+Number of elements of the tuple.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n+constexpr TupleVector(TT &&... tt)\n+Construct from a set of arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bT_\bu_\bp_\bl_\be_\bV_\be_\bc_\bt_\bo_\br\n+constexpr TupleVector()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn tuplevector.hh:61\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: loop.hh File Reference\n+dune-common: dynmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,681 +65,57 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n-
    loop.hh File Reference
    \n+Namespaces
    \n+
    dynmatrix.hh File Reference
    \n
    \n
    \n-
    #include <array>
    \n-#include <cmath>
    \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 <cstdlib>
    \n-#include <cstdint>
    \n-#include <ostream>
    \n-#include <dune/common/math.hh>
    \n-#include <dune/common/simd/simd.hh>
    \n-#include <dune/common/typetraits.hh>
    \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-\n+\n+\n \n

    \n Classes

    class  Dune::LoopSIMD< T, S, A >
     
    struct  Dune::Simd::Overloads::ScalarType< LoopSIMD< T, S, A > >
     
    struct  Dune::Simd::Overloads::RebindType< U, LoopSIMD< T, S, A > >
    struct  Dune::DenseMatVecTraits< DynamicMatrix< K > >
     
    struct  Dune::Simd::Overloads::LaneCount< LoopSIMD< T, S, A > >
    struct  Dune::FieldTraits< DynamicMatrix< K > >
     
    struct  Dune::IsNumber< LoopSIMD< T, S, A > >
    class  Dune::DynamicMatrix< K >
     Construct a matrix with a dynamic size. More...
     
    \n \n \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    namespace  Dune::MathOverloads
     namespace for customization of math functions with Dune-Semantics
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Macros

    #define DUNE_PRAGMA_OMP_SIMD
     
    #define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_UNARY_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_POSTFIX_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL)
     
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr)
     
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType)
     
    #define DUNE_SIMD_LOOP_STD_UNARY_OP(expr)
     
    #define DUNE_SIMD_LOOP_STD_BINARY_OP(expr)
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\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

     Dune::DUNE_SIMD_LOOP_BINARY_OP (+)
     
     Dune::DUNE_SIMD_LOOP_BINARY_OP (-)
     
    DUNE_SIMD_LOOP_BINARY_OP * Dune::DUNE_SIMD_LOOP_BINARY_OP (/);DUNE_SIMD_LOOP_BINARY_OP(%
     
    DUNE_SIMD_LOOP_BINARY_OP & Dune::DUNE_SIMD_LOOP_BINARY_OP (|);DUNE_SIMD_LOOP_BINARY_OP(^
     
     Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (<<)
     
     Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (> >)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<=)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (>=)
     
     Dune::DUNE_SIMD_LOOP_COMPARISON_OP (!=)
     
    DUNE_SIMD_LOOP_BOOLEAN_OP && Dune::DUNE_SIMD_LOOP_BOOLEAN_OP (||);template< class T, std::size_t S, std::size_t A > std::ostream &operator<<(std::ostream &os, const LoopSIMD< T, S, A > &v
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, LoopSIMD< T, S, A > &&v) -> decltype(std::move(Simd::lane(l%lanes< T >(), v[l/lanes< T >()])))
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, const LoopSIMD< T, S, A > &v) -> decltype(Simd::lane(l%lanes< T >(), v[l/lanes< T >()]))
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, LoopSIMD< T, S, A > &v) -> decltype(Simd::lane(l%lanes< T >(), v[l/lanes< T >()]))
     
    template<class T , std::size_t S, std::size_t AM, std::size_t AD>
    auto Dune::Simd::Overloads::cond (ADLTag< 5 >, Simd::Mask< LoopSIMD< T, S, AM > > mask, LoopSIMD< T, S, AD > ifTrue, LoopSIMD< T, S, AD > ifFalse)
     
    template<class M , class T , std::size_t S, std::size_t A>
    auto Dune::Simd::Overloads::cond (ADLTag< 5, std::is_same< bool, Simd::Scalar< M > >::value &&Simd::lanes< M >()==Simd::lanes< LoopSIMD< T, S, A > >()>, M mask, LoopSIMD< T, S, A > ifTrue, LoopSIMD< T, S, A > ifFalse)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::allTrue (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::anyFalse (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
    template<class M , std::size_t S, std::size_t A>
    bool Dune::Simd::Overloads::allFalse (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cos)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sin)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tan)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acos)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asin)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atan)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cosh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sinh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tanh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acosh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asinh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atanh)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log10)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp2)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (expm1)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (ilogb, int)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log1p)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log2)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (logb)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sqrt)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cbrt)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erf)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erfc)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tgamma)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (lgamma)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (ceil)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (floor)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (trunc)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (round)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (lround, long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (llround, long long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (rint)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (lrint, long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (llrint, long long)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (nearbyint)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (fabs)
     
     Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (abs)
     
     Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (real)
     
     Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (imag)
     
     Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (max)
     
     Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (min)
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::MathOverloads::isNaN (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::MathOverloads::isInf (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
     
    template<class T , std::size_t S, std::size_t A>
    auto Dune::MathOverloads::isFinite (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
     
    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_PRAGMA_OMP_SIMD

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_PRAGMA_OMP_SIMD
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_ASSIGNMENT_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_ASSIGNMENT_OP( SYMBOL)
    \n-
    \n-Value:
    auto operator SYMBOL(const Simd::Scalar<T> s) { \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    (*this)[i] SYMBOL s; \\
    \n-
    } \\
    \n-
    return *this; \\
    \n-
    } \\
    \n-
    \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v) { \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    (*this)[i] SYMBOL v[i]; \\
    \n-
    } \\
    \n-
    return *this; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_BINARY_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_BINARY_OP( SYMBOL)
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL s; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = s SYMBOL v[i]; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    const LoopSIMD<T,S,A> &w) { \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL w[i]; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_BITSHIFT_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_BITSHIFT_OP( SYMBOL)
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A, class U> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL s; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    template<class T, std::size_t S, std::size_t A, class U, std::size_t AU> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    const LoopSIMD<U,S,AU> &w) { \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL w[i]; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_BOOLEAN_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_BOOLEAN_OP( SYMBOL)
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \\
    \n-
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL s; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const Simd::Mask<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n-
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = s SYMBOL v[i]; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    const LoopSIMD<T,S,A> &w) { \\
    \n-
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL w[i]; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_CMATH_UNARY_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP( expr)
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A, typename Sfinae = \\
    \n-
    typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \\
    \n-
    auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n-
    using std::expr; \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    for(std::size_t i=0; i<S; i++) { \\
    \n-
    out[i] = expr(v[i]); \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN( expr,
     returnType 
    )
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A, typename Sfinae = \\
    \n-
    typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \\
    \n-
    auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n-
    using std::expr; \\
    \n-
    LoopSIMD<returnType,S> out; \\
    \n-
    for(std::size_t i=0; i<S; i++) { \\
    \n-
    out[i] = expr(v[i]); \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_COMPARISON_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_COMPARISON_OP( SYMBOL)
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A, class U> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \\
    \n-
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL s; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n-
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = s SYMBOL v[i]; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    const LoopSIMD<T,S,A> &w) { \\
    \n-
    Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = v[i] SYMBOL w[i]; \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_POSTFIX_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_POSTFIX_OP( SYMBOL)
    \n-
    \n-Value:
    auto operator SYMBOL(int){ \\
    \n-
    LoopSIMD<T,S,A> out = *this; \\
    \n-
    SYMBOL(*this); \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_PREFIX_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_PREFIX_OP( SYMBOL)
    \n-
    \n-Value:
    auto operator SYMBOL() { \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    SYMBOL(*this)[i]; \\
    \n-
    } \\
    \n-
    return *this; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_STD_BINARY_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_STD_BINARY_OP( expr)
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto expr(const LoopSIMD<T,S,A> &v, const LoopSIMD<T,S,A> &w) { \\
    \n-
    using std::expr; \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    for(std::size_t i=0; i<S; i++) { \\
    \n-
    out[i] = expr(v[i],w[i]); \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_STD_UNARY_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_STD_UNARY_OP( expr)
    \n-
    \n-Value:
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n-
    using std::expr; \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    for(std::size_t i=0; i<S; i++) { \\
    \n-
    out[i] = expr(v[i]); \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    \\
    \n-
    template<class T, std::size_t S, std::size_t A> \\
    \n-
    auto expr(const LoopSIMD<std::complex<T>,S,A> &v) { \\
    \n-
    using std::expr; \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    for(std::size_t i=0; i<S; i++) { \\
    \n-
    out[i] = expr(v[i]); \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_LOOP_UNARY_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_LOOP_UNARY_OP( SYMBOL)
    \n-
    \n-Value:
    auto operator SYMBOL() const { \\
    \n-
    LoopSIMD<T,S,A> out; \\
    \n-
    DUNE_PRAGMA_OMP_SIMD \\
    \n-
    for(std::size_t i=0; i<S; i++){ \\
    \n-
    out[i] = SYMBOL((*this)[i]); \\
    \n-
    } \\
    \n-
    return out; \\
    \n-
    } \\
    \n-
    static_assert(true, "expecting ;")
    \n-
    \n-
    \n-
    \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,489 +1,37 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\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-loop.hh File Reference\n-#include \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 \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/_\bs_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>\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:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b<_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\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_\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be_\b<_\b _\bU_\b,_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt_\b<_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bN_\bu_\bm_\bb_\be_\br_\b<_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>_\b _\b>\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_\bi_\bm_\bd\n-\u00a0 Namespace for vectorization interface functions used by library\n- developers.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n-\u00a0 Namespace for the overloads and specializations that make up a SIMD\n- implementation.\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-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bP_\bR_\bA_\bG_\bM_\bA_\b__\bO_\bM_\bP_\b__\bS_\bI_\bM_\bD\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bT_\bS_\bH_\bI_\bF_\bT_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bO_\bO_\bL_\bE_\bA_\bN_\b__\bO_\bP(SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP(expr)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN(expr, returnType)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP(expr)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(expr)\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (+)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (-)\n-\u00a0\n- DUNE_SIMD_LOOP_BINARY_OP *\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (/\n- );DUNE_SIMD_LOOP_BINARY_OP(%\n-\u00a0\n- DUNE_SIMD_LOOP_BINARY_OP &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP\n- (|);DUNE_SIMD_LOOP_BINARY_OP(^\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bT_\bS_\bH_\bI_\bF_\bT_\b__\bO_\bP (<<)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bT_\bS_\bH_\bI_\bF_\bT_\b__\bO_\bP (> >)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (<)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (<=)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (>=)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP (!=)\n-\u00a0\n-DUNE_SIMD_LOOP_BOOLEAN_OP &&\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bO_\bO_\bL_\bE_\bA_\bN_\b__\bO_\bP (||);template<\n- class T, std::size_t S, std::size_t A > std::\n- ostream &operator<<(std::ostream &os, const\n- _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &v\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, std::\n- size_t l, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &&v) -> decltype\n- (std::move(Simd::lane(l%_\bl_\ba_\bn_\be_\bs< T >(), v[l/_\bl_\ba_\bn_\be_\bs<\n- T >()])))\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, std::\n- size_t l, const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &v) -\n- > decltype(Simd::lane(l%_\bl_\ba_\bn_\be_\bs< T >(), v[l/_\bl_\ba_\bn_\be_\bs<\n- T >()]))\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, std::\n- size_t l, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > &v) -> decltype\n- (Simd::lane(l%_\bl_\ba_\bn_\be_\bs< T >(), v[l/_\bl_\ba_\bn_\be_\bs< T >()]))\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >, _\bS_\bi_\bm_\bd_\b:_\b:\n- _\bM_\ba_\bs_\bk< _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, AM > > _\bm_\ba_\bs_\bk, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T,\n- S, AD > ifTrue, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, AD > ifFalse)\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 5, std::\n- is_same< bool, _\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br< M > >::value\n- &&_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs< M >()==_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs< _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T,\n- S, A > >()>, M _\bm_\ba_\bs_\bk, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > ifTrue,\n- _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S, A > ifFalse)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< M, S, A > _\bm_\ba_\bs_\bk)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (cos)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (sin)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (tan)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (acos)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (asin)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (atan)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (cosh)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (sinh)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (tanh)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (acosh)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (asinh)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (atanh)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (exp)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log10)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (exp2)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (expm1)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n- (ilogb, int)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log1p)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (log2)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (logb)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (sqrt)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (cbrt)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (erf)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (erfc)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (tgamma)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (lgamma)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (ceil)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (floor)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (trunc)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (round)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n- (lround, long)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n- (llround, long long)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (rint)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n- (lrint, long)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n- (llrint, long long)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (nearbyint)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (fabs)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (abs)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (real)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP (imag)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (max)\n-\u00a0\n- \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (min)\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_\bN_\ba_\bN (const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S,\n- A > &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 3 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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_\bI_\bn_\bf (const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T, S,\n- A > &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 3 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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_\bF_\bi_\bn_\bi_\bt_\be (const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD< T,\n- S, A > &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 3 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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_P\bPR\bRA\bAG\bGM\bMA\bA_\b_O\bOM\bMP\bP_\b_S\bSI\bIM\bMD\bD *\b**\b**\b**\b**\b*\n-#define DUNE_PRAGMA_OMP_SIMD\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_L\bLO\bOO\bOP\bP_\b_A\bAS\bSS\bSI\bIG\bGN\bNM\bME\bEN\bNT\bT_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_LOOP_ASSIGNMENT_OP ( \u00a0 SYMBOL )\n-V\bVa\bal\blu\bue\be:\b:\n-auto operator SYMBOL(const Simd::Scalar s) { \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i &v) { \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \\\n-LoopSIMD out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \\\n-LoopSIMD out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, \\\n-const LoopSIMD &w) { \\\n-LoopSIMD out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, const U s) { \\\n-LoopSIMD out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, \\\n-const LoopSIMD &w) { \\\n-LoopSIMD out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \\\n-Simd::Mask> out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const Simd::Mask s, const LoopSIMD &v) { \\\n-Simd::Mask> out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, \\\n-const LoopSIMD &w) { \\\n-Simd::Mask> out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i>::value> > \\\n-auto expr(const LoopSIMD &v) { \\\n-using std::expr; \\\n-LoopSIMD out; \\\n-for(std::size_t i=0; i>::value> > \\\n-auto expr(const LoopSIMD &v) { \\\n-using std::expr; \\\n-LoopSIMD out; \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, const U s) { \\\n-Simd::Mask> out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \\\n-Simd::Mask> out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto operator SYMBOL(const LoopSIMD &v, \\\n-const LoopSIMD &w) { \\\n-Simd::Mask> out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i out = *this; \\\n-SYMBOL(*this); \\\n-return out; \\\n-} \\\n-static_assert(true, \"expecting ;\")\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_L\bLO\bOO\bOP\bP_\b_P\bPR\bRE\bEF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_LOOP_PREFIX_OP ( \u00a0 SYMBOL )\n-V\bVa\bal\blu\bue\be:\b:\n-auto operator SYMBOL() { \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i \\\n-auto expr(const LoopSIMD &v, const LoopSIMD &w) { \\\n-using std::expr; \\\n-LoopSIMD out; \\\n-for(std::size_t i=0; i \\\n-auto expr(const LoopSIMD &v) { \\\n-using std::expr; \\\n-LoopSIMD out; \\\n-for(std::size_t i=0; i \\\n-auto expr(const LoopSIMD,S,A> &v) { \\\n-using std::expr; \\\n-LoopSIMD out; \\\n-for(std::size_t i=0; i out; \\\n-DUNE_PRAGMA_OMP_SIMD \\\n-for(std::size_t i=0; i\n \n \n \n \n \n \n-dune-common: loop.hh Source File\n+dune-common: dynmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,766 +70,219 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    loop.hh
    \n+
    dynmatrix.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_LOOP_HH
    \n-
    4#define DUNE_COMMON_SIMD_LOOP_HH
    \n-
    5
    \n-
    6#include <array>
    \n-
    7#include <cmath>
    \n-
    8#include <cstddef>
    \n-
    9#include <cstdlib>
    \n-
    10#include <cstdint>
    \n-
    11#include <ostream>
    \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 (C) 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-
    13#include <dune/common/math.hh>
    \n-\n-\n-
    16
    \n-
    17namespace Dune {
    \n+\n+\n+\n+\n+\n
    18
    \n-
    19
    \n-
    20/*
    \n-
    21 * silence warnings from GCC about using integer operands on a bool
    \n-
    22 * (when instantiated for T=bool)
    \n-
    23 */
    \n-
    24#if __GNUC__ >= 7
    \n-
    25# pragma GCC diagnostic push
    \n-
    26# pragma GCC diagnostic ignored "-Wbool-operation"
    \n-
    27# pragma GCC diagnostic ignored "-Wint-in-bool-context"
    \n-
    28# define GCC_WARNING_DISABLED
    \n-
    29#endif
    \n-
    30
    \n-
    31/*
    \n-
    32 * silence warnings from Clang about using bitwise operands on
    \n-
    33 * a bool (when instantiated for T=bool)
    \n-
    34 */
    \n-
    35#ifdef __clang__
    \n-
    36#if __has_warning("-Wbitwise-instead-of-logical")
    \n-
    37# pragma clang diagnostic push
    \n-
    38# pragma clang diagnostic ignored "-Wbitwise-instead-of-logical"
    \n-
    39# define CLANG_WARNING_DISABLED
    \n-
    40#endif
    \n-
    41#endif
    \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/*
    \n-
    44 * Introduce a simd pragma if OpenMP is available in standard version >= 4
    \n-
    45 */
    \n-
    46#if _OPENMP >= 201307
    \n-
    47 #define DUNE_PRAGMA_OMP_SIMD _Pragma("omp simd")
    \n-
    48#else
    \n-
    49 #define DUNE_PRAGMA_OMP_SIMD
    \n-
    50#endif
    \n-
    51
    \n-
    52
    \n-
    64 template<class T, std::size_t S, std::size_t A = 0>
    \n-
    \n-
    65 class alignas(A==0?alignof(T):A) LoopSIMD : public std::array<T,S> {
    \n-
    66
    \n-
    67 public:
    \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 //default constructor
    \n-
    \n-\n-
    71 assert(reinterpret_cast<uintptr_t>(this) % std::min(alignof(LoopSIMD<T,S,A>),alignof(std::max_align_t)) == 0);
    \n-
    72 }
    \n-
    \n-
    73
    \n-
    74 // broadcast constructor initializing the content with a given value
    \n-
    \n-\n-
    76 this->fill(i);
    \n-
    77 }
    \n+
    69 //===== constructors
    \n+\n+
    72
    \n+
    \n+\n+
    75 _data(r, row_type(c, v) )
    \n+
    76 {}
    \n
    \n-
    78
    \n-
    79 template<std::size_t OA>
    \n+
    77
    \n
    \n-
    80 explicit LoopSIMD(const LoopSIMD<T,S,OA>& other)
    \n-
    81 : std::array<T,S>(other)
    \n-
    82 {
    \n-
    83 assert(reinterpret_cast<uintptr_t>(this) % std::min(alignof(LoopSIMD<T,S,A>),alignof(std::max_align_t)) == 0);
    \n-
    84 }
    \n-
    \n-
    85
    \n-
    86 /*
    \n-
    87 * Definition of basic operators
    \n-
    88 */
    \n-
    89
    \n-
    90 //Prefix operators
    \n-
    \n-
    91#define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL) \\
    \n-
    92 auto operator SYMBOL() { \\
    \n-
    93 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    94 for(std::size_t i=0; i<S; i++){ \\
    \n-
    95 SYMBOL(*this)[i]; \\
    \n-
    96 } \\
    \n-
    97 return *this; \\
    \n-
    98 } \\
    \n-
    99 static_assert(true, "expecting ;")
    \n-
    \n-
    100
    \n-\n-\n-
    103#undef DUNE_SIMD_LOOP_PREFIX_OP
    \n-
    104
    \n-
    105 //Unary operators
    \n-
    \n-
    106#define DUNE_SIMD_LOOP_UNARY_OP(SYMBOL) \\
    \n-
    107 auto operator SYMBOL() const { \\
    \n-
    108 LoopSIMD<T,S,A> out; \\
    \n-
    109 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    110 for(std::size_t i=0; i<S; i++){ \\
    \n-
    111 out[i] = SYMBOL((*this)[i]); \\
    \n-
    112 } \\
    \n-
    113 return out; \\
    \n-
    114 } \\
    \n-
    115 static_assert(true, "expecting ;")
    \n-
    \n-
    116
    \n-\n-\n-\n-
    120
    \n-
    \n-
    121 auto operator!() const {
    \n-\n-\n-
    124 for(std::size_t i=0; i<S; i++){
    \n-
    125 out[i] = !((*this)[i]);
    \n-
    126 }
    \n-
    127 return out;
    \n-
    128 }
    \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+
    \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-
    129#undef DUNE_SIMD_LOOP_UNARY_OP
    \n
    130
    \n-
    131 //Postfix operators
    \n-
    \n-
    132#define DUNE_SIMD_LOOP_POSTFIX_OP(SYMBOL) \\
    \n-
    133 auto operator SYMBOL(int){ \\
    \n-
    134 LoopSIMD<T,S,A> out = *this; \\
    \n-
    135 SYMBOL(*this); \\
    \n-
    136 return out; \\
    \n-
    137 } \\
    \n-
    138 static_assert(true, "expecting ;")
    \n-
    \n-
    139
    \n-\n-\n-
    142#undef DUNE_SIMD_LOOP_POSTFIX_OP
    \n-
    143
    \n-
    144 //Assignment operators
    \n-
    \n-
    145#define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL) \\
    \n-
    146 auto operator SYMBOL(const Simd::Scalar<T> s) { \\
    \n-
    147 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    148 for(std::size_t i=0; i<S; i++){ \\
    \n-
    149 (*this)[i] SYMBOL s; \\
    \n-
    150 } \\
    \n-
    151 return *this; \\
    \n-
    152 } \\
    \n-
    153 \\
    \n-
    154 auto operator SYMBOL(const LoopSIMD<T,S,A> &v) { \\
    \n-
    155 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    156 for(std::size_t i=0; i<S; i++){ \\
    \n-
    157 (*this)[i] SYMBOL v[i]; \\
    \n-
    158 } \\
    \n-
    159 return *this; \\
    \n-
    160 } \\
    \n-
    161 static_assert(true, "expecting ;")
    \n-
    \n-
    162
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
    173#undef DUNE_SIMD_LOOP_ASSIGNMENT_OP
    \n-
    174 };
    \n-
    \n-
    175
    \n-
    176 //Arithmetic operators
    \n-
    \n-
    177#define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL) \\
    \n-
    178 template<class T, std::size_t S, std::size_t A> \\
    \n-
    179 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \\
    \n-
    180 LoopSIMD<T,S,A> out; \\
    \n-
    181 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    182 for(std::size_t i=0; i<S; i++){ \\
    \n-
    183 out[i] = v[i] SYMBOL s; \\
    \n-
    184 } \\
    \n-
    185 return out; \\
    \n-
    186 } \\
    \n-
    187 template<class T, std::size_t S, std::size_t A> \\
    \n-
    188 auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n-
    189 LoopSIMD<T,S,A> out; \\
    \n-
    190 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    191 for(std::size_t i=0; i<S; i++){ \\
    \n-
    192 out[i] = s SYMBOL v[i]; \\
    \n-
    193 } \\
    \n-
    194 return out; \\
    \n-
    195 } \\
    \n-
    196 template<class T, std::size_t S, std::size_t A> \\
    \n-
    197 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    198 const LoopSIMD<T,S,A> &w) { \\
    \n-
    199 LoopSIMD<T,S,A> out; \\
    \n-
    200 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    201 for(std::size_t i=0; i<S; i++){ \\
    \n-
    202 out[i] = v[i] SYMBOL w[i]; \\
    \n-
    203 } \\
    \n-
    204 return out; \\
    \n-
    205 } \\
    \n-
    206 static_assert(true, "expecting ;")
    \n-
    \n-
    207
    \n-\n-\n-\n-\n-\n-
    213
    \n-\n-\n-\n-
    217
    \n-
    218#undef DUNE_SIMD_LOOP_BINARY_OP
    \n-
    219
    \n-
    220 //Bitshift operators
    \n-
    \n-
    221#define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL) \\
    \n-
    222 template<class T, std::size_t S, std::size_t A, class U> \\
    \n-
    223 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \\
    \n-
    224 LoopSIMD<T,S,A> out; \\
    \n-
    225 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    226 for(std::size_t i=0; i<S; i++){ \\
    \n-
    227 out[i] = v[i] SYMBOL s; \\
    \n-
    228 } \\
    \n-
    229 return out; \\
    \n-
    230 } \\
    \n-
    231 template<class T, std::size_t S, std::size_t A, class U, std::size_t AU> \\
    \n-
    232 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    233 const LoopSIMD<U,S,AU> &w) { \\
    \n-
    234 LoopSIMD<T,S,A> out; \\
    \n-
    235 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    236 for(std::size_t i=0; i<S; i++){ \\
    \n-
    237 out[i] = v[i] SYMBOL w[i]; \\
    \n-
    238 } \\
    \n-
    239 return out; \\
    \n-
    240 } \\
    \n-
    241 static_assert(true, "expecting ;")
    \n-
    \n-
    242
    \n-\n-\n-
    245
    \n-
    246#undef DUNE_SIMD_LOOP_BITSHIFT_OP
    \n-
    247
    \n-
    248 //Comparison operators
    \n-
    \n-
    249#define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL) \\
    \n-
    250 template<class T, std::size_t S, std::size_t A, class U> \\
    \n-
    251 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \\
    \n-
    252 Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    253 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    254 for(std::size_t i=0; i<S; i++){ \\
    \n-
    255 out[i] = v[i] SYMBOL s; \\
    \n-
    256 } \\
    \n-
    257 return out; \\
    \n-
    258 } \\
    \n-
    259 template<class T, std::size_t S, std::size_t A> \\
    \n-
    260 auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n-
    261 Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    262 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    263 for(std::size_t i=0; i<S; i++){ \\
    \n-
    264 out[i] = s SYMBOL v[i]; \\
    \n-
    265 } \\
    \n-
    266 return out; \\
    \n-
    267 } \\
    \n-
    268 template<class T, std::size_t S, std::size_t A> \\
    \n-
    269 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    270 const LoopSIMD<T,S,A> &w) { \\
    \n-
    271 Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    272 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    273 for(std::size_t i=0; i<S; i++){ \\
    \n-
    274 out[i] = v[i] SYMBOL w[i]; \\
    \n-
    275 } \\
    \n-
    276 return out; \\
    \n-
    277 } \\
    \n-
    278 static_assert(true, "expecting ;")
    \n-
    \n-
    279
    \n-\n-\n-\n-\n-\n-\n-
    286#undef DUNE_SIMD_LOOP_COMPARISON_OP
    \n-
    287
    \n-
    288 //Boolean operators
    \n-
    \n-
    289#define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL) \\
    \n-
    290 template<class T, std::size_t S, std::size_t A> \\
    \n-
    291 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \\
    \n-
    292 Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    293 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    294 for(std::size_t i=0; i<S; i++){ \\
    \n-
    295 out[i] = v[i] SYMBOL s; \\
    \n-
    296 } \\
    \n-
    297 return out; \\
    \n-
    298 } \\
    \n-
    299 template<class T, std::size_t S, std::size_t A> \\
    \n-
    300 auto operator SYMBOL(const Simd::Mask<T> s, const LoopSIMD<T,S,A> &v) { \\
    \n-
    301 Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    302 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    303 for(std::size_t i=0; i<S; i++){ \\
    \n-
    304 out[i] = s SYMBOL v[i]; \\
    \n-
    305 } \\
    \n-
    306 return out; \\
    \n-
    307 } \\
    \n-
    308 template<class T, std::size_t S, std::size_t A> \\
    \n-
    309 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \\
    \n-
    310 const LoopSIMD<T,S,A> &w) { \\
    \n-
    311 Simd::Mask<LoopSIMD<T,S,A>> out; \\
    \n-
    312 DUNE_PRAGMA_OMP_SIMD \\
    \n-
    313 for(std::size_t i=0; i<S; i++){ \\
    \n-
    314 out[i] = v[i] SYMBOL w[i]; \\
    \n-
    315 } \\
    \n-
    316 return out; \\
    \n-
    317 } \\
    \n-
    318 static_assert(true, "expecting ;")
    \n-
    \n-
    319
    \n-
    \n-\n-\n-
    322#undef DUNE_SIMD_LOOP_BOOLEAN_OP
    \n-
    323
    \n-
    324 //prints a given LoopSIMD
    \n-
    325 template<class T, std::size_t S, std::size_t A>
    \n-
    326 std::ostream& operator<< (std::ostream &os, const LoopSIMD<T,S,A> &v) {
    \n-
    327 os << "[";
    \n-
    328 for(std::size_t i=0; i<S-1; i++) {
    \n-
    329 os << v[i] << ", ";
    \n-
    330 }
    \n-
    331 os << v[S-1] << "]";
    \n-
    332 return os;
    \n-
    333 }
    \n-
    \n-
    334
    \n-
    335 namespace Simd {
    \n-
    336 namespace Overloads {
    \n-
    337 /*
    \n-
    338 * Implementation/Overloads of the functions needed for
    \n-
    339 * SIMD-interface-compatibility
    \n-
    340 */
    \n-
    341
    \n-
    342 //Implementation of SIMD-interface-types
    \n-
    343 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-
    344 struct ScalarType<LoopSIMD<T,S,A>> {
    \n-\n-
    346 };
    \n-
    \n-
    347
    \n-
    348 template<class U, class T, std::size_t S, std::size_t A>
    \n-
    \n-
    349 struct RebindType<U, LoopSIMD<T,S,A>> {
    \n-\n-
    351 };
    \n-
    \n-
    352
    \n-
    353 //Implementation of SIMD-interface-functionality
    \n-
    354 template<class T, std::size_t S, std::size_t A>
    \n-
    355 struct LaneCount<LoopSIMD<T,S,A>> : index_constant<S*lanes<T>()> {};
    \n-
    356
    \n-
    357 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-
    358 auto lane(ADLTag<5>, std::size_t l, LoopSIMD<T,S,A> &&v)
    \n-
    359 -> decltype(std::move(Simd::lane(l%lanes<T>(), v[l/lanes<T>()])))
    \n-
    360 {
    \n-
    361 return std::move(Simd::lane(l%lanes<T>(), v[l/lanes<T>()]));
    \n-
    362 }
    \n-
    \n-
    363
    \n-
    364 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-
    365 auto lane(ADLTag<5>, std::size_t l, const LoopSIMD<T,S,A> &v)
    \n-
    366 -> decltype(Simd::lane(l%lanes<T>(), v[l/lanes<T>()]))
    \n-
    367 {
    \n-
    368 return Simd::lane(l%lanes<T>(), v[l/lanes<T>()]);
    \n-
    369 }
    \n-
    \n-
    370
    \n-
    371 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-
    372 auto lane(ADLTag<5>, std::size_t l, LoopSIMD<T,S,A> &v)
    \n-
    373 -> decltype(Simd::lane(l%lanes<T>(), v[l/lanes<T>()]))
    \n-
    374 {
    \n-
    375 return Simd::lane(l%lanes<T>(), v[l/lanes<T>()]);
    \n-
    376 }
    \n-
    \n-
    377
    \n-
    378 template<class T, std::size_t S, std::size_t AM, std::size_t AD>
    \n-
    \n-\n-
    380 LoopSIMD<T,S,AD> ifTrue, LoopSIMD<T,S,AD> ifFalse) {
    \n-\n-
    382 for(std::size_t i=0; i<S; i++) {
    \n-
    383 out[i] = Simd::cond(mask[i], ifTrue[i], ifFalse[i]);
    \n-
    384 }
    \n-
    385 return out;
    \n-
    386 }
    \n-
    \n-
    387
    \n-
    388 template<class M, class T, std::size_t S, std::size_t A>
    \n-
    \n-
    389 auto cond(ADLTag<5, std::is_same<bool, Simd::Scalar<M> >::value
    \n-
    390 && Simd::lanes<M>() == Simd::lanes<LoopSIMD<T,S,A> >()>,
    \n-
    391 M mask, LoopSIMD<T,S,A> ifTrue, LoopSIMD<T,S,A> ifFalse)
    \n-
    392 {
    \n-
    393 LoopSIMD<T,S,A> out;
    \n-
    394 for(auto l : range(Simd::lanes(mask)))
    \n-
    395 Simd::lane(l, out) = Simd::lane(l, mask) ? Simd::lane(l, ifTrue) : Simd::lane(l, ifFalse);
    \n-
    396 return out;
    \n-
    397 }
    \n-
    \n-
    398
    \n-
    399 template<class M, std::size_t S, std::size_t A>
    \n-
    \n-\n-
    401 bool out = false;
    \n-
    402 for(std::size_t i=0; i<S; i++) {
    \n-
    403 out |= Simd::anyTrue(mask[i]);
    \n-
    404 }
    \n-
    405 return out;
    \n-
    406 }
    \n-
    \n-
    407
    \n-
    408 template<class M, std::size_t S, std::size_t A>
    \n-
    \n-\n-
    410 bool out = true;
    \n-
    411 for(std::size_t i=0; i<S; i++) {
    \n-
    412 out &= Simd::allTrue(mask[i]);
    \n-
    413 }
    \n-
    414 return out;
    \n-
    415 }
    \n-
    \n-
    416
    \n-
    417 template<class M, std::size_t S, std::size_t A>
    \n-
    \n-\n-
    419 bool out = false;
    \n-
    420 for(std::size_t i=0; i<S; i++) {
    \n-
    421 out |= Simd::anyFalse(mask[i]);
    \n-
    422 }
    \n-
    423 return out;
    \n-
    424 }
    \n-
    \n-
    425
    \n-
    426 template<class M, std::size_t S, std::size_t A>
    \n-
    \n-\n-
    428 bool out = true;
    \n-
    429 for(std::size_t i=0; i<S; i++) {
    \n-
    430 out &= Simd::allFalse(mask[i]);
    \n-
    431 }
    \n-
    432 return out;
    \n-
    433 }
    \n-
    \n-
    434 } //namespace Overloads
    \n-
    435
    \n-
    436 } //namespace Simd
    \n-
    437
    \n-
    438
    \n-
    439 /*
    \n-
    440 * Overloads the unary cmath-operations. Operations requiring
    \n-
    441 * or returning more than one argument are not supported.
    \n-
    442 * Due to inconsistency with the return values, cmath-operations
    \n-
    443 * on integral types are also not supported-
    \n-
    444 */
    \n-
    445
    \n-
    \n-
    446#define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr) \\
    \n-
    447 template<class T, std::size_t S, std::size_t A, typename Sfinae = \\
    \n-
    448 typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \\
    \n-
    449 auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n-
    450 using std::expr; \\
    \n-
    451 LoopSIMD<T,S,A> out; \\
    \n-
    452 for(std::size_t i=0; i<S; i++) { \\
    \n-
    453 out[i] = expr(v[i]); \\
    \n-
    454 } \\
    \n-
    455 return out; \\
    \n-
    456 } \\
    \n-
    457 static_assert(true, "expecting ;")
    \n-
    \n-
    458
    \n-
    \n-
    459#define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType) \\
    \n-
    460 template<class T, std::size_t S, std::size_t A, typename Sfinae = \\
    \n-
    461 typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \\
    \n-
    462 auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n-
    463 using std::expr; \\
    \n-
    464 LoopSIMD<returnType,S> out; \\
    \n-
    465 for(std::size_t i=0; i<S; i++) { \\
    \n-
    466 out[i] = expr(v[i]); \\
    \n-
    467 } \\
    \n-
    468 return out; \\
    \n-
    469 } \\
    \n-
    470 static_assert(true, "expecting ;")
    \n-
    \n-
    471
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
    484
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
    494
    \n-\n-\n-
    497
    \n-\n-\n-\n-\n-
    502
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
    513
    \n-\n-\n-
    516
    \n-
    517#undef DUNE_SIMD_LOOP_CMATH_UNARY_OP
    \n-
    518#undef DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN
    \n-
    519
    \n-
    520
    \n-
    521 /* not implemented cmath-functions:
    \n-
    522 * atan2
    \n-
    523 * frexp, idexp
    \n-
    524 * modf
    \n-
    525 * scalbn, scalbln
    \n-
    526 * pow
    \n-
    527 * hypot
    \n-
    528 * remainder, remquo
    \n-
    529 * copysign
    \n-
    530 * nan
    \n-
    531 * nextafter, nexttoward
    \n-
    532 * fdim, fmax, fmin
    \n-
    533 */
    \n-
    534
    \n-
    535 /*
    \n-
    536 * Overloads specific functions usually provided by the std library
    \n-
    537 * More overloads will be provided should the need arise.
    \n-
    538 */
    \n-
    539
    \n-
    \n-
    540#define DUNE_SIMD_LOOP_STD_UNARY_OP(expr) \\
    \n-
    541 template<class T, std::size_t S, std::size_t A> \\
    \n-
    542 auto expr(const LoopSIMD<T,S,A> &v) { \\
    \n-
    543 using std::expr; \\
    \n-
    544 LoopSIMD<T,S,A> out; \\
    \n-
    545 for(std::size_t i=0; i<S; i++) { \\
    \n-
    546 out[i] = expr(v[i]); \\
    \n-
    547 } \\
    \n-
    548 return out; \\
    \n-
    549 } \\
    \n-
    550 \\
    \n-
    551 template<class T, std::size_t S, std::size_t A> \\
    \n-
    552 auto expr(const LoopSIMD<std::complex<T>,S,A> &v) { \\
    \n-
    553 using std::expr; \\
    \n-
    554 LoopSIMD<T,S,A> out; \\
    \n-
    555 for(std::size_t i=0; i<S; i++) { \\
    \n-
    556 out[i] = expr(v[i]); \\
    \n-
    557 } \\
    \n-
    558 return out; \\
    \n-
    559 } \\
    \n-
    560 static_assert(true, "expecting ;")
    \n-
    \n-
    561
    \n-\n-\n-
    564
    \n-
    565#undef DUNE_SIMD_LOOP_STD_UNARY_OP
    \n-
    566
    \n-
    \n-
    567#define DUNE_SIMD_LOOP_STD_BINARY_OP(expr) \\
    \n-
    568 template<class T, std::size_t S, std::size_t A> \\
    \n-
    569 auto expr(const LoopSIMD<T,S,A> &v, const LoopSIMD<T,S,A> &w) { \\
    \n-
    570 using std::expr; \\
    \n-
    571 LoopSIMD<T,S,A> out; \\
    \n-
    572 for(std::size_t i=0; i<S; i++) { \\
    \n-
    573 out[i] = expr(v[i],w[i]); \\
    \n-
    574 } \\
    \n-
    575 return out; \\
    \n-
    576 } \\
    \n-
    577 static_assert(true, "expecting ;")
    \n-
    \n-
    578
    \n-\n-\n-
    581
    \n-
    582#undef DUNE_SIMD_LOOP_STD_BINARY_OP
    \n-
    583
    \n-
    584 namespace MathOverloads {
    \n-
    585 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-\n-\n-
    588 for(auto l : range(S))
    \n-
    589 out[l] = Dune::isNaN(v[l]);
    \n-
    590 return out;
    \n-
    591 }
    \n-
    \n-
    592
    \n-
    593 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-\n-\n-
    596 for(auto l : range(S))
    \n-
    597 out[l] = Dune::isInf(v[l]);
    \n-
    598 return out;
    \n-
    599 }
    \n-
    \n-
    600
    \n-
    601 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-\n-\n-
    604 for(auto l : range(S))
    \n-
    605 out[l] = Dune::isFinite(v[l]);
    \n-
    606 return out;
    \n-
    607 }
    \n-
    \n-
    608 } //namespace MathOverloads
    \n-
    609
    \n-
    610 template<class T, std::size_t S, std::size_t A>
    \n-
    \n-
    611 struct IsNumber<LoopSIMD<T,S,A>> :
    \n-
    612 public std::integral_constant<bool, IsNumber<T>::value>{
    \n-
    613 };
    \n-
    \n-
    614
    \n-
    615#ifdef CLANG_WARNING_DISABLED
    \n-
    616# pragma clang diagnostic pop
    \n-
    617# undef CLANG_WARNING_DISABLED
    \n-
    618#endif
    \n-
    619
    \n-
    620#ifdef GCC_WARNING_DISABLED
    \n-
    621# pragma GCC diagnostic pop
    \n-
    622# undef GCC_WARNING_DISABLED
    \n-
    623#endif
    \n-
    624
    \n-
    625} //namespace Dune
    \n-
    626
    \n-
    627#endif
    \n-
    Some useful basic math stuff.
    \n-
    #define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL)
    Definition loop.hh:177
    \n-
    #define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL)
    Definition loop.hh:289
    \n-
    #define DUNE_SIMD_LOOP_STD_BINARY_OP(expr)
    Definition loop.hh:567
    \n-
    #define DUNE_SIMD_LOOP_STD_UNARY_OP(expr)
    Definition loop.hh:540
    \n-
    #define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL)
    Definition loop.hh:221
    \n-
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr)
    Definition loop.hh:446
    \n-
    #define DUNE_PRAGMA_OMP_SIMD
    Definition loop.hh:49
    \n-
    #define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType)
    Definition loop.hh:459
    \n-
    #define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL)
    Definition loop.hh:145
    \n-
    Traits for type conversions and type information.
    \n-
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:30
    \n-
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \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-
    bool anyFalse(const Mask &mask)
    Whether any entry is false
    Definition simd/interface.hh:449
    \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-
    Rebind< bool, V > Mask
    Mask type type of some SIMD type.
    Definition simd/interface.hh:289
    \n-
    bool allFalse(const Mask &mask)
    Whether all entries are false
    Definition simd/interface.hh:459
    \n-
    typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
    Element type of some SIMD type.
    Definition simd/interface.hh:235
    \n-
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n-
    bool allFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::allFalse()
    Definition defaults.hh:124
    \n-
    bool allTrue(ADLTag< 0 >, const Mask &mask)
    implements Simd::allTrue()
    Definition defaults.hh:104
    \n-
    bool anyFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::anyFalse()
    Definition defaults.hh:114
    \n-
    STL namespace.
    \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+
    Traits for type conversions and type information.
    \n+
    Macro for wrapping boundary checks.
    \n+
    Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
    \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-
    DUNE_SIMD_LOOP_COMPARISON_OP(<)
    \n-
    bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
    Definition debugalign.hh:543
    \n-
    const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
    Definition debugalign.hh:535
    \n-
    T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
    Definition debugalign.hh:520
    \n-
    bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:604
    \n-
    bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:594
    \n-
    auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:584
    \n-
    Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
    Definition typetraits.hh:194
    \n-
    Tag to make sure the functions in this namespace can be found by ADL.
    Definition math.hh:230
    \n-
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n-
    should have a member type type
    Definition standard.hh:60
    \n-
    should have a member type type
    Definition standard.hh:67
    \n-
    should be derived from a Dune::index_constant
    Definition standard.hh:74
    \n-
    Definition loop.hh:65
    \n-
    LoopSIMD(Simd::Scalar< T > i)
    Definition loop.hh:75
    \n-
    DUNE_SIMD_LOOP_PREFIX_OP(++)
    \n-
    auto operator!() const
    Definition loop.hh:121
    \n-
    DUNE_SIMD_LOOP_POSTFIX_OP(--)
    \n-
    DUNE_SIMD_LOOP_ASSIGNMENT_OP * DUNE_SIMD_LOOP_ASSIGNMENT_OP(/=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(%=
    \n-
    DUNE_SIMD_LOOP_ASSIGNMENT_OP & DUNE_SIMD_LOOP_ASSIGNMENT_OP(|=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(^=
    \n-
    DUNE_SIMD_LOOP_UNARY_OP(-)
    \n-
    DUNE_SIMD_LOOP_PREFIX_OP(--)
    \n-
    DUNE_SIMD_LOOP_POSTFIX_OP(++)
    \n-
    DUNE_SIMD_LOOP_ASSIGNMENT_OP(-=)
    \n-
    LoopSIMD(const LoopSIMD< T, S, OA > &other)
    Definition loop.hh:80
    \n-
    LoopSIMD()
    Definition loop.hh:70
    \n-
    DUNE_SIMD_LOOP_UNARY_OP(~)
    \n-
    DUNE_SIMD_LOOP_ASSIGNMENT_OP(+=)
    \n-
    DUNE_SIMD_LOOP_UNARY_OP(+)
    \n-
    DUNE_SIMD_LOOP_ASSIGNMENT_OP(<<=)
    \n-
    DUNE_SIMD_LOOP_ASSIGNMENT_OP(> >=)
    \n-
    Simd::Scalar< T > type
    Definition loop.hh:345
    \n-
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \n-
    Include file for users of the SIMD abstraction layer.
    \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": "encoding", "source2": "encoding", "unified_diff": "@@ -1 +1 @@\n-us-ascii\n+utf-8\n"}, {"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,821 +1,280 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-loop.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// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_LOOP_HH\n-4#define DUNE_COMMON_SIMD_LOOP_HH\n-5\n-6#include \n-7#include \n-8#include \n-9#include \n-10#include \n-11#include \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/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n-14#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-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+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-19\n-20/*\n-21 * silence warnings from GCC about using integer operands on a bool\n-22 * (when instantiated for T=bool)\n-23 */\n-24#if __GNUC__ >= 7\n-25# pragma GCC diagnostic push\n-26# pragma GCC diagnostic ignored \"-Wbool-operation\"\n-27# pragma GCC diagnostic ignored \"-Wint-in-bool-context\"\n-28# define GCC_WARNING_DISABLED\n-29#endif\n-30\n-31/*\n-32 * silence warnings from Clang about using bitwise operands on\n-33 * a bool (when instantiated for T=bool)\n-34 */\n-35#ifdef __clang__\n-36#if __has_warning(\"-Wbitwise-instead-of-logical\")\n-37# pragma clang diagnostic push\n-38# pragma clang diagnostic ignored \"-Wbitwise-instead-of-logical\"\n-39# define CLANG_WARNING_DISABLED\n-40#endif\n-41#endif\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 42\n-43/*\n-44 * Introduce a simd pragma if OpenMP is available in standard version >= 4\n-45 */\n-46#if _OPENMP >= 201307\n-47 #define DUNE_PRAGMA_OMP_SIMD _Pragma(\"omp simd\")\n-48#else\n-_\b4_\b9 #define DUNE_PRAGMA_OMP_SIMD\n-50#endif\n-51\n-52\n-64 template\n-_\b6_\b5 class alignas(A==0?alignof(T):A) _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD : public std::array {\n-66\n-67 public:\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 //default constructor\n-_\b7_\b0 _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD() {\n-71 assert(reinterpret_cast(this) % std::min(alignof\n-(_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b>),alignof(std::max_align_t)) == 0);\n-72 }\n-73\n-74 // broadcast constructor initializing the content with a given value\n-_\b7_\b5 _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD(_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bT_\b> i) : _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD() {\n-76 this->fill(i);\n-77 }\n-78\n-79 template\n-_\b8_\b0 explicit _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD(const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bO_\bA_\b>& other)\n-81 : _\bs_\bt_\bd::array(other)\n-82 {\n-83 assert(reinterpret_cast(this) % std::min(alignof\n-(_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b>),alignof(std::max_align_t)) == 0);\n-84 }\n-85\n-86 /*\n-87 * Definition of basic operators\n-88 */\n-89\n-90 //Prefix operators\n-_\b9_\b1#define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL) \\\n-92 auto operator SYMBOL() { \\\n-93 DUNE_PRAGMA_OMP_SIMD \\\n-94 for(std::size_t i=0; i out; \\\n-109 DUNE_PRAGMA_OMP_SIMD \\\n-110 for(std::size_t i=0; i> out;\n-123 _\bD_\bU_\bN_\bE_\b__\bP_\bR_\bA_\bG_\bM_\bA_\b__\bO_\bM_\bP_\b__\bS_\bI_\bM_\bD\n-124 for(std::size_t i=0; i> 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-131 //Postfix operators\n-_\b1_\b3_\b2#define DUNE_SIMD_LOOP_POSTFIX_OP(SYMBOL) \\\n-133 auto operator SYMBOL(int){ \\\n-134 LoopSIMD out = *this; \\\n-135 SYMBOL(*this); \\\n-136 return out; \\\n-137 } \\\n-138 static_assert(true, \"expecting ;\")\n-139\n-_\b1_\b4_\b0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(++);\n-_\b1_\b4_\b1 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(--);\n-142#undef DUNE_SIMD_LOOP_POSTFIX_OP\n-143\n-144 //Assignment operators\n-_\b1_\b4_\b5#define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL) \\\n-146 auto operator SYMBOL(const Simd::Scalar s) { \\\n-147 DUNE_PRAGMA_OMP_SIMD \\\n-148 for(std::size_t i=0; i &v) { \\\n-155 DUNE_PRAGMA_OMP_SIMD \\\n-156 for(std::size_t i=0; i>=);\n-_\b1_\b7_\b0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP(&=);\n-171 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP(|=);\n-172 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP(^=);\n-173#undef DUNE_SIMD_LOOP_ASSIGNMENT_OP\n-174 };\n-175\n-176 //Arithmetic operators\n-_\b1_\b7_\b7#define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL) \\\n-178 template \\\n-179 auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \\\n-180 LoopSIMD out; \\\n-181 DUNE_PRAGMA_OMP_SIMD \\\n-182 for(std::size_t i=0; i \\\n-188 auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \\\n-189 LoopSIMD out; \\\n-190 DUNE_PRAGMA_OMP_SIMD \\\n-191 for(std::size_t i=0; i \\\n-197 auto operator SYMBOL(const LoopSIMD &v, \\\n-198 const LoopSIMD &w) { \\\n-199 LoopSIMD out; \\\n-200 DUNE_PRAGMA_OMP_SIMD \\\n-201 for(std::size_t i=0; i \\\n-223 auto operator SYMBOL(const LoopSIMD &v, const U s) { \\\n-224 LoopSIMD out; \\\n-225 DUNE_PRAGMA_OMP_SIMD \\\n-226 for(std::size_t i=0; i \\\n-232 auto operator SYMBOL(const LoopSIMD &v, \\\n-233 const LoopSIMD &w) { \\\n-234 LoopSIMD out; \\\n-235 DUNE_PRAGMA_OMP_SIMD \\\n-236 for(std::size_t i=0; i>);\n-245\n-246#undef DUNE_SIMD_LOOP_BITSHIFT_OP\n-247\n-248 //Comparison operators\n-_\b2_\b4_\b9#define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL) \\\n-250 template \\\n-251 auto operator SYMBOL(const LoopSIMD &v, const U s) { \\\n-252 Simd::Mask> out; \\\n-253 DUNE_PRAGMA_OMP_SIMD \\\n-254 for(std::size_t i=0; i \\\n-260 auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \\\n-261 Simd::Mask> out; \\\n-262 DUNE_PRAGMA_OMP_SIMD \\\n-263 for(std::size_t i=0; i \\\n-269 auto operator SYMBOL(const LoopSIMD &v, \\\n-270 const LoopSIMD &w) { \\\n-271 Simd::Mask> out; \\\n-272 DUNE_PRAGMA_OMP_SIMD \\\n-273 for(std::size_t i=0; i);\n-_\b2_\b8_\b2 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP(<=);\n-_\b2_\b8_\b3 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP(>=);\n-284 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP(==);\n-_\b2_\b8_\b5 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP(!=);\n-286#undef DUNE_SIMD_LOOP_COMPARISON_OP\n-287\n-288 //Boolean operators\n-_\b2_\b8_\b9#define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL) \\\n-290 template \\\n-291 auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \\\n-292 Simd::Mask> out; \\\n-293 DUNE_PRAGMA_OMP_SIMD \\\n-294 for(std::size_t i=0; i \\\n-300 auto operator SYMBOL(const Simd::Mask s, const LoopSIMD &v) { \\\n-301 Simd::Mask> out; \\\n-302 DUNE_PRAGMA_OMP_SIMD \\\n-303 for(std::size_t i=0; i \\\n-309 auto operator SYMBOL(const LoopSIMD &v, \\\n-310 const LoopSIMD &w) { \\\n-311 Simd::Mask> out; \\\n-312 DUNE_PRAGMA_OMP_SIMD \\\n-313 for(std::size_t i=0; i\n-326 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream &os, const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> &v) {\n-327 os << \"[\";\n-328 for(std::size_t i=0; i\n-_\b3_\b4_\b4 struct _\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD> {\n-_\b3_\b4_\b5 using _\bt_\by_\bp_\be = _\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bT_\b>;\n-346 };\n-347\n-348 template\n-_\b3_\b4_\b9 struct _\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be> {\n-_\b3_\b5_\b0 using _\bt_\by_\bp_\be = _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bS_\bi_\bm_\bd_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\b<_\bU_\b,_\b _\bT_\b>,S,A>;\n-351 };\n-352\n-353 //Implementation of SIMD-interface-functionality\n-354 template\n-_\b3_\b5_\b5 struct _\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD> : _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt()> {};\n-356\n-357 template\n-_\b3_\b5_\b8 auto _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, std::size_t l, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> &&v)\n-359 -> decltype(std::move(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l%lanes(), v[l/lanes()])))\n-360 {\n-361 return std::move(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l%lanes(), v[l/lanes()]));\n-362 }\n-363\n-364 template\n-_\b3_\b6_\b5 auto _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, std::size_t l, const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> &v)\n-366 -> decltype(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l%lanes(), v[l/lanes()]))\n-367 {\n-368 return _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l%lanes(), v[l/lanes()]);\n-369 }\n-370\n-371 template\n-_\b3_\b7_\b2 auto _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, std::size_t l, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> &v)\n-373 -> decltype(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l%lanes(), v[l/lanes()]))\n-374 {\n-375 return _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l%lanes(), v[l/lanes()]);\n-376 }\n-377\n-378 template\n-_\b3_\b7_\b9 auto _\bc_\bo_\bn_\bd(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, _\bS_\bi_\bm_\bd_\b:_\b:_\bM_\ba_\bs_\bk<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\bM_\b>> _\bm_\ba_\bs_\bk,\n-380 _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\bD_\b> ifTrue, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\bD_\b> ifFalse) {\n-381 _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\bD_\b> out;\n-382 for(std::size_t i=0; i\n-_\b3_\b8_\b9 auto _\bc_\bo_\bn_\bd(_\bA_\bD_\bL_\bT_\ba_\bg<5, std::is_same >::value\n-390 && Simd::lanes() == _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> >()>,\n-391 M _\bm_\ba_\bs_\bk, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> ifTrue, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> ifFalse)\n-392 {\n-393 _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> out;\n-394 for(auto l : _\br_\ba_\bn_\bg_\be(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(_\bm_\ba_\bs_\bk)))\n-395 _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, out) = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, _\bm_\ba_\bs_\bk) ? _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, ifTrue) : _\bS_\bi_\bm_\bd_\b:_\b:\n-_\bl_\ba_\bn_\be(l, ifFalse);\n-396 return out;\n-397 }\n-398\n-399 template\n-_\b4_\b0_\b0 bool _\ba_\bn_\by_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bM_\b,_\bS_\b,_\bA_\b> _\bm_\ba_\bs_\bk) {\n-401 bool out = false;\n-402 for(std::size_t i=0; i\n-_\b4_\b0_\b9 bool _\ba_\bl_\bl_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bM_\b,_\bS_\b,_\bA_\b> _\bm_\ba_\bs_\bk) {\n-410 bool out = true;\n-411 for(std::size_t i=0; i\n-_\b4_\b1_\b8 bool _\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bM_\b,_\bS_\b,_\bA_\b> _\bm_\ba_\bs_\bk) {\n-419 bool out = false;\n-420 for(std::size_t i=0; i\n-_\b4_\b2_\b7 bool _\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bM_\b,_\bS_\b,_\bA_\b> _\bm_\ba_\bs_\bk) {\n-428 bool out = true;\n-429 for(std::size_t i=0; i>::value> > \\\n-449 auto expr(const LoopSIMD &v) { \\\n-450 using std::expr; \\\n-451 LoopSIMD out; \\\n-452 for(std::size_t i=0; i>::value> > \\\n-462 auto expr(const LoopSIMD &v) { \\\n-463 using std::expr; \\\n-464 LoopSIMD out; \\\n-465 for(std::size_t i=0; i \\\n-542 auto expr(const LoopSIMD &v) { \\\n-543 using std::expr; \\\n-544 LoopSIMD out; \\\n-545 for(std::size_t i=0; i \\\n-552 auto expr(const LoopSIMD,S,A> &v) { \\\n-553 using std::expr; \\\n-554 LoopSIMD out; \\\n-555 for(std::size_t i=0; i \\\n-569 auto expr(const LoopSIMD &v, const LoopSIMD &w) { \\\n-570 using std::expr; \\\n-571 LoopSIMD out; \\\n-572 for(std::size_t i=0; i\n-_\b5_\b8_\b6 auto _\bi_\bs_\bN_\ba_\bN(const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b3_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-587 _\bS_\bi_\bm_\bd_\b:_\b:_\bM_\ba_\bs_\bk_\b<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b>> out;\n-588 for(auto l : _\br_\ba_\bn_\bg_\be(S))\n-589 out[l] = Dune::isNaN(v[l]);\n-590 return out;\n-591 }\n-592\n-593 template\n-_\b5_\b9_\b4 auto _\bi_\bs_\bI_\bn_\bf(const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b3_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-595 _\bS_\bi_\bm_\bd_\b:_\b:_\bM_\ba_\bs_\bk_\b<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b>> out;\n-596 for(auto l : _\br_\ba_\bn_\bg_\be(S))\n-597 out[l] = Dune::isInf(v[l]);\n-598 return out;\n-599 }\n-600\n-601 template\n-_\b6_\b0_\b2 auto _\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be(const _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b> &v, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b3_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n-603 _\bS_\bi_\bm_\bd_\b:_\b:_\bM_\ba_\bs_\bk_\b<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bT_\b,_\bS_\b,_\bA_\b>> out;\n-604 for(auto l : _\br_\ba_\bn_\bg_\be(S))\n-605 out[l] = Dune::isFinite(v[l]);\n-606 return out;\n-607 }\n-608 } //namespace MathOverloads\n-609\n-610 template\n-_\b6_\b1_\b1 struct _\bI_\bs_\bN_\bu_\bm_\bb_\be_\br<_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD> :\n-612 public std::integral_constant::value>{\n-613 };\n-614\n-615#ifdef CLANG_WARNING_DISABLED\n-616# pragma clang diagnostic pop\n-617# undef CLANG_WARNING_DISABLED\n-618#endif\n-619\n-620#ifdef GCC_WARNING_DISABLED\n-621# pragma GCC diagnostic pop\n-622# undef GCC_WARNING_DISABLED\n-623#endif\n-624\n-625} //namespace Dune\n-626\n-627#endif\n-_\bm_\ba_\bt_\bh_\b._\bh_\bh\n-Some useful basic math stuff.\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP\n-#define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:177\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bO_\bO_\bL_\bE_\bA_\bN_\b__\bO_\bP\n-#define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:289\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP\n-#define DUNE_SIMD_LOOP_STD_BINARY_OP(expr)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:567\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bS_\bT_\bD_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP\n-#define DUNE_SIMD_LOOP_STD_UNARY_OP(expr)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:540\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bB_\bI_\bT_\bS_\bH_\bI_\bF_\bT_\b__\bO_\bP\n-#define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:221\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP\n-#define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:446\n-_\bD_\bU_\bN_\bE_\b__\bP_\bR_\bA_\bG_\bM_\bA_\b__\bO_\bM_\bP_\b__\bS_\bI_\bM_\bD\n-#define DUNE_PRAGMA_OMP_SIMD\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:49\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bM_\bA_\bT_\bH_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP_\b__\bW_\bI_\bT_\bH_\b__\bR_\bE_\bT_\bU_\bR_\bN\n-#define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:459\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP\n-#define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:145\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 _\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:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n-std::integral_constant< std::size_t, i > index_constant\n-An index constant with value i.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:30\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:300\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:_\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:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n-bool anyFalse(const Mask &mask)\n-Whether any entry is false\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:449\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:_\bM_\ba_\bs_\bk\n-Rebind< bool, V > Mask\n-Mask type type of some SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n-bool allFalse(const Mask &mask)\n-Whether all entries are false\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:459\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br\n-typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n-Element type of some SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\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-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n-bool allFalse(ADLTag< 0 >, const Mask &mask)\n-implements Simd::allFalse()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be\n-bool allTrue(ADLTag< 0 >, const Mask &mask)\n-implements Simd::allTrue()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n-bool anyFalse(ADLTag< 0 >, const Mask &mask)\n-implements Simd::anyFalse()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:114\n-_\bs_\bt_\bd\n-STL namespace.\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_\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+_\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_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bC_\bO_\bM_\bP_\bA_\bR_\bI_\bS_\bO_\bN_\b__\bO_\bP\n-DUNE_SIMD_LOOP_COMPARISON_OP(<)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n-bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:543\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd\n-const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align\n-> mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align\n-> &ifFalse)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:535\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be\n-T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:520\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-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_\bI_\bn_\bf\n-bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:594\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-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:584\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:_\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n-Tag used to force late-binding lookup in Dune::Simd::Overloads.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt\n-should be derived from a Dune::index_constant\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD\n-LoopSIMD(Simd::Scalar< T > i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP\n-DUNE_SIMD_LOOP_PREFIX_OP(++)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!\n-auto operator!() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP\n-DUNE_SIMD_LOOP_POSTFIX_OP(--)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP\n-DUNE_SIMD_LOOP_ASSIGNMENT_OP * DUNE_SIMD_LOOP_ASSIGNMENT_OP(/\n-=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(%=\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP\n-DUNE_SIMD_LOOP_ASSIGNMENT_OP & DUNE_SIMD_LOOP_ASSIGNMENT_OP\n-(|=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(^=\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP\n-DUNE_SIMD_LOOP_UNARY_OP(-)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP\n-DUNE_SIMD_LOOP_PREFIX_OP(--)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP\n-DUNE_SIMD_LOOP_POSTFIX_OP(++)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP\n-DUNE_SIMD_LOOP_ASSIGNMENT_OP(-=)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD\n-LoopSIMD(const LoopSIMD< T, S, OA > &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD\n-LoopSIMD()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP\n-DUNE_SIMD_LOOP_UNARY_OP(~)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP\n-DUNE_SIMD_LOOP_ASSIGNMENT_OP(+=)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bU_\bN_\bA_\bR_\bY_\b__\bO_\bP\n-DUNE_SIMD_LOOP_UNARY_OP(+)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP\n-DUNE_SIMD_LOOP_ASSIGNMENT_OP(<<=)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bL_\bO_\bO_\bP_\b__\bA_\bS_\bS_\bI_\bG_\bN_\bM_\bE_\bN_\bT_\b__\bO_\bP\n-DUNE_SIMD_LOOP_ASSIGNMENT_OP(> >=)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b<_\b _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\b _\bT_\b,_\b _\bS_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-Simd::Scalar< T > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:345\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-_\bs_\bi_\bm_\bd_\b._\bh_\bh\n-Include file for users of the SIMD abstraction layer.\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/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: simd.hh File Reference\n+dune-common: shared_ptr.hh File Reference\n \n \n \n \n \n \n \n@@ -72,94 +72,56 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    simd.hh File Reference
    \n+
    shared_ptr.hh File Reference
    \n
    \n
    \n \n-

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

    This file implements several utilities related to std::shared_ptr. \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+
    #include <memory>
    \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 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 >
    struct  Dune::null_deleter< T >
     implements the Deleter concept of shared_ptr without deleting anything 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-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+\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)
     
    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-

    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+

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

    \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,79 +1,40 @@\n dune-common\u00a02.9.0\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-#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+_\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+#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/_\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-\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+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 \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+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 \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+ 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 \u00a0\n template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bw_\ba_\bp (T &v1, T &v2, bool mask)\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 \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+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/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: simd.hh Source File\n+dune-common: shared_ptr.hh Source File\n \n \n \n \n \n \n \n@@ -74,518 +74,72 @@\n \n
    \n \n
    \n
    \n
    \n-
    simd.hh
    \n+
    shared_ptr.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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+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 (C) 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#warning dune/common/simd.hh is deprecated.
    \n-
    7#warning Use the new infrastructure from dune/common/simd/simd.h instead.
    \n+
    6#ifndef DUNE_SHARED_PTR_HH
    \n+
    7#define DUNE_SHARED_PTR_HH
    \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+
    9#include <memory>
    \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-
    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-
    Utilities for reduction like operations on ranges.
    \n-
    Compatibility header for including <Vc/Vc>
    \n-\n-\n-
    Traits for type conversions and type information.
    \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+
    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
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    bool any_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:493
    \n-
    bool all_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:499
    \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:481
    \n-
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:487
    \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:115
    \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+
    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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,549 +1,74 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-simd.hh\n+shared_ptr.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 (C) 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 (C) 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+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\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+6#ifndef DUNE_SHARED_PTR_HH\n+7#define DUNE_SHARED_PTR_HH\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+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-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-_\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-_\bv_\bc_\b._\bh_\bh\n-Compatibility header for including \n-_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh\n-_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl_\b._\bh_\bh\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+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 _\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:493\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:499\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:481\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:487\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:115\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+_\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 ===============================================================================\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: test.hh File Reference\n+dune-common: propertymap.hh File Reference\n \n \n \n \n \n \n \n@@ -65,496 +65,84 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n-
    test.hh File Reference
    \n+Functions
    \n+
    propertymap.hh File Reference
    \n
    \n
    \n-\n-

    Common tests for simd abstraction implementations. \n-More...

    \n-
    #include <algorithm>
    \n-#include <cstddef>
    \n-#include <iostream>
    \n-#include <sstream>
    \n-#include <string>
    \n+
    #include <cstddef>
    \n+#include <iterator>
    \n #include <type_traits>
    \n-#include <typeindex>
    \n-#include <typeinfo>
    \n-#include <unordered_set>
    \n-#include <utility>
    \n-#include <dune/common/classname.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/rangeutilities.hh>
    \n-#include <dune/common/simd/io.hh>
    \n-#include <dune/common/simd/loop.hh>
    \n-#include <dune/common/simd/simd.hh>
    \n-#include <dune/common/std/type_traits.hh>
    \n-#include <dune/common/typelist.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 Classes

    struct  Dune::Simd::EndMark
     final element marker for RebindList 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::Simd::UnitTest
    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::Simd
     Namespace for vectorization interface functions used by library developers.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-Macros

    #define DUNE_SIMD_CHECK(expr)    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
     
    #define DUNE_SIMD_CHECK_OP(expr)
     
    #define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_OPNAME   (className<Op(V)>())
     
    #define DUNE_SIMD_INFIX_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL)
     
    #define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL)
     
    #define DUNE_SIMD_OPNAME   (className<OpInfixComma(T1, T2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, V2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
     
    #define DUNE_SIMD_OPNAME   (className<Op(V1, P2)>())
     
    #define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n

    \n-Typedefs

    template<class... Types>
    using Dune::Simd::RebindList = typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type
     A list of types with the final element removed.
     
    template<class T >
    using Dune::Simd::IsLoop = typename Impl::IsLoop< T >::type
     check whether a type is an instance of LoopSIMD
     

    \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-

    Detailed Description

    \n-

    Common tests for simd abstraction implementations.

    \n-

    This file is an interface header and may be included without restrictions.

    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_SIMD_ASSIGN_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_ASSIGN_OP( NAME,
     SYMBOL 
    )
    \n-
    \n-Value:
    struct OpInfix##NAME \\
    \n-
    { \\
    \n-
    template<class V1, class V2> \\
    \n-
    decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n-
    { \\
    \n-
    return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n-
    } \\
    \n-
    template<class S1, class S2> \\
    \n-
    auto scalar(S1& s1, S2&& s2) const \\
    \n-
    -> decltype(s1 SYMBOL std::forward<S2>(s2)); \\
    \n-
    }
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_CHECK

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_CHECK( expr)    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_CHECK_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_CHECK_OP( expr)
    \n-
    \n-Value:
    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\
    \n-\n-
    #define DUNE_SIMD_OPNAME
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_DO

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_DO( M1,
     M2,
     M3,
     V1,
     V2,
     V3,
     NAME 
    )
    \n-
    \n-Value:
    checker(bool_constant<isMask ? do_##M1 : do_##V1>{}, \\
    \n-
    bool_constant<isMask ? do_##M2 : do_##V2>{}, \\
    \n-
    bool_constant<isMask ? do_##M3 : do_##V3>{}, \\
    \n-
    Op##NAME{})
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_INFIX_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_INFIX_OP( NAME,
     SYMBOL 
    )
    \n-
    \n-Value:
    struct OpInfix##NAME \\
    \n-
    { \\
    \n-
    template<class V1, class V2> \\
    \n-
    decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n-
    { \\
    \n-
    return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n-
    } \\
    \n-
    template<class S1, class S2> \\
    \n-
    auto scalar(S1&& s1, S2&& s2) const \\
    \n-
    -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \n-
    }
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_OPNAME [1/6]

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_SIMD_OPNAME   (className<Op(V)>())
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_OPNAME [2/6]

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_SIMD_OPNAME   (className<OpInfixComma(T1, T2)>())
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_OPNAME [3/6]

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_SIMD_OPNAME   (className<Op(V1, V2)>())
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_OPNAME [4/6]

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_OPNAME [5/6]

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_OPNAME [6/6]

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DUNE_SIMD_OPNAME   (className<Op(V1, P2)>())
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_POSTFIX_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_POSTFIX_OP( NAME,
     SYMBOL 
    )
    \n-
    \n-Value:
    struct OpPostfix##NAME \\
    \n-
    { \\
    \n-
    template<class V> \\
    \n-
    auto operator()(V&& v) const \\
    \n-
    -> decltype(std::forward<V>(v) SYMBOL) \\
    \n-
    { \\
    \n-
    return std::forward<V>(v) SYMBOL; \\
    \n-
    } \\
    \n-
    }
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_PREFIX_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_PREFIX_OP( NAME,
     SYMBOL 
    )
    \n-
    \n-Value:
    struct OpPrefix##NAME \\
    \n-
    { \\
    \n-
    template<class V> \\
    \n-
    auto operator()(V&& v) const \\
    \n-
    -> decltype(SYMBOL std::forward<V>(v)) \\
    \n-
    { \\
    \n-
    return SYMBOL std::forward<V>(v); \\
    \n-
    } \\
    \n-
    }
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_SIMD_REPL_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_SIMD_REPL_OP( NAME,
     REPLFN,
     SYMBOL 
    )
    \n-
    \n-Value:
    struct OpInfix##NAME \\
    \n-
    { \\
    \n-
    template<class V1, class V2> \\
    \n-
    decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n-
    { \\
    \n-
    return Simd::REPLFN(std::forward<V1>(v1), std::forward<V2>(v2)); \\
    \n-
    } \\
    \n-
    template<class S1, class S2> \\
    \n-
    auto scalar(S1&& s1, S2&& s2) const \\
    \n-
    -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \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,203 +1,65 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n-test.hh File Reference\n-Common tests for simd abstraction implementations. _\bM_\bo_\br_\be_\b._\b._\b.\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+propertymap.hh File Reference\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/_\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/_\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/_\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_\bi_\bm_\bd_\b/_\bi_\bo_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bl_\bo_\bo_\bp_\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/_\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/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bE_\bn_\bd_\bM_\ba_\br_\bk\n-\u00a0 final element marker for RebindList _\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- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt\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_\bi_\bm_\bd\n-\u00a0 Namespace for vectorization interface functions used by library\n- developers.\n-\u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(expr)\u00a0\u00a0\u00a0 ((expr) ? void() : complain(__FILE__,\n- __LINE__, __func__, #expr))\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(expr)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(NAME, SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP(NAME, SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(NAME, SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(NAME, SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP(NAME, REPLFN, SYMBOL)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\u00a0\u00a0\u00a0(className())\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(M1, M2, M3, V1, V2, V3, NAME)\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_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bL_\bi_\bs_\bt = typename Impl::RemoveEnd< _\bE_\bn_\bd_\bM_\ba_\br_\bk, _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt<\n- Types... > >::type\n-\u00a0 A list of types with the final element removed.\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bI_\bs_\bL_\bo_\bo_\bp = typename Impl::IsLoop< T >::type\n-\u00a0 check whether a type is an instance of _\bL_\bo_\bo_\bp_\bS_\bI_\bM_\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-Common tests for simd abstraction implementations.\n-This file is an interface header and may be included without restrictions.\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_S\bSI\bIM\bMD\bD_\b_A\bAS\bSS\bSI\bIG\bGN\bN_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_ASSIGN_OP ( \u00a0 NAME,\n- \u00a0 SYMBOL\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-struct OpInfix##NAME \\\n-{ \\\n-template \\\n-decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n-{ \\\n-return std::forward(v1) SYMBOL std::forward(v2); \\\n-} \\\n-template \\\n-auto scalar(S1& s1, S2&& s2) const \\\n--> decltype(s1 SYMBOL std::forward(s2)); \\\n-}\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_C\bCH\bHE\bEC\bCK\bK *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_CHECK ( \u00a0 expr ) \u00a0\u00a0\u00a0 ((expr) ? void() : complain(__FILE__,\n- __LINE__, __func__, #expr))\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_C\bCH\bHE\bEC\bCK\bK_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_CHECK_OP ( \u00a0 expr )\n-V\bVa\bal\blu\bue\be:\b:\n-((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE, #expr))\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bO_\bP_\bN_\bA_\bM_\bE\n-#define DUNE_SIMD_OPNAME\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_D\bDO\bO *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_DO ( \u00a0 M1,\n- \u00a0 M2,\n- \u00a0 M3,\n- \u00a0 V1,\n- \u00a0 V2,\n- \u00a0 V3,\n- \u00a0 NAME\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-checker(bool_constant{}, \\\n-bool_constant{}, \\\n-bool_constant{}, \\\n-Op##NAME{})\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_I\bIN\bNF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_INFIX_OP ( \u00a0 NAME,\n- \u00a0 SYMBOL\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-struct OpInfix##NAME \\\n-{ \\\n-template \\\n-decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n-{ \\\n-return std::forward(v1) SYMBOL std::forward(v2); \\\n-} \\\n-template \\\n-auto scalar(S1&& s1, S2&& s2) const \\\n--> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n-}\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[1\b1/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[2\b2/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[3\b3/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[4\b4/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[5\b5/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_O\bOP\bPN\bNA\bAM\bME\bE [\b[6\b6/\b/6\b6]\b] *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_OPNAME\u00a0\u00a0\u00a0(className())\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_P\bPO\bOS\bST\bTF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_POSTFIX_OP ( \u00a0 NAME,\n- \u00a0 SYMBOL\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-struct OpPostfix##NAME \\\n-{ \\\n-template \\\n-auto operator()(V&& v) const \\\n--> decltype(std::forward(v) SYMBOL) \\\n-{ \\\n-return std::forward(v) SYMBOL; \\\n-} \\\n-}\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_P\bPR\bRE\bEF\bFI\bIX\bX_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_PREFIX_OP ( \u00a0 NAME,\n- \u00a0 SYMBOL\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-struct OpPrefix##NAME \\\n-{ \\\n-template \\\n-auto operator()(V&& v) const \\\n--> decltype(SYMBOL std::forward(v)) \\\n-{ \\\n-return SYMBOL std::forward(v); \\\n-} \\\n-}\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_S\bSI\bIM\bMD\bD_\b_R\bRE\bEP\bPL\bL_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_SIMD_REPL_OP ( \u00a0 NAME,\n- \u00a0 REPLFN,\n- \u00a0 SYMBOL\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-struct OpInfix##NAME \\\n-{ \\\n-template \\\n-decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n-{ \\\n-return Simd::REPLFN(std::forward(v1), std::forward(v2)); \\\n-} \\\n-template \\\n-auto scalar(S1&& s1, S2&& s2) const \\\n--> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n-}\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/a00149_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: test.hh Source File\n+dune-common: propertymap.hh Source File\n \n \n \n \n \n \n \n@@ -70,2026 +70,311 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    test.hh
    \n+
    propertymap.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_TEST_HH
    \n-
    4#define DUNE_COMMON_SIMD_TEST_HH
    \n-
    5
    \n-
    12#include <algorithm>
    \n-
    13#include <cstddef>
    \n-
    14#include <iostream>
    \n-
    15#include <sstream>
    \n-
    16#include <string>
    \n-
    17#include <type_traits>
    \n-
    18#include <typeindex>
    \n-
    19#include <typeinfo>
    \n-
    20#include <unordered_set>
    \n-
    21#include <utility>
    \n-
    22
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
    32
    \n-
    33namespace Dune {
    \n-
    34 namespace Simd {
    \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 (C) 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_PROPERTYMAP_HH
    \n+
    6#define DUNE_PROPERTYMAP_HH
    \n+
    7
    \n+
    8#include <cstddef>
    \n+
    9#include <iterator>
    \n+
    10#include <type_traits>
    \n+
    11
    \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-
    36 namespace Impl {
    \n-
    37
    \n-
    38 template<class T, class SFINAE = void>
    \n-
    39 struct LessThenComparable : std::false_type {};
    \n-
    40 template<class T>
    \n-
    41 struct LessThenComparable<T, std::void_t<decltype(std::declval<T>()
    \n-
    42 < std::declval<T>())> > :
    \n-
    43 std::true_type
    \n-
    44 {};
    \n-
    45
    \n-
    46 template<class Dst, class Src>
    \n-
    47 struct CopyConstHelper
    \n-
    48 {
    \n-
    49 using type = Dst;
    \n-
    50 };
    \n-
    51 template<class Dst, class Src>
    \n-
    52 struct CopyConstHelper<Dst, const Src>
    \n-
    53 {
    \n-
    54 using type = std::add_const_t<Dst>;
    \n-
    55 };
    \n-
    56
    \n-
    57 template<class Dst, class Src>
    \n-
    58 struct CopyVolatileHelper
    \n-
    59 {
    \n-
    60 using type = Dst;
    \n-
    61 };
    \n-
    62 template<class Dst, class Src>
    \n-
    63 struct CopyVolatileHelper<Dst, volatile Src>
    \n-
    64 {
    \n-
    65 using type = std::add_volatile_t<Dst>;
    \n-
    66 };
    \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 template<class Dst, class Src>
    \n-
    69 struct CopyReferenceHelper
    \n-
    70 {
    \n-
    71 using type = Dst;
    \n-
    72 };
    \n-
    73 template<class Dst, class Src>
    \n-
    74 struct CopyReferenceHelper<Dst, Src&>
    \n-
    75 {
    \n-
    76 using type = std::add_lvalue_reference_t<Dst>;
    \n-
    77 };
    \n-
    78
    \n-
    79 template<class Dst, class Src>
    \n-
    80 struct CopyReferenceHelper<Dst, Src&&>
    \n-
    81 {
    \n-
    82 using type = std::add_rvalue_reference_t<Dst>;
    \n-
    83 };
    \n-
    84
    \n-
    85 template<class Dst, class Src>
    \n-
    86 using CopyRefQual = typename CopyReferenceHelper<
    \n-
    87 typename CopyVolatileHelper<
    \n-
    88 typename CopyConstHelper<
    \n-
    89 std::decay_t<Dst>,
    \n-
    90 std::remove_reference_t<Src>
    \n-
    91 >::type,
    \n-
    92 std::remove_reference_t<Src>
    \n-
    93 >::type,
    \n-
    94 Src
    \n-
    95 >::type;
    \n-
    96
    \n-
    97 template<class Mark, class Types,
    \n-
    98 class Indices =
    \n-
    99 std::make_index_sequence<TypeListSize<Types>::value - 1> >
    \n-
    100 struct RemoveEnd;
    \n-
    101 template<class Mark, class Types, std::size_t... I>
    \n-
    102 struct RemoveEnd<Mark, Types, std::index_sequence<I...>>
    \n-
    103 {
    \n-
    104 using Back = TypeListEntry_t<TypeListSize<Types>::value - 1, Types>;
    \n-
    105 static_assert(std::is_same<Mark, Back>::value,
    \n-
    106 "TypeList not terminated by proper EndMark");
    \n-
    107 using type = TypeList<TypeListEntry_t<I, Types>...>;
    \n-
    108 };
    \n-
    109
    \n-
    110 template<class T, class List, class = void>
    \n-
    111 struct TypeInList;
    \n-
    112
    \n-
    113 template<class T>
    \n-
    114 struct TypeInList<T, TypeList<> > : std::false_type {};
    \n-
    115
    \n-
    116 template<class T, class... Rest>
    \n-
    117 struct TypeInList<T, TypeList<T, Rest...> > : std::true_type {};
    \n-
    118
    \n-
    119 template<class T, class Head, class... Rest>
    \n-
    120 struct TypeInList<T, TypeList<Head, Rest...>,
    \n-
    121 std::enable_if_t<!std::is_same<T, Head>::value> > :
    \n-
    122 TypeInList<T, TypeList<Rest...> >::type
    \n-
    123 {};
    \n-
    124
    \n-
    125 template<class T>
    \n-
    126 struct IsLoop : std::false_type {};
    \n-
    127 template<class T, std::size_t S>
    \n-
    128 struct IsLoop<LoopSIMD<T, S> > : std::true_type {};
    \n-
    129
    \n-
    130 // used inside static_assert to trick the compiler into printing a list
    \n-
    131 // of types:
    \n-
    132 //
    \n-
    133 // static_assert(debugTypes<V>(Std::bool_constant<condition>{}), "msg");
    \n-
    134 //
    \n-
    135 // Should include what the type `V` expands to in the error message.
    \n-
    136 template<class...>
    \n-
    137 constexpr bool debugTypes(std::true_type) { return true; }
    \n-
    138 template<class... Types>
    \n-
    139 [[deprecated]]
    \n-
    140 constexpr bool debugTypes(std::false_type) { return false; }
    \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-
    142 } // namespace Impl
    \n-
    143
    \n-
    145 struct EndMark {};
    \n-
    147
    \n-
    156 template<class... Types>
    \n-\n-
    158 typename Impl::RemoveEnd<EndMark, TypeList<Types...> >::type;
    \n-
    159
    \n-
    161 template<class T>
    \n-
    162 using IsLoop = typename Impl::IsLoop<T>::type;
    \n-
    163
    \n-
    \n-
    164 class UnitTest {
    \n-
    165 bool good_ = true;
    \n-
    166 std::ostream &log_ = std::cerr;
    \n-
    167 // records the types for which checks have started running to avoid
    \n-
    168 // infinite recursion
    \n-
    169 std::unordered_set<std::type_index> seen_;
    \n-
    170
    \n-
    172 //
    \n-
    173 // Helper functions
    \n-
    174 //
    \n-
    175
    \n-
    176 void complain(const char *file, int line, const char *func,
    \n-
    177 const char *expr);
    \n-
    178
    \n-
    179 void complain(const char *file, int line, const char *func,
    \n-
    180 const std::string &opname, const char *expr);
    \n-
    181
    \n-
    182 // This macro is defined only within this file, do not use anywhere
    \n-
    183 // else. Doing the actual printing in an external function dramatically
    \n-
    184 // reduces memory use during compilation. Defined in such a way that
    \n-
    185 // the call will only happen for failed checks.
    \n-
    \n-
    186#define DUNE_SIMD_CHECK(expr) \\
    \n-
    187 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
    \n-
    \n-
    188
    \n-
    189 // the function using this macro must define a way to compute the
    \n-
    190 // operator name in DUNE_SIMD_OPNAME
    \n-
    \n-
    191#define DUNE_SIMD_CHECK_OP(expr) \\
    \n-
    192 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\
    \n-
    193 DUNE_SIMD_OPNAME, #expr))
    \n-
    \n-
    194
    \n-
    195 // "cast" into a prvalue
    \n-
    196 template<class T>
    \n-
    197 static std::decay_t<T> prvalue(T &&t)
    \n-
    198 {
    \n-
    199 return std::forward<T>(t);
    \n-
    200 }
    \n-
    201
    \n-
    202 // whether the vector is 42 in all lanes
    \n-
    203 template<class V>
    \n-
    204 static bool is42(const V &v)
    \n-
    205 {
    \n-
    206 bool good = true;
    \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-
    208 for(std::size_t l = 0; l < lanes(v); ++l)
    \n-
    209 // need to cast in case we have a mask type
    \n-
    210 good &= (lane(l, v) == Scalar<V>(42));
    \n-
    211
    \n-
    212 return good;
    \n-
    213 }
    \n-
    214
    \n-
    215 // make a vector that contains the sequence { 1, 2, ... }
    \n-
    216 template<class V>
    \n-
    217 static V make123()
    \n-
    218 {
    \n-
    219 // initialize to avoid undefined behaviour if assigning to lane()
    \n-
    220 // involves lvalue-to-rvalue conversions, e.g. due to bitmask
    \n-
    221 // operations. Avoid using broadcast<V>() for initialization to avoid
    \n-
    222 // test interdependencies.
    \n-
    223 V vec(Scalar<V>(0));
    \n-
    224 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n-
    225 lane(l, vec) = l + 1;
    \n-
    226 return vec;
    \n-
    227 }
    \n-
    228
    \n-
    229 // whether the vector contains the sequence { 1, 2, ... }
    \n-
    230 template<class V>
    \n-
    231 static bool is123(const V &v)
    \n-
    232 {
    \n-
    233 bool good = true;
    \n-
    234
    \n-
    235 for(std::size_t l = 0; l < lanes(v); ++l)
    \n-
    236 // need to cast in case we have a mask type
    \n-
    237 good &= (lane(l, v) == Scalar<V>(l+1));
    \n-
    238
    \n-
    239 return good;
    \n-
    240 }
    \n-
    241
    \n-
    242 template<class V>
    \n-
    243 static V leftVector()
    \n-
    244 {
    \n-
    245 // Avoid using broadcast<V>() for initialization to avoid test
    \n-
    246 // interdependencies.
    \n-
    247 V res(Scalar<V>(0));
    \n-
    248 for(std::size_t l = 0; l < lanes(res); ++l)
    \n-
    249 lane(l, res) = Scalar<V>(l+1);
    \n-
    250 return res;
    \n-
    251 }
    \n-
    252
    \n-
    253 template<class V>
    \n-
    254 static V rightVector()
    \n-
    255 {
    \n-
    256 // Avoid using broadcast<V>() for initialization to avoid test
    \n-
    257 // interdependencies.
    \n-
    258 V res(Scalar<V>(0));
    \n-
    259 for(std::size_t l = 0; l < lanes(res); ++l)
    \n-
    260 // do not exceed number of bits in char (for shifts)
    \n-
    261 // avoid 0 (for / and %)
    \n-
    262 lane(l, res) = Scalar<V>((l)%7+1);
    \n-
    263 return res;
    \n-
    264 }
    \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-
    266 template<class T>
    \n-
    267 static T leftScalar()
    \n-
    268 {
    \n-
    269 return T(42);
    \n-
    270 }
    \n-
    271
    \n-
    272 template<class T>
    \n-
    273 static T rightScalar()
    \n-
    274 {
    \n-
    275 // do not exceed number of bits in char (for shifts)
    \n-
    276 // avoid 0 (for / and %)
    \n-
    277 return T(5);
    \n-
    278 }
    \n-
    279
    \n-
    280 template<class Dst, class Src>
    \n-
    281 using CopyRefQual = Impl::CopyRefQual<Dst, Src>;
    \n-
    282
    \n-
    283 // test whether the Op supports the operation on scalars. We do not use
    \n-
    284 // `lane()` to obtain the scalars, because that might return a proxy
    \n-
    285 // object, and we are interested in what exactly the scalar type can do,
    \n-
    286 // no a proxy that might have more overloads than needed. In addition,
    \n-
    287 // `lane()` may not preserve `const` and reference qualifiers.
    \n-
    288 template<class Op, class... Vectors>
    \n-
    289 using ScalarResult =
    \n-
    290 decltype(std::declval<Op>().
    \n-
    291 scalar(std::declval<CopyRefQual<Scalar<Vectors>,
    \n-
    292 Vectors> >()...));
    \n-
    293
    \n-
    295 //
    \n-
    296 // Check associated types
    \n-
    297 //
    \n-
    298
    \n-
    299 template<class V>
    \n-
    300 void checkScalar()
    \n-
    301 {
    \n-
    302 // check that the type Scalar<V> exists
    \n-
    303 using T = Scalar<V>;
    \n-
    304
    \n-
    305 static_assert(std::is_same<T, std::decay_t<T> >::value, "Scalar types "
    \n-
    306 "must not be references, and must not include "
    \n-
    307 "cv-qualifiers");
    \n-
    308 [[maybe_unused]] T a{};
    \n-
    309 }
    \n-
    310
    \n-
    311 template<class V>
    \n-
    312 [[deprecated("Warning: please include bool in the Rebinds for "
    \n-
    313 "simd type V, as Masks are not checked otherwise.")]]
    \n-
    314 void warnMissingMaskRebind(std::true_type) {}
    \n-
    315 template<class V>
    \n-
    316 void warnMissingMaskRebind(std::false_type) {}
    \n-
    317
    \n-
    318 template<class V, class Rebinds, template<class> class RebindPrune,
    \n-
    319 template<class> class RebindAccept, class Recurse>
    \n-
    320 void checkRebindOf(Recurse recurse)
    \n-
    321 {
    \n-
    322 Hybrid::forEach(Rebinds{}, [this,recurse](auto target) {
    \n-
    323 using T = typename decltype(target)::type;
    \n-
    324
    \n-
    325 // check that the rebound type exists
    \n-
    326 using W = Rebind<T, V>;
    \n-
    327 log_ << "Type " << className<V>() << " rebound to "
    \n-
    328 << className<T>() << " is " << className<W>() << std::endl;
    \n-
    329
    \n-
    330 static_assert(std::is_same<W, std::decay_t<W> >::value, "Rebound "
    \n-
    331 "types must not be references, and must not include "
    \n-
    332 "cv-qualifiers");
    \n-
    333 static_assert(lanes<V>() == lanes<W>(), "Rebound types must have "
    \n-
    334 "the same number of lanes as the original vector "
    \n-
    335 "types");
    \n-
    336 static_assert(std::is_same<T, Scalar<W> >::value, "Rebound types "
    \n-
    337 "must have the bound-to scalar type");
    \n-
    338
    \n-
    339 if constexpr (RebindPrune<W>{}) {
    \n-
    340 log_ << "Pruning check of Simd type " << className<W>()
    \n-
    341 << std::endl;
    \n-
    342 }
    \n-
    343 else {
    \n-
    344 using Impl::debugTypes;
    \n-
    345 static_assert(debugTypes<T, V, W>(RebindAccept<W>{}),
    \n-
    346 "Rebind<T, V> is W, but that is not accepted "
    \n-
    347 "by RebindAccept");
    \n-
    348 recurse(MetaType<W>{});
    \n-
    349 }
    \n-
    350 });
    \n-
    351
    \n-
    352 static_assert(std::is_same<Rebind<Scalar<V>, V>, V>::value, "A type "
    \n-
    353 "rebound to its own scalar type must be the same type "
    \n-
    354 "as the original type");
    \n-
    355 static_assert(std::is_same<Rebind<bool, V>, Mask<V> >::value, "A type "
    \n-
    356 "rebound to bool must be the mask type for that type");
    \n-
    357
    \n-
    358 constexpr bool hasBool = Impl::TypeInList<bool, Rebinds>::value;
    \n-
    359 warnMissingMaskRebind<V>(Std::bool_constant<!hasBool>{});
    \n-
    360 }
    \n-
    361
    \n-
    363 //
    \n-
    364 // Fundamental checks
    \n-
    365 //
    \n-
    366
    \n-
    367 template<class V>
    \n-
    368 void checkLanes()
    \n-
    369 {
    \n-
    370 // check lanes
    \n-
    371 static_assert(std::is_same<std::size_t, decltype(lanes<V>())>::value,
    \n-
    372 "return type of lanes<V>() should be std::size_t");
    \n-
    373 static_assert(std::is_same<std::size_t, decltype(lanes(V{}))>::value,
    \n-
    374 "return type of lanes(V{}) should be std::size_t");
    \n-
    375
    \n-
    376 // the result of lanes<V>() must be constexpr
    \n-
    377 [[maybe_unused]] constexpr auto size = lanes<V>();
    \n-
    378 // but the result of lanes(vec) does not need to be constexpr
    \n-
    379 DUNE_SIMD_CHECK(lanes<V>() == lanes(V{}));
    \n-
    380 }
    \n-
    381
    \n-
    382 template<class V>
    \n-
    383 void checkDefaultConstruct()
    \n-
    384 {
    \n-
    385 { [[maybe_unused]] V vec; }
    \n-
    386 { [[maybe_unused]] V vec{}; }
    \n-
    387 { [[maybe_unused]] V vec = {}; }
    \n-
    388 }
    \n-
    389
    \n-
    390 template<class V>
    \n-
    391 void checkLane()
    \n-
    392 {
    \n-
    393 // Avoid using broadcast<V>() for initialization to avoid test
    \n-
    394 // interdependencies.
    \n-
    395 V vec(Scalar<V>(0));
    \n-
    396 // check lane() on mutable lvalues
    \n-
    397 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n-
    398 lane(l, vec) = l + 1;
    \n-
    399 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n-
    400 DUNE_SIMD_CHECK(lane(l, vec) == Scalar<V>(l + 1));
    \n-
    401 using MLRes = decltype(lane(0, vec));
    \n-
    402 static_assert(std::is_same<MLRes, Scalar<V>&>::value ||
    \n-
    403 std::is_same<MLRes, std::decay_t<MLRes> >::value,
    \n-
    404 "Result of lane() on a mutable lvalue vector must "
    \n-
    405 "either be a mutable reference to a scalar of that "
    \n-
    406 "vector or a proxy object (which itself may not be a "
    \n-
    407 "reference nor const).");
    \n-
    408
    \n-
    409 // check lane() on const lvalues
    \n-
    410 const V &vec2 = vec;
    \n-
    411 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n-
    412 DUNE_SIMD_CHECK(lane(l, vec2) == Scalar<V>(l + 1));
    \n-
    413 using CLRes = decltype(lane(0, vec2));
    \n-
    414 static_assert(std::is_same<CLRes, const Scalar<V>&>::value ||
    \n-
    415 std::is_same<CLRes, std::decay_t<CLRes> >::value,
    \n-
    416 "Result of lane() on a const lvalue vector must "
    \n-
    417 "either be a const lvalue reference to a scalar of that "
    \n-
    418 "vector or a proxy object (which itself may not be a "
    \n-
    419 "reference nor const).");
    \n-
    420 static_assert(!std::is_assignable<CLRes, Scalar<V> >::value,
    \n-
    421 "Result of lane() on a const lvalue vector must not be "
    \n-
    422 "assignable from a scalar.");
    \n-
    423
    \n-
    424 // check lane() on rvalues
    \n-
    425 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n-
    426 DUNE_SIMD_CHECK(lane(l, prvalue(vec)) == Scalar<V>(l + 1));
    \n-
    427 using RRes = decltype(lane(0, prvalue(vec)));
    \n-
    428 // TODO: do we really want to allow Scalar<V>&& here? If we allow it,
    \n-
    429 // then `auto &&res = lane(0, vec*vec);` creates a dangling reference,
    \n-
    430 // and the scalar (and even the vector types) are small enough to be
    \n-
    431 // passed in registers anyway. On the other hand, the only comparable
    \n-
    432 // accessor function in the standard library that I can think of is
    \n-
    433 // std::get(), and that does return an rvalue reference in this
    \n-
    434 // situation. However, that cannot assume anything about the size of
    \n-
    435 // the returned types.
    \n-
    436 static_assert(std::is_same<RRes, Scalar<V> >::value ||
    \n-
    437 std::is_same<RRes, Scalar<V>&&>::value,
    \n-
    438 "Result of lane() on a rvalue vector V must be "
    \n-
    439 "Scalar<V> or Scalar<V>&&.");
    \n-
    440 // Can't assert non-assignable, fails for any typical class,
    \n-
    441 // e.g. std::complex<>. Would need to return const Scalar<V> or const
    \n-
    442 // Scalar<V>&&, which would inhibit moving from the return value.
    \n-
    443 // static_assert(!std::is_assignable<RRes, Scalar<V> >::value,
    \n-
    444 // "Result of lane() on a rvalue vector must not be "
    \n-
    445 // "assignable from a scalar.");
    \n-
    446 }
    \n-
    447
    \n-
    448 // check non-default constructors
    \n-
    449 template<class V>
    \n-
    450 void checkCopyMoveConstruct()
    \n-
    451 {
    \n-
    452 // elided copy/move constructors
    \n-
    453 { V vec (make123<V>()); DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    454 { V vec = make123<V>() ; DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    455 { V vec {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    456 { V vec = {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    457
    \n-
    458 // copy constructors
    \n-
    459 { V ref(make123<V>()); V vec (ref);
    \n-
    460 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n-
    461 { V ref(make123<V>()); V vec = ref ;
    \n-
    462 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n-
    463 { V ref(make123<V>()); V vec {ref};
    \n-
    464 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n-
    465 { V ref(make123<V>()); V vec = {ref};
    \n-
    466 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n-
    467 { const V ref(make123<V>()); V vec (ref);
    \n-
    468 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    469 { const V ref(make123<V>()); V vec = ref ;
    \n-
    470 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    471 { const V ref(make123<V>()); V vec {ref};
    \n-
    472 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    473 { const V ref(make123<V>()); V vec = {ref};
    \n-
    474 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    475
    \n-
    476 // move constructors
    \n-
    477 { V ref(make123<V>()); V vec (std::move(ref));
    \n-
    478 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    479 { V ref(make123<V>()); V vec = std::move(ref) ;
    \n-
    480 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    481 { V ref(make123<V>()); V vec {std::move(ref)};
    \n-
    482 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    483 { V ref(make123<V>()); V vec = {std::move(ref)};
    \n-
    484 DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    485 }
    \n-
    486
    \n-
    487 template<class V>
    \n-
    488 void checkBroadcastVectorConstruct()
    \n-
    489 {
    \n-
    490 // broadcast copy constructors
    \n-
    491 { Scalar<V> ref = 42; V vec (ref);
    \n-
    492 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    493 { Scalar<V> ref = 42; V vec = ref ;
    \n-
    494 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    495 // { Scalar<V> ref = 42; V vec {ref};
    \n-
    496 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    497 // { Scalar<V> ref = 42; V vec = {ref};
    \n-
    498 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    499 { const Scalar<V> ref = 42; V vec (ref);
    \n-
    500 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    501 { const Scalar<V> ref = 42; V vec = ref ;
    \n-
    502 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    503 // { const Scalar<V> ref = 42; V vec {ref};
    \n-
    504 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    505 // { const Scalar<V> ref = 42; V vec = {ref};
    \n-
    506 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    507
    \n-
    508 // broadcast move constructors
    \n-
    509 { Scalar<V> ref = 42; V vec (std::move(ref));
    \n-
    510 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    511 { Scalar<V> ref = 42; V vec = std::move(ref) ;
    \n-
    512 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    513 // { Scalar<V> ref = 42; V vec {std::move(ref)};
    \n-
    514 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    515 // { Scalar<V> ref = 42; V vec = {std::move(ref)};
    \n-
    516 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    517 }
    \n-
    518
    \n-
    519 template<class V>
    \n-
    520 void checkBroadcastMaskConstruct()
    \n-
    521 {
    \n-
    522 // broadcast copy constructors
    \n-
    523 { Scalar<V> ref = 42; V vec (ref);
    \n-
    524 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    525 // { Scalar<V> ref = 42; V vec = ref ;
    \n-
    526 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    527 { Scalar<V> ref = 42; V vec {ref};
    \n-
    528 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    529 // { Scalar<V> ref = 42; V vec = {ref};
    \n-
    530 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    531 { const Scalar<V> ref = 42; V vec (ref);
    \n-
    532 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    533 // { const Scalar<V> ref = 42; V vec = ref ;
    \n-
    534 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    535 { const Scalar<V> ref = 42; V vec {ref};
    \n-
    536 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    537 // { const Scalar<V> ref = 42; V vec = {ref};
    \n-
    538 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    539
    \n-
    540 // broadcast move constructors
    \n-
    541 { Scalar<V> ref = 42; V vec (std::move(ref));
    \n-
    542 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    543 // { Scalar<V> ref = 42; V vec = std::move(ref) ;
    \n-
    544 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    545 { Scalar<V> ref = 42; V vec {std::move(ref)};
    \n-
    546 DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    547 // { Scalar<V> ref = 42; V vec = {std::move(ref)};
    \n-
    548 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    549 }
    \n-
    550
    \n-
    551 // check the implCast function
    \n-
    552 template<class FromV, class ToV>
    \n-
    553 void checkImplCast()
    \n-
    554 {
    \n-
    555 { // lvalue arg
    \n-
    556 FromV fromVec = make123<FromV>();
    \n-
    557 auto toVec = implCast<ToV>(fromVec);
    \n-
    558 static_assert(std::is_same<decltype(toVec), ToV>::value,
    \n-
    559 "Unexpected result type for implCast<ToV>(FromV&)");
    \n-
    560 DUNE_SIMD_CHECK(is123(fromVec));
    \n-
    561 DUNE_SIMD_CHECK(is123(toVec));
    \n-
    562 }
    \n-
    563
    \n-
    564 { // const lvalue arg
    \n-
    565 const FromV fromVec = make123<FromV>();
    \n-
    566 auto toVec = implCast<ToV>(fromVec);
    \n-
    567 static_assert(std::is_same<decltype(toVec), ToV>::value,
    \n-
    568 "Unexpected result type for implCast<ToV>(const "
    \n-
    569 "FromV&)");
    \n-
    570 DUNE_SIMD_CHECK(is123(toVec));
    \n-
    571 }
    \n-
    572
    \n-
    573 { // rvalue arg
    \n-
    574 auto toVec = implCast<ToV>(make123<FromV>());
    \n-
    575 static_assert(std::is_same<decltype(toVec), ToV>::value,
    \n-
    576 "Unexpected result type for implCast<ToV>(FromV&&)");
    \n-
    577 DUNE_SIMD_CHECK(is123(toVec));
    \n-
    578 }
    \n-
    579 }
    \n-
    580
    \n-
    581 // check the implCast function
    \n-
    582 template<class V>
    \n-
    583 void checkImplCast()
    \n-
    584 {
    \n-
    585 // check against LoopSIMD
    \n-
    586 using LoopV = Dune::LoopSIMD<Scalar<V>, lanes<V>()>;
    \n-
    587
    \n-
    588 checkImplCast<V, V>();
    \n-
    589 checkImplCast<V, LoopV>();
    \n-
    590 checkImplCast<LoopV, V>();
    \n-
    591 }
    \n-
    592
    \n-
    593 // check the broadcast function
    \n-
    594 template<class V>
    \n-
    595 void checkBroadcast()
    \n-
    596 {
    \n-
    597 // broadcast function
    \n-
    598 { // lvalue arg
    \n-
    599 Scalar<V> ref = 42;
    \n-
    600 auto vec = broadcast<V>(ref);
    \n-
    601 static_assert(std::is_same<decltype(vec), V>::value,
    \n-
    602 "Unexpected result type for broadcast<V>()");
    \n-
    603 DUNE_SIMD_CHECK(is42(vec));
    \n-
    604 DUNE_SIMD_CHECK(ref == Scalar<V>(42));
    \n-
    605 }
    \n-
    606
    \n-
    607 { // const lvalue arg
    \n-
    608 const Scalar<V> ref = 42;
    \n-
    609 auto vec = broadcast<V>(ref);
    \n-
    610 static_assert(std::is_same<decltype(vec), V>::value,
    \n-
    611 "Unexpected result type for broadcast<V>()");
    \n-
    612 DUNE_SIMD_CHECK(is42(vec));
    \n-
    613 }
    \n-
    614
    \n-
    615 { // rvalue arg
    \n-
    616 auto vec = broadcast<V>(Scalar<V>(42));
    \n-
    617 static_assert(std::is_same<decltype(vec), V>::value,
    \n-
    618 "Unexpected result type for broadcast<V>()");
    \n-
    619 DUNE_SIMD_CHECK(is42(vec));
    \n-
    620 }
    \n-
    621
    \n-
    622 { // int arg
    \n-
    623 auto vec = broadcast<V>(42);
    \n-
    624 static_assert(std::is_same<decltype(vec), V>::value,
    \n-
    625 "Unexpected result type for broadcast<V>()");
    \n-
    626 DUNE_SIMD_CHECK(is42(vec));
    \n-
    627 }
    \n-
    628
    \n-
    629 { // double arg
    \n-
    630 auto vec = broadcast<V>(42.0);
    \n-
    631 static_assert(std::is_same<decltype(vec), V>::value,
    \n-
    632 "Unexpected result type for broadcast<V>()");
    \n-
    633 DUNE_SIMD_CHECK(is42(vec));
    \n-
    634 }
    \n-
    635 }
    \n-
    636
    \n-
    637 template<class V>
    \n-
    638 void checkBracedAssign()
    \n-
    639 {
    \n-
    640 // copy assignment
    \n-
    641 { V ref = make123<V>(); V vec; vec = {ref};
    \n-
    642 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n-
    643 { const V ref = make123<V>(); V vec; vec = {ref};
    \n-
    644 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
    \n-
    645
    \n-
    646 // move assignment
    \n-
    647 { V vec; vec = {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
    \n-
    648 }
    \n-
    649
    \n-
    650 template<class V>
    \n-
    651 void checkBracedBroadcastAssign()
    \n-
    652 {
    \n-
    653 // nothing works here
    \n-
    654 // // broadcast copy assignment
    \n-
    655 // { Scalar<V> ref = 42; V vec; vec = {ref};
    \n-
    656 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
    \n-
    657 // { const Scalar<V> ref = 42; V vec; vec = {ref};
    \n-
    658 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    659
    \n-
    660 // // broadcast move assignment
    \n-
    661 // { Scalar<V> ref = 42; V vec; vec = {std::move(ref)};
    \n-
    662 // DUNE_SIMD_CHECK(is42(vec)); }
    \n-
    663 }
    \n-
    664
    \n-
    666 //
    \n-
    667 // checks for unary operators
    \n-
    668 //
    \n-
    669
    \n-
    \n-
    670#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL) \\
    \n-
    671 struct OpPostfix##NAME \\
    \n-
    672 { \\
    \n-
    673 template<class V> \\
    \n-
    674 auto operator()(V&& v) const \\
    \n-
    675 -> decltype(std::forward<V>(v) SYMBOL) \\
    \n-
    676 { \\
    \n-
    677 return std::forward<V>(v) SYMBOL; \\
    \n-
    678 } \\
    \n-
    679 }
    \n-
    \n-
    680
    \n-
    \n-
    681#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL) \\
    \n-
    682 struct OpPrefix##NAME \\
    \n-
    683 { \\
    \n-
    684 template<class V> \\
    \n-
    685 auto operator()(V&& v) const \\
    \n-
    686 -> decltype(SYMBOL std::forward<V>(v)) \\
    \n-
    687 { \\
    \n-
    688 return SYMBOL std::forward<V>(v); \\
    \n-
    689 } \\
    \n-
    690 }
    \n-
    \n-
    691
    \n-
    692 DUNE_SIMD_POSTFIX_OP(Decrement, -- );
    \n-
    693 DUNE_SIMD_POSTFIX_OP(Increment, ++ );
    \n-
    694
    \n-
    695 DUNE_SIMD_PREFIX_OP (Decrement, -- );
    \n-
    696 DUNE_SIMD_PREFIX_OP (Increment, ++ );
    \n-
    697
    \n-
    698 DUNE_SIMD_PREFIX_OP (Plus, + );
    \n-
    699 DUNE_SIMD_PREFIX_OP (Minus, - );
    \n-
    700 DUNE_SIMD_PREFIX_OP (LogicNot, ! );
    \n-
    701 // Do not warn about ~ being applied to bool. (1) Yes, doing that is
    \n-
    702 // weird, but we do want to test the weird stuff too. (2) It avoids
    \n-
    703 // running into <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82040> on
    \n-
    704 // g++-7.0 through 7.2. Also, ignore -Wpragmas to not warn about an
    \n-
    705 // unknown -Wbool-operation on compilers that do not know that option.
    \n-
    706#pragma GCC diagnostic push
    \n-
    707#pragma GCC diagnostic ignored "-Wpragmas"
    \n-
    708#pragma GCC diagnostic ignored "-Wunknown-warning-option" // clang 6.0.1
    \n-
    709#pragma GCC diagnostic ignored "-Wbool-operation"
    \n-
    710 DUNE_SIMD_PREFIX_OP (BitNot, ~ );
    \n-
    711#pragma GCC diagnostic pop
    \n-
    712
    \n-
    713#undef DUNE_SIMD_POSTFIX_OP
    \n-
    714#undef DUNE_SIMD_PREFIX_OP
    \n-
    715
    \n-
    716 template<class V, class Op>
    \n-
    717 std::enable_if_t<
    \n-
    718 IsCallable<Op(decltype(lane(0, std::declval<V>())))>::value>
    \n-
    719 checkUnaryOpV(Op op)
    \n-
    720 {
    \n-
    721#define DUNE_SIMD_OPNAME (className<Op(V)>())
    \n-
    722 // arguments
    \n-
    723 auto val = leftVector<std::decay_t<V>>();
    \n-
    724
    \n-
    725 // copy the arguments in case V is a references
    \n-
    726 auto arg = val;
    \n-
    727 auto &&result = op(static_cast<V>(arg));
    \n-
    728 using T = Scalar<std::decay_t<decltype(result)> >;
    \n-
    729 for(std::size_t l = 0; l < lanes(val); ++l)
    \n-
    730 {
    \n-
    731 // `op` might promote the argument. This is a problem if the
    \n-
    732 // argument of the operation on the right of the `==` is
    \n-
    733 // e.g. `(unsigned short)1` and the operation is e.g. unary `-`.
    \n-
    734 // Then the argument is promoted to `int` before applying the
    \n-
    735 // negation, and the result is `(int)-1`. However, the left side of
    \n-
    736 // the `==` is still `(unsigned short)-1`, which typically is the
    \n-
    737 // same as `(unsigned short)65535`. The `==` promotes the left side
    \n-
    738 // before comparing, so that becomes `(int)65535`. It will then
    \n-
    739 // compare `(int)65535` and `(int)-1` and rightly declare them to be
    \n-
    740 // not equal.
    \n-
    741
    \n-
    742 // To work around this, we explicitly convert the right side of the
    \n-
    743 // `==` to the scalar type before comparing.
    \n-\n-
    745 (lane(l, result)
    \n-
    746 == static_cast<T>(op(lane(l, static_cast<V>(val)))));
    \n-
    747 }
    \n-
    748 // op might modify val, verify that any such modification also happens
    \n-
    749 // in the vector case
    \n-
    750 for(std::size_t l = 0; l < lanes<std::decay_t<V> >(); ++l)
    \n-
    751 DUNE_SIMD_CHECK_OP(lane(l, val) == lane(l, arg));
    \n-
    752#undef DUNE_SIMD_OPNAME
    \n-
    753 }
    \n-
    754
    \n-
    755 template<class V, class Op>
    \n-
    756 std::enable_if_t<
    \n-
    757 not IsCallable<Op(decltype(lane(0, std::declval<V>())))>::value>
    \n-
    758 checkUnaryOpV(Op op)
    \n-
    759 {
    \n-
    760 // log_ << "No " << className<Op(decltype(lane(0, std::declval<V>())))>()
    \n-
    761 // << std::endl
    \n-
    762 // << " ==> Not checking " << className<Op(V)>() << std::endl;
    \n-
    763 }
    \n-
    764
    \n-
    765 template<class V, class Op>
    \n-
    766 void checkUnaryOpsV(Op op)
    \n-
    767 {
    \n-
    768 checkUnaryOpV<V&>(op);
    \n-
    769 checkUnaryOpV<const V&>(op);
    \n-
    770 checkUnaryOpV<V&&>(op);
    \n-
    771 }
    \n-
    772
    \n-
    774 //
    \n-
    775 // checks for binary operators
    \n-
    776 //
    \n-
    777
    \n-
    778 // The operators contain an `operator()`, which will be invoked for both
    \n-
    779 // scalar and vector arguments. The function `scalar()` is used the
    \n-
    780 // test whether the scalar types support the operation (via
    \n-
    781 // `ScalarResult`). The difference is that `scalar()` should only ever
    \n-
    782 // receive `const`-ref-qualified version of `Scalar<V>`, while the
    \n-
    783 // `operator()` may also be called with proxies representing scalars.
    \n-
    \n-
    784#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL) \\
    \n-
    785 struct OpInfix##NAME \\
    \n-
    786 { \\
    \n-
    787 template<class V1, class V2> \\
    \n-
    788 decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n-
    789 { \\
    \n-
    790 return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n-
    791 } \\
    \n-
    792 template<class S1, class S2> \\
    \n-
    793 auto scalar(S1&& s1, S2&& s2) const \\
    \n-
    794 -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \n-
    795 }
    \n-
    \n-
    796
    \n-
    797 // for assign ops, accept only non-const lvalue arguments for scalars.
    \n-
    798 // This is needed for class scalars (e.g. std::complex) because
    \n-
    799 // non-const class rvalues are actually usually assignable. Though that
    \n-
    800 // assignment happens to a temporary, and thus is lost. Except that the
    \n-
    801 // tests would bind the result of the assignment to a reference. And
    \n-
    802 // because that result is returned from a function by reference, even
    \n-
    803 // though it is a temporary passed as an argument to that function,
    \n-
    804 // accessing the result later is undefined behaviour.
    \n-
    \n-
    805#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL) \\
    \n-
    806 struct OpInfix##NAME \\
    \n-
    807 { \\
    \n-
    808 template<class V1, class V2> \\
    \n-
    809 decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n-
    810 { \\
    \n-
    811 return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \\
    \n-
    812 } \\
    \n-
    813 template<class S1, class S2> \\
    \n-
    814 auto scalar(S1& s1, S2&& s2) const \\
    \n-
    815 -> decltype(s1 SYMBOL std::forward<S2>(s2)); \\
    \n-
    816 }
    \n-
    \n-
    817
    \n-
    \n-
    818#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL) \\
    \n-
    819 struct OpInfix##NAME \\
    \n-
    820 { \\
    \n-
    821 template<class V1, class V2> \\
    \n-
    822 decltype(auto) operator()(V1&& v1, V2&& v2) const \\
    \n-
    823 { \\
    \n-
    824 return Simd::REPLFN(std::forward<V1>(v1), std::forward<V2>(v2)); \\
    \n-
    825 } \\
    \n-
    826 template<class S1, class S2> \\
    \n-
    827 auto scalar(S1&& s1, S2&& s2) const \\
    \n-
    828 -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \\
    \n-
    829 }
    \n-
    \n-
    830
    \n-
    831 DUNE_SIMD_INFIX_OP(Mul, * );
    \n-
    832 DUNE_SIMD_INFIX_OP(Div, / );
    \n-
    833 DUNE_SIMD_INFIX_OP(Remainder, % );
    \n-
    834
    \n-
    835 DUNE_SIMD_INFIX_OP(Plus, + );
    \n-
    836 DUNE_SIMD_INFIX_OP(Minus, - );
    \n-
    837
    \n-
    838 DUNE_SIMD_INFIX_OP(LeftShift, << );
    \n-
    839 DUNE_SIMD_INFIX_OP(RightShift, >> );
    \n-
    840
    \n-
    841 DUNE_SIMD_INFIX_OP(Less, < );
    \n-
    842 DUNE_SIMD_INFIX_OP(Greater, > );
    \n-
    843 DUNE_SIMD_INFIX_OP(LessEqual, <= );
    \n-
    844 DUNE_SIMD_INFIX_OP(GreaterEqual, >= );
    \n-
    845
    \n-
    846 DUNE_SIMD_INFIX_OP(Equal, == );
    \n-
    847 DUNE_SIMD_INFIX_OP(NotEqual, != );
    \n-
    848
    \n-
    849 DUNE_SIMD_INFIX_OP(BitAnd, & );
    \n-
    850 DUNE_SIMD_INFIX_OP(BitXor, ^ );
    \n-
    851 DUNE_SIMD_INFIX_OP(BitOr, | );
    \n-
    852
    \n-
    853 // Those are not supported in any meaningful way by vectorclass
    \n-
    854 // We need to test replacement functions maskAnd() and maskOr() instead.
    \n-
    855 DUNE_SIMD_REPL_OP(LogicAnd, maskAnd, && );
    \n-
    856 DUNE_SIMD_REPL_OP(LogicOr, maskOr, || );
    \n-
    857
    \n-
    858 DUNE_SIMD_ASSIGN_OP(Assign, = );
    \n-
    859 DUNE_SIMD_ASSIGN_OP(AssignMul, *= );
    \n-
    860 DUNE_SIMD_ASSIGN_OP(AssignDiv, /= );
    \n-
    861 DUNE_SIMD_ASSIGN_OP(AssignRemainder, %= );
    \n-
    862 DUNE_SIMD_ASSIGN_OP(AssignPlus, += );
    \n-
    863 DUNE_SIMD_ASSIGN_OP(AssignMinus, -= );
    \n-
    864 DUNE_SIMD_ASSIGN_OP(AssignLeftShift, <<=);
    \n-
    865 DUNE_SIMD_ASSIGN_OP(AssignRightShift, >>=);
    \n-
    866 DUNE_SIMD_ASSIGN_OP(AssignAnd, &= );
    \n-
    867 DUNE_SIMD_ASSIGN_OP(AssignXor, ^= );
    \n-
    868 DUNE_SIMD_ASSIGN_OP(AssignOr, |= );
    \n-
    869
    \n-
    870#undef DUNE_SIMD_INFIX_OP
    \n-
    871#undef DUNE_SIMD_REPL_OP
    \n-
    872#undef DUNE_SIMD_ASSIGN_OP
    \n-
    873
    \n-
    874 // just used as a tag
    \n-
    875 struct OpInfixComma {};
    \n-
    876
    \n-
    877 template<class T1, class T2>
    \n-
    878 void checkCommaOp(const std::decay_t<T1> &val1,
    \n-
    879 const std::decay_t<T2> &val2)
    \n-
    880 {
    \n-
    881#define DUNE_SIMD_OPNAME (className<OpInfixComma(T1, T2)>())
    \n-
    882 static_assert(std::is_same<decltype((std::declval<T1>(),
    \n-
    883 std::declval<T2>())), T2>::value,
    \n-
    884 "Type and value category of the comma operator must "
    \n-
    885 "match that of the second operand");
    \n-
    886
    \n-
    887 // copy the arguments in case T1 or T2 are references
    \n-
    888 auto arg1 = val1;
    \n-
    889 auto arg2 = val2;
    \n-
    890 // Do not warn that the left side of the comma operator is unused.
    \n-
    891 // Seems to work for g++-4.9 and clang++-3.8. Appears to be harmless
    \n-
    892 // for icpc (14 and 17), and icpc does not seem to issue a warning
    \n-
    893 // anyway.
    \n-
    894#pragma GCC diagnostic push
    \n-
    895#pragma GCC diagnostic ignored "-Wunused-value"
    \n-
    896 auto &&result = (static_cast<T1>(arg1),
    \n-
    897 static_cast<T2>(arg2));
    \n-
    898#pragma GCC diagnostic pop
    \n-
    899 if(std::is_reference<T2>::value)
    \n-
    900 {
    \n-
    901 // comma should return the same object as the second argument for
    \n-
    902 // lvalues and xvalues
    \n-
    903 DUNE_SIMD_CHECK_OP(&result == &arg2);
    \n-
    904 // it should not modify any arguments
    \n-
    905 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1));
    \n-
    906 DUNE_SIMD_CHECK_OP(allTrue(val2 == arg2));
    \n-
    907 }
    \n-
    908 else
    \n-
    909 {
    \n-
    910 // comma should return the same value as the second argument for
    \n-
    911 // prvalues
    \n-
    912 DUNE_SIMD_CHECK_OP(allTrue(result == arg2));
    \n-
    913 // it should not modify any arguments
    \n-
    914 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1));
    \n-
    915 // second argument is a prvalue, any modifications happen to a
    \n-
    916 // temporary and we can't detect them
    \n-
    917 }
    \n-
    918#undef DUNE_SIMD_OPNAME
    \n-
    919 }
    \n-
    920
    \n-
    922 //
    \n-
    923 // checks for vector-vector binary operations
    \n-
    924 //
    \n-
    925
    \n-
    926 // We check the following candidate operation
    \n-
    927 //
    \n-
    928 // vopres = vop1 @ vop2
    \n-
    929 //
    \n-
    930 // against the reference operation
    \n-
    931 //
    \n-
    932 // arefres[l] = aref1[l] @ aref2[l] foreach l
    \n-
    933 //
    \n-
    934 // v... variables are simd-vectors and a... variables are arrays. The
    \n-
    935 // operation may modify the operands, but if is does the modification
    \n-
    936 // needs to happen in both the candidate and the reference.
    \n-
    937 //
    \n-
    938 // We do the following checks:
    \n-
    939 // 1. lanes(vopres) == lanes(vop1)
    \n-
    940 // 2. lane(l, vopres) == arefres[l] foreach l
    \n-
    941 // 3. lane(l, vop1) == aref1[l] foreach l
    \n-
    942 // 4. lane(l, vop2) == aref2[l] foreach l
    \n-
    943 template<class V1, class V2, class Op>
    \n-
    944 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n-
    945 checkBinaryOpVV(MetaType<V1>, MetaType<V2>, Op op)
    \n-
    946 {
    \n-
    947#define DUNE_SIMD_OPNAME (className<Op(V1, V2)>())
    \n-
    948 static_assert(std::is_same<std::decay_t<V1>, std::decay_t<V2> >::value,
    \n-
    949 "Internal testsystem error: called with two types that "
    \n-
    950 "don't decay to the same thing");
    \n-
    951
    \n-
    952 // reference arguments
    \n-
    953 auto vref1 = leftVector<std::decay_t<V1>>();
    \n-
    954 auto vref2 = rightVector<std::decay_t<V2>>();
    \n-
    955
    \n-
    956 // candidate arguments
    \n-
    957 auto vop1 = vref1;
    \n-
    958 auto vop2 = vref2;
    \n-
    959
    \n-
    960 // candidate operation
    \n-
    961 auto &&vopres = op(static_cast<V1>(vop1), static_cast<V2>(vop2));
    \n-
    962 using VR = decltype(vopres);
    \n-
    963
    \n-
    964 // check 1. lanes(vopres) == lanes(vop1)
    \n-
    965 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
    \n-
    966 "The result must have the same number of lanes as the "
    \n-
    967 "operands.");
    \n-
    968
    \n-
    969 // do the reference operation, and simultaneously
    \n-
    970 // check 2. lane(l, vopres) == arefres[l] foreach l
    \n-
    971 using T = Scalar<std::decay_t<VR> >;
    \n-
    972 for(auto l : range(lanes(vopres)))
    \n-
    973 {
    \n-
    974 // see the lengthy comment in `checkUnaryOpV()` as to why the
    \n-
    975 // `static_cast` around the `op()` is necessary
    \n-\n-
    977 (lane(l, vopres)
    \n-
    978 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
    \n-
    979 lane(l, static_cast<V2>(vref2)))));
    \n-
    980 }
    \n-
    981
    \n-
    982 // check 3. lane(l, vop1) == aref1[l] foreach l
    \n-
    983 for(auto l : range(lanes(vop1)))
    \n-
    984 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
    \n-
    985
    \n-
    986 // check 4. lane(l, vop2) == aref2[l] foreach l
    \n-
    987 for(auto l : range(lanes(vop2)))
    \n-
    988 DUNE_SIMD_CHECK_OP(lane(l, vop2) == lane(l, vref2));
    \n-
    989
    \n-
    990#undef DUNE_SIMD_OPNAME
    \n-
    991 }
    \n-
    992
    \n-
    993 template<class V1, class V2, class Op>
    \n-
    994 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n-
    995 checkBinaryOpVV(MetaType<V1>, MetaType<V2>, Op op)
    \n-
    996 {
    \n-
    997 // log_ << "No " << className<Op(decltype(lane(0, std::declval<V1>())),
    \n-
    998 // decltype(lane(0, std::declval<V2>())))>()
    \n-
    999 // << std::endl
    \n-
    1000 // << " ==> Not checking " << className<Op(V1, V2)>() << std::endl;
    \n-
    1001 }
    \n-
    1002
    \n-
    1003 template<class V1, class V2>
    \n-
    1004 void checkBinaryOpVV(MetaType<V1>, MetaType<V2>, OpInfixComma)
    \n-
    1005 {
    \n-
    1006 static_assert(std::is_same<std::decay_t<V1>, std::decay_t<V2> >::value,
    \n-
    1007 "Internal testsystem error: called with two types that "
    \n-
    1008 "don't decay to the same thing");
    \n-
    1009
    \n-
    1010 checkCommaOp<V1, V2>(leftVector<std::decay_t<V1>>(),
    \n-
    1011 rightVector<std::decay_t<V2>>());
    \n-
    1012 }
    \n-
    1013
    \n-
    1015 //
    \n-
    1016 // checks for vector-scalar binary operations
    \n-
    1017 //
    \n-
    1018
    \n-
    1019 // We check the following candidate operation
    \n-
    1020 //
    \n-
    1021 // vopres = vop1 @ sop2
    \n-
    1022 //
    \n-
    1023 // against the reference operation
    \n-
    1024 //
    \n-
    1025 // arefres[l] = aref1[l] @ sref2 foreach l
    \n-
    1026 //
    \n-
    1027 // v... variables are simd-vectors, a... variables are arrays, and
    \n-
    1028 // s... variables are scalars. The operation may modify the left
    \n-
    1029 // operand, but if is does the modifications needs to happen in both the
    \n-
    1030 // candidate and the reference.
    \n-
    1031 //
    \n-
    1032 // We do the following checks:
    \n-
    1033 // 1. lanes(vopres) == lanes(vop1)
    \n-
    1034 // 2. lane(l, vopres) == arefres[l] foreach l
    \n-
    1035 // 3. lane(l, vop1) == aref1[l] foreach l
    \n-
    1036 // 4. sop2 is never modified
    \n-
    1037 // 5. sref2 is never modified
    \n-
    1038 //
    \n-
    1039 // In fact, if the property "sref2 is never modified" is violated that
    \n-
    1040 // means the operation is unsuitable for an automatic broadcast of the
    \n-
    1041 // second operand and should not be checked. There are no operations in
    \n-
    1042 // the standard where the second operand is modified like this, but
    \n-
    1043 // there are operations where the first operand is modified -- and this
    \n-
    1044 // check is used for those ops as well by exchanging the first and second
    \n-
    1045 // argument below.
    \n-
    1046
    \n-
    1047 template<class V1, class T2, class Op>
    \n-
    1048 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n-
    1049 checkBinaryOpVS(MetaType<V1>, MetaType<T2>, Op op)
    \n-
    1050 {
    \n-
    1051#define DUNE_SIMD_OPNAME (className<Op(V1, T2)>())
    \n-
    1052 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
    \n-
    1053 std::decay_t<T2> >::value,
    \n-
    1054 "Internal testsystem error: called with a scalar that "
    \n-
    1055 "does not match the vector type.");
    \n-
    1056
    \n-
    1057 // initial values
    \n-
    1058 auto sinit2 = rightScalar<std::decay_t<T2>>();
    \n-
    1059
    \n-
    1060 // reference arguments
    \n-
    1061 auto vref1 = leftVector<std::decay_t<V1>>();
    \n-
    1062 auto sref2 = sinit2;
    \n-
    1063
    \n-
    1064 // candidate arguments
    \n-
    1065 auto vop1 = vref1;
    \n-
    1066 auto sop2 = sref2;
    \n-
    1067
    \n-
    1068 // candidate operation
    \n-
    1069 auto &&vopres = op(static_cast<V1>(vop1), static_cast<T2>(sop2));
    \n-
    1070 using VR = decltype(vopres);
    \n-
    1071
    \n-
    1072 // check 1. lanes(vopres) == lanes(vop1)
    \n-
    1073 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
    \n-
    1074 "The result must have the same number of lanes as the "
    \n-
    1075 "operands.");
    \n-
    1076
    \n-
    1077 // check 4. sop2 is never modified
    \n-
    1078 DUNE_SIMD_CHECK_OP(sop2 == sinit2);
    \n-
    1079
    \n-
    1080 // do the reference operation, and simultaneously check 2. and 5.
    \n-
    1081 using T = Scalar<std::decay_t<decltype(vopres)> >;
    \n-
    1082 for(auto l : range(lanes(vopres)))
    \n-
    1083 {
    \n-
    1084 // check 2. lane(l, vopres) == arefres[l] foreach l
    \n-
    1085 // see the lengthy comment in `checkUnaryOpV()` as to why the
    \n-
    1086 // `static_cast` around the `op()` is necessary
    \n-\n-
    1088 (lane(l, vopres)
    \n-
    1089 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
    \n-
    1090 static_cast<T2>(sref2) )));
    \n-
    1091 // check 5. sref2 is never modified
    \n-
    1092 DUNE_SIMD_CHECK_OP(sref2 == sinit2);
    \n-
    1093 }
    \n-
    1094
    \n-
    1095 // check 3. lane(l, vop1) == aref1[l] foreach l
    \n-
    1096 for(auto l : range(lanes(vop1)))
    \n-
    1097 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
    \n-
    1098
    \n-
    1099#undef DUNE_SIMD_OPNAME
    \n-
    1100 }
    \n-
    1101
    \n-
    1102 template<class V1, class T2, class Op>
    \n-
    1103 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n-
    1104 checkBinaryOpVS(MetaType<V1>, MetaType<T2>, Op op)
    \n-
    1105 {
    \n-
    1106 // log_ << "No "
    \n-
    1107 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
    \n-
    1108 // << std::endl
    \n-
    1109 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
    \n-
    1110 }
    \n-
    1111
    \n-
    1112 template<class V1, class T2>
    \n-
    1113 void checkBinaryOpVS(MetaType<V1>, MetaType<T2>, OpInfixComma)
    \n-
    1114 {
    \n-
    1115 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
    \n-
    1116 std::decay_t<T2> >::value,
    \n-
    1117 "Internal testsystem error: called with a scalar that "
    \n-
    1118 "does not match the vector type.");
    \n-
    1119
    \n-
    1120 checkCommaOp<V1, T2>(leftVector<std::decay_t<V1>>(),
    \n-
    1121 rightScalar<std::decay_t<T2>>());
    \n-
    1122 }
    \n-
    1123
    \n-
    1125 //
    \n-
    1126 // cross-check scalar-vector binary operations against vector-vector
    \n-
    1127 //
    \n-
    1128
    \n-
    1129 // We check the following candidate operation
    \n-
    1130 //
    \n-
    1131 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)
    \n-
    1132 //
    \n-
    1133 // against the reference operation
    \n-
    1134 //
    \n-
    1135 // vrefres = vref1 @ sref2
    \n-
    1136 //
    \n-
    1137 // v... variables are simd-vectors, a... variables are arrays, and
    \n-
    1138 // s... variables are scalars.
    \n-
    1139 //
    \n-
    1140 // We could check the following properties
    \n-
    1141 // 1. lanes(vopres) == lanes(vop1)
    \n-
    1142 // 2. lane(l, vopres) == lane(l, vrefres) foreach l
    \n-
    1143 // 3. lane(l, vop1) == lane(l, vref1) foreach l
    \n-
    1144 // but these are given by checking the operation against the scalar
    \n-
    1145 // operation in the vector@vector and vector@scalar cases above.
    \n-
    1146 //
    \n-
    1147 // The only thing left to check is:
    \n-
    1148 // 4. lane(l, vop2) foreach l is never modified
    \n-
    1149
    \n-
    1150 template<class V1, class T2, class Op>
    \n-
    1151 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n-
    1152 checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, Op op)
    \n-
    1153 {
    \n-
    1154#define DUNE_SIMD_OPNAME (className<Op(V1, T2)>())
    \n-
    1155 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
    \n-
    1156 std::decay_t<T2> >::value,
    \n-
    1157 "Internal testsystem error: called with a scalar that "
    \n-
    1158 "does not match the vector type.");
    \n-
    1159
    \n-
    1160 // initial values
    \n-
    1161 auto sinit2 = rightScalar<std::decay_t<T2>>();
    \n-
    1162
    \n-
    1163 // reference arguments
    \n-
    1164 auto vop1 = leftVector<std::decay_t<V1>>();
    \n-
    1165 using V2 = CopyRefQual<V1, T2>;
    \n-
    1166 std::decay_t<V2> vop2(sinit2);
    \n-
    1167
    \n-
    1168 // candidate operation
    \n-
    1169 op(static_cast<V1>(vop1), static_cast<V2>(vop2));
    \n-
    1170
    \n-
    1171 // 4. lane(l, vop2) foreach l is never modified
    \n-
    1172 for(auto l : range(lanes(vop2)))
    \n-
    1173 DUNE_SIMD_CHECK_OP(lane(l, vop2) == sinit2);
    \n-
    1174
    \n-
    1175#undef DUNE_SIMD_OPNAME
    \n-
    1176 }
    \n-
    1177
    \n-
    1178 template<class V1, class T2, class Op>
    \n-
    1179 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, T2> >
    \n-
    1180 checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, Op op)
    \n-
    1181 {
    \n-
    1182 // log_ << "No "
    \n-
    1183 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
    \n-
    1184 // << std::endl
    \n-
    1185 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
    \n-
    1186 }
    \n-
    1187
    \n-
    1188 template<class V1, class T2>
    \n-
    1189 void checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, OpInfixComma)
    \n-
    1190 { }
    \n-
    1191
    \n-
    1193 //
    \n-
    1194 // checks for vector-proxy binary operations
    \n-
    1195 //
    \n-
    1196
    \n-
    1197 // We check the following candidate operation
    \n-
    1198 //
    \n-
    1199 // vopres = vop1 @ pop2
    \n-
    1200 //
    \n-
    1201 // against the reference operation
    \n-
    1202 //
    \n-
    1203 // arefres[l] = aref1[l] @ sref2 foreach l
    \n-
    1204 //
    \n-
    1205 // v... variables are simd-vectors, a... variables are arrays,
    \n-
    1206 // p... variables are proxies of simd-vector entries and s... variables
    \n-
    1207 // are scalars. The operation may modify the left operand, but if is
    \n-
    1208 // does the modifications needs to happen in both the candidate and the
    \n-
    1209 // reference.
    \n-
    1210 //
    \n-
    1211 // We do the following checks:
    \n-
    1212 // 1. lanes(vopres) == lanes(vop1)
    \n-
    1213 // 2. lane(l, vopres) == arefres[l] foreach l
    \n-
    1214 // 3. lane(l, vop1) == aref1[l] foreach l
    \n-
    1215 // 4. pop2 is never modified
    \n-
    1216 // 5. sref2 is never modified
    \n-
    1217 //
    \n-
    1218 // In fact, if the property "sref2 is never modified" is violated that
    \n-
    1219 // means the operation is unsuitable for an automatic broadcast of the
    \n-
    1220 // second operand and should not be checked. There are no operations in
    \n-
    1221 // the standard where the second operand is modified like this, but
    \n-
    1222 // there are operations where the first operand is modified -- and this
    \n-
    1223 // check is used for those ops as well by exchanging the first and second
    \n-
    1224 // argument below.
    \n-
    1225
    \n-
    1226 template<class V1, class V2, class Op>
    \n-
    1227 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n-
    1228 checkBinaryOpVP(MetaType<V1>, MetaType<V2>, Op op)
    \n-
    1229 {
    \n-
    1230 using P2 = decltype(lane(0, std::declval<V2>()));
    \n-
    1231 using T2 = CopyRefQual<Scalar<V2>, V2>;
    \n-
    1232#define DUNE_SIMD_OPNAME (className<Op(V1, P2)>())
    \n-
    1233 static_assert(std::is_same<Scalar<V1>, Scalar<V2> >::value,
    \n-
    1234 "Internal testsystem error: called with two vector "
    \n-
    1235 "types whose scalar types don't match.");
    \n-
    1236
    \n-
    1237 // initial values
    \n-
    1238 auto sinit2 = rightScalar<Scalar<V2>>();
    \n-
    1239
    \n-
    1240 // reference arguments
    \n-
    1241 auto vref1 = leftVector<std::decay_t<V1>>();
    \n-
    1242 auto sref2 = sinit2;
    \n-
    1243
    \n-
    1244 // candidate arguments
    \n-
    1245 auto vop1 = vref1;
    \n-
    1246 auto vop2 = std::decay_t<V2>(Scalar<V2>(0));
    \n-
    1247 lane(0, vop2) = sref2; // pop2 is just a name for `lane(0, vop2)`
    \n-
    1248
    \n-
    1249 // candidate operation
    \n-
    1250 auto &&vopres =
    \n-
    1251 op(static_cast<V1>(vop1), lane(0, static_cast<V2>(vop2)));
    \n-
    1252 using VR = decltype(vopres);
    \n-
    1253
    \n-
    1254 // check 1. lanes(vopres) == lanes(vop1)
    \n-
    1255 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
    \n-
    1256 "The result must have the same number of lanes as the "
    \n-
    1257 "operands.");
    \n-
    1258
    \n-
    1259 // check 4. pop2 is never modified
    \n-
    1260 DUNE_SIMD_CHECK_OP(lane(0, vop2) == sinit2);
    \n-
    1261
    \n-
    1262 // do the reference operation, and simultaneously check 2. and 5.
    \n-
    1263 using T = Scalar<decltype(vopres)>;
    \n-
    1264 for(auto l : range(lanes(vopres)))
    \n-
    1265 {
    \n-
    1266 // check 2. lane(l, vopres) == arefres[l] foreach l
    \n-
    1267 // see the lengthy comment in `checkUnaryOpV()` as to why the
    \n-
    1268 // `static_cast` around the `op()` is necessary
    \n-\n-
    1270 (lane(l, vopres)
    \n-
    1271 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
    \n-
    1272 static_cast<T2>(sref2) )));
    \n-
    1273 // check 5. sref2 is never modified
    \n-
    1274 DUNE_SIMD_CHECK_OP(sref2 == sinit2);
    \n-
    1275 }
    \n-
    1276
    \n-
    1277 // check 3. lane(l, vop1) == aref1[l] foreach l
    \n-
    1278 for(auto l : range(lanes(vop1)))
    \n-
    1279 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
    \n-
    1280
    \n-
    1281#undef DUNE_SIMD_OPNAME
    \n-
    1282 }
    \n-
    1283
    \n-
    1284 template<class V1, class V2, class Op>
    \n-
    1285 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, V2> >
    \n-
    1286 checkBinaryOpVP(MetaType<V1>, MetaType<V2>, Op op)
    \n-
    1287 {
    \n-
    1288 // log_ << "No "
    \n-
    1289 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
    \n-
    1290 // << std::endl
    \n-
    1291 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
    \n-
    1292 }
    \n-
    1293
    \n-
    1294 template<class V1, class V2>
    \n-
    1295 void checkBinaryOpVP(MetaType<V1>, MetaType<V2>, OpInfixComma)
    \n-
    1296 {
    \n-
    1297 // Don't really know how to check comma operator for proxies
    \n-
    1298 }
    \n-
    1299
    \n-
    1301 //
    \n-
    1302 // checks for (scalar/proxy)-vector binary operations
    \n-
    1303 //
    \n-
    1304
    \n-
    1305 template<class Op>
    \n-
    1306 struct OpInfixSwappedArgs
    \n-
    1307 {
    \n-
    1308 Op orig;
    \n-
    1309
    \n-
    1310 template<class V1, class V2>
    \n-
    1311 decltype(auto) operator()(V1&& v1, V2&& v2) const
    \n-
    1312 {
    \n-
    1313 return orig(std::forward<V2>(v2), std::forward<V1>(v1));
    \n-
    1314 }
    \n-
    1315 template<class S1, class S2>
    \n-
    1316 auto scalar(S1&& s1, S2&& s2) const
    \n-
    1317 -> decltype(orig.scalar(std::forward<S2>(s2), std::forward<S1>(s1)));
    \n-
    1318 };
    \n-
    1319
    \n-
    1320 template<class T1, class V2, class Op>
    \n-
    1321 void checkBinaryOpSV(MetaType<T1> t1, MetaType<V2> v2, Op op)
    \n-
    1322 {
    \n-
    1323 checkBinaryOpVS(v2, t1, OpInfixSwappedArgs<Op>{op});
    \n-
    1324 }
    \n-
    1325
    \n-
    1326 template<class T1, class V2>
    \n-
    1327 void checkBinaryOpSV(MetaType<T1>, MetaType<V2>, OpInfixComma)
    \n-
    1328 {
    \n-
    1329 static_assert(std::is_same<std::decay_t<T1>,
    \n-
    1330 Scalar<std::decay_t<V2> > >::value,
    \n-
    1331 "Internal testsystem error: called with a scalar that "
    \n-
    1332 "does not match the vector type.");
    \n-
    1333
    \n-
    1334 checkCommaOp<T1, V2>(leftScalar<std::decay_t<T1>>(),
    \n-
    1335 rightVector<std::decay_t<V2>>());
    \n-
    1336 }
    \n-
    1337
    \n-
    1338 template<class V1, class V2, class Op>
    \n-
    1339 void checkBinaryOpPV(MetaType<V1> v1, MetaType<V2> v2, Op op)
    \n-
    1340 {
    \n-
    1341 checkBinaryOpVP(v2, v1, OpInfixSwappedArgs<Op>{op});
    \n-
    1342 }
    \n-
    1343
    \n-
    1344 template<class V1, class V2>
    \n-
    1345 void checkBinaryOpPV(MetaType<V1>, MetaType<V2>, OpInfixComma)
    \n-
    1346 {
    \n-
    1347 // Don't really know how to check comma operator for proxies
    \n-
    1348 }
    \n-
    1349
    \n-
    1351 //
    \n-
    1352 // cross-check scalar-vector binary operations against vector-vector
    \n-
    1353 //
    \n-
    1354
    \n-
    1355 // We check the following candidate operation
    \n-
    1356 //
    \n-
    1357 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)
    \n-
    1358 //
    \n-
    1359 // against the reference operation
    \n-
    1360 //
    \n-
    1361 // vrefres = vref1 @ sref2
    \n-
    1362 //
    \n-
    1363 // v... variables are simd-vectors, a... variables are arrays, and
    \n-
    1364 // s... variables are scalars.
    \n-
    1365 //
    \n-
    1366 // We could check the following properties
    \n-
    1367 // 1. lanes(vopres) == lanes(vop1)
    \n-
    1368 // 2. lane(l, vopres) == lane(l, vrefres) foreach l
    \n-
    1369 // 3. lane(l, vop1) == lane(l, vref1) foreach l
    \n-
    1370 // but these are given by checking the operation against the scalar
    \n-
    1371 // operation in the vector@vector and vector@scalar cases above.
    \n-
    1372 //
    \n-
    1373 // The only thing left to check is:
    \n-
    1374 // 4. lane(l, vop2) foreach l is never modified
    \n-
    1375
    \n-
    1376 template<class T1, class V2, class Op>
    \n-
    1377 void checkBinaryOpVVAgainstSV(MetaType<T1> t1, MetaType<V2> v2, Op op)
    \n-
    1378 {
    \n-
    1379 checkBinaryOpVVAgainstVS(v2, t1, OpInfixSwappedArgs<Op>{op});
    \n-
    1380 }
    \n-
    1381
    \n-
    1382 template<class V1, class T2>
    \n-
    1383 void checkBinaryOpVVAgainstSV(MetaType<V1>, MetaType<T2>, OpInfixComma)
    \n-
    1384 { }
    \n-
    1385
    \n-
    1387 //
    \n-
    1388 // Invoke the checks for all combinations
    \n-
    1389 //
    \n-
    1390
    \n-
    1391 template<class T1, class T2, bool condition, class Checker>
    \n-
    1392 void checkBinaryRefQual(Checker checker)
    \n-
    1393 {
    \n-
    1394 if constexpr (condition) {
    \n-
    1395 Hybrid::forEach(TypeList<T1&, const T1&, T1&&>{}, [=] (auto t1) {
    \n-
    1396 Hybrid::forEach(TypeList<T2&, const T2&, T2&&>{}, [=] (auto t2) {
    \n-
    1397 checker(t1, t2);
    \n-
    1398 });
    \n-
    1399 });
    \n-
    1400 }
    \n-
    1401 }
    \n-
    1402
    \n-
    1403 template<class V, class Checker>
    \n-
    1404 void checkBinaryOps(Checker checker)
    \n-
    1405 {
    \n-
    1406 using Std::bool_constant;
    \n-
    1407
    \n-
    1408 constexpr bool isMask = std::is_same<Scalar<V>, bool>::value;
    \n-
    1409
    \n-
    1410 constexpr bool do_ = false;
    \n-
    1411 constexpr bool do_SV = true;
    \n-
    1412 constexpr bool do_VV = true;
    \n-
    1413 constexpr bool do_VS = true;
    \n-
    1414
    \n-
    1415#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) \\
    \n-
    1416 checker(bool_constant<isMask ? do_##M1 : do_##V1>{}, \\
    \n-
    1417 bool_constant<isMask ? do_##M2 : do_##V2>{}, \\
    \n-
    1418 bool_constant<isMask ? do_##M3 : do_##V3>{}, \\
    \n-
    1419 Op##NAME{})
    \n-
    1420
    \n-
    1421 // (Mask , Vector , Name );
    \n-
    1422
    \n-
    1423 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMul );
    \n-
    1424 DUNE_SIMD_DO( , , , SV, VV, VS, InfixDiv );
    \n-
    1425 DUNE_SIMD_DO( , , , SV, VV, VS, InfixRemainder );
    \n-
    1426
    \n-
    1427 DUNE_SIMD_DO( , , , SV, VV, VS, InfixPlus );
    \n-
    1428 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMinus );
    \n-
    1429
    \n-
    1430 DUNE_SIMD_DO( , , , , VV, VS, InfixLeftShift );
    \n-
    1431 DUNE_SIMD_DO( , , , , VV, VS, InfixRightShift );
    \n-
    1432
    \n-
    1433 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLess );
    \n-
    1434 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreater );
    \n-
    1435 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLessEqual );
    \n-
    1436 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreaterEqual );
    \n-
    1437
    \n-
    1438 DUNE_SIMD_DO( , , , SV, VV, VS, InfixEqual );
    \n-
    1439 DUNE_SIMD_DO( , , , SV, VV, VS, InfixNotEqual );
    \n-
    1440
    \n-
    1441 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitAnd );
    \n-
    1442 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitXor );
    \n-
    1443 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitOr );
    \n-
    1444
    \n-
    1445 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicAnd );
    \n-
    1446 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicOr );
    \n-
    1447
    \n-
    1448 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssign );
    \n-
    1449 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMul );
    \n-
    1450 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignDiv );
    \n-
    1451 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRemainder );
    \n-
    1452 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignPlus );
    \n-
    1453 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMinus );
    \n-
    1454 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignLeftShift );
    \n-
    1455 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRightShift);
    \n-
    1456 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignAnd );
    \n-
    1457 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignXor );
    \n-
    1458 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignOr );
    \n-
    1459
    \n-
    1460 DUNE_SIMD_DO(SV, VV, VS, SV, , VS, InfixComma );
    \n-
    1461
    \n-
    1462#undef DUNE_SIMD_DO
    \n-
    1463 }
    \n-
    1464
    \n-
    1466 //
    \n-
    1467 // SIMD interface functions
    \n-
    1468 //
    \n-
    1469
    \n-
    1470 template<class V>
    \n-
    1471 void checkAutoCopy()
    \n-
    1472 {
    \n-
    1473 using RValueResult = decltype(autoCopy(lane(0, std::declval<V>())));
    \n-
    1474 static_assert(std::is_same<RValueResult, Scalar<V> >::value,
    \n-
    1475 "Result of autoCopy() must always be Scalar<V>");
    \n-
    1476
    \n-
    1477 using MutableLValueResult =
    \n-
    1478 decltype(autoCopy(lane(0, std::declval<V&>())));
    \n-
    1479 static_assert(std::is_same<MutableLValueResult, Scalar<V> >::value,
    \n-
    1480 "Result of autoCopy() must always be Scalar<V>");
    \n-
    1481
    \n-
    1482 using ConstLValueResult =
    \n-
    1483 decltype(autoCopy(lane(0, std::declval<const V&>())));
    \n-
    1484 static_assert(std::is_same<ConstLValueResult, Scalar<V> >::value,
    \n-
    1485 "Result of autoCopy() must always be Scalar<V>");
    \n-
    1486
    \n-
    1487 V vec = make123<V>();
    \n-
    1488 for(std::size_t l = 0; l < lanes(vec); ++l)
    \n-
    1489 DUNE_SIMD_CHECK(autoCopy(lane(l, vec)) == Scalar<V>(l+1));
    \n-
    1490 }
    \n-
    1491
    \n-
    1492 // may only be called for mask types
    \n-
    1493 template<class M>
    \n-
    1494 void checkBoolReductions()
    \n-
    1495 {
    \n-
    1496 M trueVec(true);
    \n-
    1497
    \n-
    1498 // mutable lvalue
    \n-
    1499 DUNE_SIMD_CHECK(allTrue (static_cast<M&>(trueVec)) == true);
    \n-
    1500 DUNE_SIMD_CHECK(anyTrue (static_cast<M&>(trueVec)) == true);
    \n-
    1501 DUNE_SIMD_CHECK(allFalse(static_cast<M&>(trueVec)) == false);
    \n-
    1502 DUNE_SIMD_CHECK(anyFalse(static_cast<M&>(trueVec)) == false);
    \n-
    1503
    \n-
    1504 // const lvalue
    \n-
    1505 DUNE_SIMD_CHECK(allTrue (static_cast<const M&>(trueVec)) == true);
    \n-
    1506 DUNE_SIMD_CHECK(anyTrue (static_cast<const M&>(trueVec)) == true);
    \n-
    1507 DUNE_SIMD_CHECK(allFalse(static_cast<const M&>(trueVec)) == false);
    \n-
    1508 DUNE_SIMD_CHECK(anyFalse(static_cast<const M&>(trueVec)) == false);
    \n-
    1509
    \n-
    1510 // rvalue
    \n-
    1511 DUNE_SIMD_CHECK(allTrue (M(true)) == true);
    \n-
    1512 DUNE_SIMD_CHECK(anyTrue (M(true)) == true);
    \n-
    1513 DUNE_SIMD_CHECK(allFalse(M(true)) == false);
    \n-
    1514 DUNE_SIMD_CHECK(anyFalse(M(true)) == false);
    \n-
    1515
    \n-
    1516 M falseVec(false);
    \n-
    1517
    \n-
    1518 // mutable lvalue
    \n-
    1519 DUNE_SIMD_CHECK(allTrue (static_cast<M&>(falseVec)) == false);
    \n-
    1520 DUNE_SIMD_CHECK(anyTrue (static_cast<M&>(falseVec)) == false);
    \n-
    1521 DUNE_SIMD_CHECK(allFalse(static_cast<M&>(falseVec)) == true);
    \n-
    1522 DUNE_SIMD_CHECK(anyFalse(static_cast<M&>(falseVec)) == true);
    \n-
    1523
    \n-
    1524 // const lvalue
    \n-
    1525 DUNE_SIMD_CHECK(allTrue (static_cast<const M&>(falseVec)) == false);
    \n-
    1526 DUNE_SIMD_CHECK(anyTrue (static_cast<const M&>(falseVec)) == false);
    \n-
    1527 DUNE_SIMD_CHECK(allFalse(static_cast<const M&>(falseVec)) == true);
    \n-
    1528 DUNE_SIMD_CHECK(anyFalse(static_cast<const M&>(falseVec)) == true);
    \n-
    1529
    \n-
    1530 // rvalue
    \n-
    1531 DUNE_SIMD_CHECK(allTrue (M(false)) == false);
    \n-
    1532 DUNE_SIMD_CHECK(anyTrue (M(false)) == false);
    \n-
    1533 DUNE_SIMD_CHECK(allFalse(M(false)) == true);
    \n-
    1534 DUNE_SIMD_CHECK(anyFalse(M(false)) == true);
    \n-
    1535
    \n-
    1536 auto mixedVec = broadcast<M>(0);
    \n-
    1537 for(std::size_t l = 0; l < lanes(mixedVec); ++l)
    \n-
    1538 lane(l, mixedVec) = (l % 2);
    \n-
    1539
    \n-
    1540 // mutable lvalue
    \n-\n-
    1542 (allTrue (static_cast<M&>(mixedVec)) == false);
    \n-\n-
    1544 (anyTrue (static_cast<M&>(mixedVec)) == (lanes<M>() > 1));
    \n-\n-
    1546 (allFalse(static_cast<M&>(mixedVec)) == (lanes<M>() == 1));
    \n-\n-
    1548 (anyFalse(static_cast<M&>(mixedVec)) == true);
    \n-
    1549
    \n-
    1550 // const lvalue
    \n-\n-
    1552 (allTrue (static_cast<const M&>(mixedVec)) == false);
    \n-\n-
    1554 (anyTrue (static_cast<const M&>(mixedVec)) == (lanes<M>() > 1));
    \n-\n-
    1556 (allFalse(static_cast<const M&>(mixedVec)) == (lanes<M>() == 1));
    \n-\n-
    1558 (anyFalse(static_cast<const M&>(mixedVec)) == true);
    \n-
    1559
    \n-
    1560 // rvalue
    \n-
    1561 DUNE_SIMD_CHECK(allTrue (M(mixedVec)) == false);
    \n-
    1562 DUNE_SIMD_CHECK(anyTrue (M(mixedVec)) == (lanes<M>() > 1));
    \n-
    1563 DUNE_SIMD_CHECK(allFalse(M(mixedVec)) == (lanes<M>() == 1));
    \n-
    1564 DUNE_SIMD_CHECK(anyFalse(M(mixedVec)) == true);
    \n-
    1565 }
    \n-
    1566
    \n-
    1567 template<class V>
    \n-
    1568 void checkCond()
    \n-
    1569 {
    \n-
    1570 using M = Mask<V>;
    \n-
    1571
    \n-
    1572 static_assert
    \n-
    1573 (std::is_same<decltype(cond(std::declval<M>(), std::declval<V>(),
    \n-
    1574 std::declval<V>())), V>::value,
    \n-
    1575 "The result of cond(M, V, V) should have exactly the type V");
    \n-
    1576
    \n-
    1577 static_assert
    \n-
    1578 (std::is_same<decltype(cond(std::declval<const M&>(),
    \n-
    1579 std::declval<const V&>(),
    \n-
    1580 std::declval<const V&>())), V>::value,
    \n-
    1581 "The result of cond(const M&, const V&, const V&) should have "
    \n-
    1582 "exactly the type V");
    \n-
    1583
    \n-
    1584 static_assert
    \n-
    1585 (std::is_same<decltype(cond(std::declval<M&>(), std::declval<V&>(),
    \n-
    1586 std::declval<V&>())), V>::value,
    \n-
    1587 "The result of cond(M&, V&, V&) should have exactly the type V");
    \n-
    1588
    \n-
    1589 V vec1 = leftVector<V>();
    \n-
    1590 V vec2 = rightVector<V>();
    \n-
    1591
    \n-
    1592 DUNE_SIMD_CHECK(allTrue(cond(M(true), vec1, vec2) == vec1));
    \n-
    1593 DUNE_SIMD_CHECK(allTrue(cond(M(false), vec1, vec2) == vec2));
    \n-
    1594
    \n-
    1595 auto mixedResult = broadcast<V>(0);
    \n-
    1596 auto mixedMask = broadcast<M>(false);
    \n-
    1597 for(std::size_t l = 0; l < lanes(mixedMask); ++l)
    \n-
    1598 {
    \n-
    1599 lane(l, mixedMask ) = (l % 2);
    \n-
    1600 lane(l, mixedResult) = lane(l, (l % 2) ? vec1 : vec2);
    \n-
    1601 }
    \n-
    1602
    \n-
    1603 DUNE_SIMD_CHECK(allTrue(cond(mixedMask, vec1, vec2) == mixedResult));
    \n-
    1604 }
    \n-
    1605
    \n-
    1606 template<class V>
    \n-
    1607 void checkBoolCond()
    \n-
    1608 {
    \n-
    1609 static_assert
    \n-
    1610 (std::is_same<decltype(cond(std::declval<bool>(), std::declval<V>(),
    \n-
    1611 std::declval<V>())), V>::value,
    \n-
    1612 "The result of cond(bool, V, V) should have exactly the type V");
    \n-
    1613
    \n-
    1614 static_assert
    \n-
    1615 (std::is_same<decltype(cond(std::declval<const bool&>(),
    \n-
    1616 std::declval<const V&>(),
    \n-
    1617 std::declval<const V&>())), V>::value,
    \n-
    1618 "The result of cond(const bool&, const V&, const V&) should have "
    \n-
    1619 "exactly the type V");
    \n-
    1620
    \n-
    1621 static_assert
    \n-
    1622 (std::is_same<decltype(cond(std::declval<bool&>(),
    \n-
    1623 std::declval<V&>(),
    \n-
    1624 std::declval<V&>())), V>::value,
    \n-
    1625 "The result of cond(bool&, V&, V&) should have exactly the type V");
    \n-
    1626
    \n-
    1627 V vec1 = leftVector<V>();
    \n-
    1628 V vec2 = rightVector<V>();
    \n-
    1629
    \n-
    1630 DUNE_SIMD_CHECK(allTrue(cond(true, vec1, vec2) == vec1));
    \n-
    1631 DUNE_SIMD_CHECK(allTrue(cond(false, vec1, vec2) == vec2));
    \n-
    1632 }
    \n-
    1633
    \n-
    1634 template<class V>
    \n-
    1635 std::enable_if_t<!Impl::LessThenComparable<Scalar<V> >::value>
    \n-
    1636 checkHorizontalMinMax() {}
    \n-
    1637
    \n-
    1638 template<class V>
    \n-
    1639 std::enable_if_t<Impl::LessThenComparable<Scalar<V> >::value>
    \n-
    1640 checkHorizontalMinMax()
    \n-
    1641 {
    \n-
    1642 static_assert
    \n-
    1643 (std::is_same<decltype(max(std::declval<V>())), Scalar<V> >::value,
    \n-
    1644 "The result of max(V) should be exactly Scalar<V>");
    \n-
    1645
    \n-
    1646 static_assert
    \n-
    1647 (std::is_same<decltype(min(std::declval<V>())), Scalar<V> >::value,
    \n-
    1648 "The result of min(V) should be exactly Scalar<V>");
    \n-
    1649
    \n-
    1650 static_assert
    \n-
    1651 (std::is_same<decltype(max(std::declval<V&>())), Scalar<V> >::value,
    \n-
    1652 "The result of max(V) should be exactly Scalar<V>");
    \n-
    1653
    \n-
    1654 static_assert
    \n-
    1655 (std::is_same<decltype(min(std::declval<V&>())), Scalar<V> >::value,
    \n-
    1656 "The result of min(V) should be exactly Scalar<V>");
    \n-
    1657
    \n-
    1658 const V vec1 = leftVector<V>();
    \n-
    1659
    \n-
    1660 DUNE_SIMD_CHECK(max(vec1) == Scalar<V>(lanes(vec1)));
    \n-
    1661 DUNE_SIMD_CHECK(min(vec1) == Scalar<V>(1));
    \n-
    1662 }
    \n-
    1663
    \n-
    1664 template<class V>
    \n-
    1665 std::enable_if_t<!Impl::LessThenComparable<Scalar<V> >::value>
    \n-
    1666 checkBinaryMinMax() {}
    \n-
    1667
    \n-
    1668 template<class V>
    \n-
    1669 std::enable_if_t<Impl::LessThenComparable<Scalar<V> >::value>
    \n-
    1670 checkBinaryMinMax()
    \n-
    1671 {
    \n-
    1672 using std::max;
    \n-
    1673 using std::min;
    \n-
    1674
    \n-
    1675 static_assert
    \n-
    1676 (std::is_same<decltype(Simd::max(std::declval<V>(),
    \n-
    1677 std::declval<V>())), V>::value,
    \n-
    1678 "The result of Simd::max(V, V) should be exactly V");
    \n-
    1679 static_assert
    \n-
    1680 (std::is_same<decltype(Simd::min(std::declval<V>(),
    \n-
    1681 std::declval<V>())), V>::value,
    \n-
    1682 "The result of Simd::min(V, V) should be exactly V");
    \n-
    1683
    \n-
    1684 static_assert
    \n-
    1685 (std::is_same<decltype(Simd::max(std::declval<V&>(),
    \n-
    1686 std::declval<V&>())), V>::value,
    \n-
    1687 "The result of Simd::max(V&, V&) should be exactly V");
    \n-
    1688 static_assert
    \n-
    1689 (std::is_same<decltype(Simd::min(std::declval<V&>(),
    \n-
    1690 std::declval<V&>())), V>::value,
    \n-
    1691 "The result of Simd::min(V&, V&) should be exactly V");
    \n-
    1692
    \n-
    1693 const V arg1 = leftVector<V>();
    \n-
    1694 const V arg2 = rightVector<V>();
    \n-
    1695
    \n-
    1696 V maxExp(Scalar<V>(0)), minExp(Scalar<V>(0));
    \n-
    1697 for(auto l : range(lanes<V>()))
    \n-
    1698 {
    \n-
    1699 lane(l, maxExp) = max(lane(l, arg1), lane(l, arg2));
    \n-
    1700 lane(l, minExp) = min(lane(l, arg1), lane(l, arg2));
    \n-
    1701 }
    \n-
    1702
    \n-
    1703 DUNE_SIMD_CHECK(allTrue(maxExp == Simd::max(arg1, arg2)));
    \n-
    1704 DUNE_SIMD_CHECK(allTrue(minExp == Simd::min(arg1, arg2)));
    \n-
    1705 }
    \n-
    1706
    \n-
    1707 template<class V>
    \n-
    1708 void checkIO()
    \n-
    1709 {
    \n-
    1710 const V vec1 = leftVector<V>();
    \n-
    1711
    \n-
    1712 std::string reference;
    \n-
    1713 {
    \n-
    1714 const char *sep = "";
    \n-
    1715 for(auto l : range(lanes(vec1)))
    \n-
    1716 {
    \n-
    1717 std::ostringstream stream;
    \n-
    1718 stream << lane(l, vec1);
    \n-
    1719
    \n-
    1720 reference += sep;
    \n-
    1721 reference += stream.str();
    \n-
    1722 sep = ", ";
    \n-
    1723 }
    \n-
    1724 }
    \n-
    1725
    \n-
    1726 {
    \n-
    1727 std::ostringstream stream;
    \n-
    1728 stream << io(vec1);
    \n-
    1729 if(lanes(vec1) == 1)
    \n-
    1730 DUNE_SIMD_CHECK(stream.str() == reference);
    \n-
    1731 else
    \n-
    1732 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">");
    \n-
    1733 }
    \n-
    1734
    \n-
    1735 {
    \n-
    1736 std::ostringstream stream;
    \n-
    1737 stream << vio(vec1);
    \n-
    1738 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">");
    \n-
    1739 }
    \n-
    1740 }
    \n-
    1741
    \n-
    1742#undef DUNE_SIMD_CHECK
    \n-
    1743
    \n-
    1744 public:
    \n-
    1807 template<class V> void checkType();
    \n-
    1808 template<class V> void checkNonOps();
    \n-
    1809 template<class V> void checkUnaryOps();
    \n-
    1810 template<class V> void checkBinaryOps();
    \n-
    1811 template<class V> void checkBinaryOpsVectorVector();
    \n-
    1812 template<class V> void checkBinaryOpsScalarVector();
    \n-
    1813 template<class V> void checkBinaryOpsVectorScalar();
    \n-
    1814 template<class V> void checkBinaryOpsProxyVector();
    \n-
    1815 template<class V> void checkBinaryOpsVectorProxy();
    \n-
    1819
    \n-
    1836 template<class V, class Rebinds,
    \n-
    1837 template<class> class RebindPrune = IsLoop,
    \n-
    1838 template<class> class RebindAccept = Dune::AlwaysTrue>
    \n-
    \n-
    1839 void check() {
    \n-
    1840 // check whether the test for this type already started
    \n-
    1841 if(seen_.emplace(typeid (V)).second == false)
    \n-
    1842 {
    \n-
    1843 // type already seen, nothing to do
    \n-
    1844 return;
    \n-
    1845 }
    \n-
    1846
    \n-
    1847 // do these first so everything that appears after "Checking SIMD type
    \n-
    1848 // ..." really pertains to that type
    \n-
    1849 auto recurse = [this](auto w) {
    \n-
    1850 using W = typename decltype(w)::type;
    \n-
    1851 this->template check<W, Rebinds, RebindPrune, RebindAccept>();
    \n-
    1852 };
    \n-
    1853 checkRebindOf<V, Rebinds, RebindPrune, RebindAccept>(recurse);
    \n-
    1854
    \n-
    1855 checkType<V>();
    \n-
    1856 }
    \n-
    \n-
    1857
    \n-
    \n-
    1859 bool good() const
    \n-
    1860 {
    \n-
    1861 return good_;
    \n-
    1862 }
    \n-
    \n-
    1863
    \n-
    1864 }; // class UnitTest
    \n-
    \n-
    1865
    \n-
    \n-
    1866 template<class V> void UnitTest::checkType()
    \n-
    1867 {
    \n-
    1868 static_assert(std::is_same<V, std::decay_t<V> >::value, "Simd types "
    \n-
    1869 "must not be references, and must not include "
    \n-
    1870 "cv-qualifiers");
    \n-
    1871
    \n-
    1872 log_ << "Checking SIMD type " << className<V>() << std::endl;
    \n-
    1873
    \n-
    1874 checkNonOps<V>();
    \n-
    1875 checkUnaryOps<V>();
    \n-
    1876 checkBinaryOps<V>();
    \n-
    1877 }
    \n-
    \n-
    \n-
    1878 template<class V> void UnitTest::checkNonOps()
    \n-
    1879 {
    \n-
    1880 constexpr auto isMask = typename std::is_same<Scalar<V>, bool>::type{};
    \n-
    1881
    \n-
    1882 checkLanes<V>();
    \n-
    1883 checkScalar<V>();
    \n-
    1884
    \n-
    1885 checkDefaultConstruct<V>();
    \n-
    1886 checkLane<V>();
    \n-
    1887 checkCopyMoveConstruct<V>();
    \n-
    1888 checkImplCast<V>();
    \n-
    1889 checkBroadcast<V>();
    \n-
    1890 if constexpr (isMask)
    \n-
    1891 this->template checkBroadcastMaskConstruct<V>();
    \n-
    1892 else
    \n-
    1893 this->template checkBroadcastVectorConstruct<V>();
    \n-
    1894 checkBracedAssign<V>();
    \n-
    1895 checkBracedBroadcastAssign<V>();
    \n-
    1896
    \n-
    1897 checkAutoCopy<V>();
    \n-
    1898 checkCond<V>();
    \n-
    1899 checkBoolCond<V>();
    \n-
    1900
    \n-
    1901 if constexpr (isMask)
    \n-
    1902 this->template checkBoolReductions<V>();
    \n-
    1903 // checkBoolReductions() is not applicable for non-masks
    \n-
    1904
    \n-
    1905 checkHorizontalMinMax<V>();
    \n-
    1906 checkBinaryMinMax<V>();
    \n-
    1907 checkIO<V>();
    \n-
    1908 }
    \n-
    \n-
    \n-
    1909 template<class V> void UnitTest::checkUnaryOps()
    \n-
    1910 {
    \n-
    1911 if constexpr (std::is_same_v<Scalar<V>, bool>) {
    \n-
    1912 // check mask
    \n-
    1913 auto check = [this](auto op) {
    \n-
    1914 this->template checkUnaryOpsV<V>(op);
    \n-
    1915 };
    \n-
    1916
    \n-
    1917 // postfix
    \n-
    1918 // check(OpPostfixDecrement{});
    \n-
    1919 // clang deprecation warning if bool++ is tested
    \n-
    1920 // check(OpPostfixIncrement{});
    \n-
    1921
    \n-
    1922 // prefix
    \n-
    1923 // check(OpPrefixDecrement{});
    \n-
    1924 // clang deprecation warning if ++bool is tested
    \n-
    1925 // check(OpPrefixIncrement{});
    \n-
    1926
    \n-
    1927 // check(OpPrefixPlus{});
    \n-
    1928 // check(OpPrefixMinus{});
    \n-
    1929 check(OpPrefixLogicNot{});
    \n-
    1930 // check(OpPrefixBitNot{});
    \n-
    1931 }
    \n-
    1932 else {
    \n-
    1933 // check vector
    \n-
    1934 auto check = [this](auto op) {
    \n-
    1935 this->template checkUnaryOpsV<V>(op);
    \n-
    1936 };
    \n-
    1937
    \n-
    1938 // postfix
    \n-
    1939 // check(OpPostfixDecrement{});
    \n-
    1940 // check(OpPostfixIncrement{});
    \n-
    1941
    \n-
    1942 // prefix
    \n-
    1943 // check(OpPrefixDecrement{});
    \n-
    1944 // check(OpPrefixIncrement{});
    \n-
    1945
    \n-
    1946 // check(OpPrefixPlus{});
    \n-
    1947 check(OpPrefixMinus{});
    \n-
    1948 check(OpPrefixLogicNot{});
    \n-
    1949 check(OpPrefixBitNot{});
    \n-
    1950 }
    \n-
    1951 }
    \n-
    \n-
    \n-
    1952 template<class V> void UnitTest::checkBinaryOps()
    \n-
    1953 {
    \n-
    1954 checkBinaryOpsVectorVector<V>();
    \n-
    1955 checkBinaryOpsScalarVector<V>();
    \n-
    1956 checkBinaryOpsVectorScalar<V>();
    \n-
    1957 checkBinaryOpsProxyVector<V>();
    \n-
    1958 checkBinaryOpsVectorProxy<V>();
    \n-
    1959 }
    \n-
    \n-
    \n-\n-
    1961 {
    \n-
    1962 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n-
    1963 auto check = [this,op](auto t1, auto t2) {
    \n-
    1964 this->checkBinaryOpVV(t1, t2, op);
    \n-
    1965 };
    \n-
    1966 this->checkBinaryRefQual<V, V, doVV>(check);
    \n-
    1967 };
    \n-
    1968 checkBinaryOps<V>(checker);
    \n-
    1969 }
    \n-
    \n-
    \n-\n-
    1971 {
    \n-
    1972 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n-
    1973 auto check = [this,op](auto t1, auto t2) {
    \n-
    1974 this->checkBinaryOpSV(t1, t2, op);
    \n-
    1975 };
    \n-
    1976 this->checkBinaryRefQual<Scalar<V>, V, doSV>(check);
    \n-
    1977
    \n-
    1978 auto crossCheck = [this,op](auto t1, auto t2) {
    \n-
    1979 this->checkBinaryOpVVAgainstSV(t1, t2, op);
    \n-
    1980 };
    \n-
    1981 this->checkBinaryRefQual<Scalar<V>, V, doSV && doVV>(crossCheck);
    \n-
    1982 };
    \n-
    1983 checkBinaryOps<V>(checker);
    \n-
    1984 }
    \n-
    \n-
    \n-\n-
    1986 {
    \n-
    1987 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n-
    1988 auto check = [this,op](auto t1, auto t2) {
    \n-
    1989 this->checkBinaryOpVS(t1, t2, op);
    \n-
    1990 };
    \n-
    1991 this->checkBinaryRefQual<V, Scalar<V>, doVS>(check);
    \n-
    1992
    \n-
    1993 auto crossCheck = [this,op](auto t1, auto t2) {
    \n-
    1994 this->checkBinaryOpVVAgainstVS(t1, t2, op);
    \n-
    1995 };
    \n-
    1996 this->checkBinaryRefQual<V, Scalar<V>, doVV && doVS>(crossCheck);
    \n-
    1997 };
    \n-
    1998 checkBinaryOps<V>(checker);
    \n-
    1999 }
    \n-
    \n-
    \n-\n-
    2001 {
    \n-
    2002 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n-
    2003 auto check = [this,op](auto t1, auto t2) {
    \n-
    2004 this->checkBinaryOpPV(t1, t2, op);
    \n-
    2005 };
    \n-
    2006 this->checkBinaryRefQual<V, V, doSV>(check);
    \n-
    2007 };
    \n-
    2008 checkBinaryOps<V>(checker);
    \n-
    2009 }
    \n-
    \n-
    \n-\n-
    2011 {
    \n-
    2012 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
    \n-
    2013 auto check = [this,op](auto t1, auto t2) {
    \n-
    2014 this->checkBinaryOpVP(t1, t2, op);
    \n-
    2015 };
    \n-
    2016 this->checkBinaryRefQual<V, V, doVS>(check);
    \n-
    2017 };
    \n-
    2018 checkBinaryOps<V>(checker);
    \n-
    2019 }
    \n-
    \n-
    2020
    \n-
    2021 } // namespace Simd
    \n-
    2022} // namespace Dune
    \n-
    2023
    \n-
    2024#endif // DUNE_COMMON_SIMD_TEST_HH
    \n-
    Utilities for reduction like operations on ranges.
    \n-
    A free function to provide the demangled class name of a given object or type as a string.
    \n-\n-
    #define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL)
    Definition test.hh:670
    \n-
    #define DUNE_SIMD_INFIX_OP(NAME, SYMBOL)
    Definition test.hh:784
    \n-
    #define DUNE_SIMD_CHECK_OP(expr)
    Definition test.hh:191
    \n-
    #define DUNE_SIMD_CHECK(expr)
    Definition test.hh:186
    \n-
    #define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL)
    Definition test.hh:818
    \n-
    #define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL)
    Definition test.hh:805
    \n-
    #define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL)
    Definition test.hh:681
    \n-
    #define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)
    \n-
    IO interface of the SIMD abstraction.
    \n-\n-\n-\n-
    Traits for type conversions and type information.
    \n-
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n-
    std::tuple< MetaType< T >... > TypeList
    A simple type list.
    Definition typelist.hh:87
    \n-
    constexpr void forEach(Range &&range, F &&f)
    Range based for loop.
    Definition hybridutilities.hh:268
    \n-
    constexpr AutonomousValue< T > autoCopy(T &&v)
    Autonomous copy of an expression's value for use in auto type deduction.
    Definition typetraits.hh:642
    \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-
    bool anyTrue(const Mask &mask)
    Whether any entry is true
    Definition simd/interface.hh:429
    \n-
    auto maskOr(const V1 &v1, const V2 &v2)
    Logic or of masks.
    Definition simd/interface.hh:499
    \n-
    V cond(M &&mask, const V &ifTrue, const V &ifFalse)
    Like the ?: operator.
    Definition simd/interface.hh:386
    \n-
    auto io(const V &v)
    construct a stream inserter
    Definition io.hh:106
    \n-
    bool allTrue(const Mask &mask)
    Whether all entries are true
    Definition simd/interface.hh:439
    \n-
    auto vio(const V &v)
    construct a stream inserter
    Definition io.hh:90
    \n-
    auto max(const V &v1, const V &v2)
    The binary maximum value over two simd objects.
    Definition simd/interface.hh:409
    \n-
    bool anyFalse(const Mask &mask)
    Whether any entry is false
    Definition simd/interface.hh:449
    \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-
    bool allFalse(const Mask &mask)
    Whether all entries are false
    Definition simd/interface.hh:459
    \n-
    auto maskAnd(const V1 &v1, const V2 &v2)
    Logic and of masks.
    Definition simd/interface.hh:509
    \n-
    typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
    Element type of some SIMD type.
    Definition simd/interface.hh:235
    \n-
    auto min(const V &v1, const V &v2)
    The binary minimum value over two simd objects.
    Definition simd/interface.hh:419
    \n-
    STL namespace.
    \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-
    typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type RebindList
    A list of types with the final element removed.
    Definition test.hh:158
    \n-
    typename Impl::IsLoop< T >::type IsLoop
    check whether a type is an instance of LoopSIMD
    Definition test.hh:162
    \n-
    Definition loop.hh:65
    \n-
    final element marker for RebindList
    Definition test.hh:145
    \n-
    Definition test.hh:164
    \n-
    void checkUnaryOps()
    Definition test.hh:1909
    \n-
    void checkBinaryOps()
    Definition test.hh:1952
    \n-
    void checkBinaryOpsScalarVector()
    Definition test.hh:1970
    \n-
    void checkType()
    Definition test.hh:1866
    \n-
    void check()
    run unit tests for simd vector type V
    Definition test.hh:1839
    \n-
    void checkBinaryOpsVectorScalar()
    Definition test.hh:1985
    \n-
    bool good() const
    whether all tests succeeded
    Definition test.hh:1859
    \n-
    void checkBinaryOpsVectorVector()
    Definition test.hh:1960
    \n-
    void checkNonOps()
    Definition test.hh:1878
    \n-
    void checkBinaryOpsVectorProxy()
    Definition test.hh:2010
    \n-
    void checkBinaryOpsProxyVector()
    Definition test.hh:2000
    \n-
    template which always yields a true value
    Definition typetraits.hh:134
    \n-
    Include file for users of the SIMD abstraction layer.
    \n+
    void put(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key, const Value &value)
    Definition propertymap.hh:92
    \n+
    Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
    Definition propertymap.hh:84
    \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,2096 +1,367 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-test.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// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_TEST_HH\n-4#define DUNE_COMMON_SIMD_TEST_HH\n-5\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\n-23#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-24#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-25#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-26#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bi_\bo_\b._\bh_\bh>\n-27#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bl_\bo_\bo_\bp_\b._\bh_\bh>\n-28#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-29#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-30#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-31#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-32\n-33namespace _\bD_\bu_\bn_\be {\n-34 namespace Simd {\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_PROPERTYMAP_HH\n+6#define DUNE_PROPERTYMAP_HH\n+7\n+8#include \n+9#include \n+10#include \n+11\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-36 namespace Impl {\n-37\n-38 template\n-39 struct LessThenComparable : std::false_type {};\n-40 template\n-41 struct LessThenComparable()\n-42 < std::declval())> > :\n-43 std::true_type\n-44 {};\n-45\n-46 template\n-47 struct CopyConstHelper\n-48 {\n-49 using type = Dst;\n-50 };\n-51 template\n-52 struct CopyConstHelper\n-53 {\n-54 using type = std::add_const_t;\n-55 };\n-56\n-57 template\n-58 struct CopyVolatileHelper\n-59 {\n-60 using type = Dst;\n-61 };\n-62 template\n-63 struct CopyVolatileHelper\n-64 {\n-65 using type = std::add_volatile_t;\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 template\n-69 struct CopyReferenceHelper\n-70 {\n-71 using type = Dst;\n-72 };\n-73 template\n-74 struct CopyReferenceHelper\n-75 {\n-76 using type = std::add_lvalue_reference_t;\n-77 };\n-78\n-79 template\n-80 struct CopyReferenceHelper\n-81 {\n-82 using type = std::add_rvalue_reference_t;\n-83 };\n-84\n-85 template\n-86 using CopyRefQual = typename CopyReferenceHelper<\n-87 typename CopyVolatileHelper<\n-88 typename CopyConstHelper<\n-89 std::decay_t,\n-90 std::remove_reference_t\n-91 >::type,\n-92 std::remove_reference_t\n-93 >::type,\n-94 Src\n-95 >::type;\n-96\n-97 template::value - 1> >\n-100 struct RemoveEnd;\n-101 template\n-102 struct RemoveEnd>\n-103 {\n-104 using Back = TypeListEntry_t::value - 1, Types>;\n-105 static_assert(std::is_same::value,\n-106 \"TypeList not terminated by proper EndMark\");\n-107 using type = TypeList...>;\n-108 };\n-109\n-110 template\n-111 struct TypeInList;\n-112\n-113 template\n-114 struct TypeInList > : std::false_type {};\n-115\n-116 template\n-117 struct TypeInList > : std::true_type {};\n-118\n-119 template\n-120 struct TypeInList,\n-121 _\bs_\bt_\bd::enable_if_t::value> > :\n-122 TypeInList >::type\n-123 {};\n-124\n-125 template\n-126 struct _\bI_\bs_\bL_\bo_\bo_\bp : std::false_type {};\n-127 template\n-128 struct _\bI_\bs_\bL_\bo_\bo_\bp > : std::true_type {};\n-129\n-130 // used inside static_assert to trick the compiler into printing a list\n-131 // of types:\n-132 //\n-133 // static_assert(debugTypes(Std::bool_constant{}), \"msg\");\n-134 //\n-135 // Should include what the type `V` expands to in the error message.\n-136 template\n-137 constexpr bool debugTypes(std::true_type) { return true; }\n-138 template\n-139 [[deprecated]]\n-140 constexpr bool debugTypes(std::false_type) { return false; }\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-142 } // namespace Impl\n-143\n-_\b1_\b4_\b5 struct _\bE_\bn_\bd_\bM_\ba_\br_\bk {};\n-147\n-156 template\n-_\b1_\b5_\b7 using _\bR_\be_\bb_\bi_\bn_\bd_\bL_\bi_\bs_\bt =\n-158 typename Impl::RemoveEnd<_\bE_\bn_\bd_\bM_\ba_\br_\bk, _\bT_\by_\bp_\be_\bL_\bi_\bs_\bt >::type;\n-159\n-161 template\n-_\b1_\b6_\b2 using _\bI_\bs_\bL_\bo_\bo_\bp = typename Impl::IsLoop::type;\n-163\n-_\b1_\b6_\b4 class _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt {\n-165 bool good_ = true;\n-166 std::ostream &log_ = std::cerr;\n-167 // records the types for which checks have started running to avoid\n-168 // infinite recursion\n-169 std::unordered_set seen_;\n-170\n-172 //\n-173 // Helper functions\n-174 //\n-175\n-176 void complain(const char *file, int line, const char *func,\n-177 const char *expr);\n-178\n-179 void complain(const char *file, int line, const char *func,\n-180 const std::string &opname, const char *expr);\n-181\n-182 // This macro is defined only within this file, do not use anywhere\n-183 // else. Doing the actual printing in an external function dramatically\n-184 // reduces memory use during compilation. Defined in such a way that\n-185 // the call will only happen for failed checks.\n-_\b1_\b8_\b6#define DUNE_SIMD_CHECK(expr) \\\n-187 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))\n-188\n-189 // the function using this macro must define a way to compute the\n-190 // operator name in DUNE_SIMD_OPNAME\n-_\b1_\b9_\b1#define DUNE_SIMD_CHECK_OP(expr) \\\n-192 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \\\n-193 DUNE_SIMD_OPNAME, #expr))\n-194\n-195 // \"cast\" into a prvalue\n-196 template\n-197 static std::decay_t prvalue(T &&t)\n-198 {\n-199 return std::forward(t);\n-200 }\n-201\n-202 // whether the vector is 42 in all lanes\n-203 template\n-204 static bool is42(const V &v)\n-205 {\n-206 bool _\bg_\bo_\bo_\bd = true;\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-208 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(v); ++l)\n-209 // need to cast in case we have a mask type\n-210 _\bg_\bo_\bo_\bd &= (_\bl_\ba_\bn_\be(l, v) == Scalar(42));\n-211\n-212 return _\bg_\bo_\bo_\bd;\n-213 }\n-214\n-215 // make a vector that contains the sequence { 1, 2, ... }\n-216 template\n-217 static V make123()\n-218 {\n-219 // initialize to avoid undefined behaviour if assigning to lane()\n-220 // involves lvalue-to-rvalue conversions, e.g. due to bitmask\n-221 // operations. Avoid using broadcast() for initialization to avoid\n-222 // test interdependencies.\n-223 V vec(Scalar(0));\n-224 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n-225 _\bl_\ba_\bn_\be(l, vec) = l + 1;\n-226 return vec;\n-227 }\n-228\n-229 // whether the vector contains the sequence { 1, 2, ... }\n-230 template\n-231 static bool is123(const V &v)\n-232 {\n-233 bool _\bg_\bo_\bo_\bd = true;\n-234\n-235 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(v); ++l)\n-236 // need to cast in case we have a mask type\n-237 _\bg_\bo_\bo_\bd &= (_\bl_\ba_\bn_\be(l, v) == Scalar(l+1));\n-238\n-239 return _\bg_\bo_\bo_\bd;\n-240 }\n-241\n-242 template\n-243 static V leftVector()\n-244 {\n-245 // Avoid using broadcast() for initialization to avoid test\n-246 // interdependencies.\n-247 V res(Scalar(0));\n-248 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(res); ++l)\n-249 _\bl_\ba_\bn_\be(l, res) = Scalar(l+1);\n-250 return res;\n-251 }\n-252\n-253 template\n-254 static V rightVector()\n-255 {\n-256 // Avoid using broadcast() for initialization to avoid test\n-257 // interdependencies.\n-258 V res(Scalar(0));\n-259 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(res); ++l)\n-260 // do not exceed number of bits in char (for shifts)\n-261 // avoid 0 (for / and %)\n-262 _\bl_\ba_\bn_\be(l, res) = Scalar((l)%7+1);\n-263 return res;\n-264 }\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-266 template\n-267 static T leftScalar()\n-268 {\n-269 return T(42);\n-270 }\n-271\n-272 template\n-273 static T rightScalar()\n-274 {\n-275 // do not exceed number of bits in char (for shifts)\n-276 // avoid 0 (for / and %)\n-277 return T(5);\n-278 }\n-279\n-280 template\n-281 using CopyRefQual = Impl::CopyRefQual;\n-282\n-283 // test whether the Op supports the operation on scalars. We do not use\n-284 // `lane()` to obtain the scalars, because that might return a proxy\n-285 // object, and we are interested in what exactly the scalar type can do,\n-286 // no a proxy that might have more overloads than needed. In addition,\n-287 // `lane()` may not preserve `const` and reference qualifiers.\n-288 template\n-289 using ScalarResult =\n-290 decltype(std::declval().\n-291 scalar(std::declval,\n-292 Vectors> >()...));\n-293\n-295 //\n-296 // Check associated types\n-297 //\n-298\n-299 template\n-300 void checkScalar()\n-301 {\n-302 // check that the type Scalar exists\n-303 using T = Scalar;\n-304\n-305 static_assert(std::is_same >::value, \"Scalar types \"\n-306 \"must not be references, and must not include \"\n-307 \"cv-qualifiers\");\n-308 [[maybe_unused]] T a{};\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 template\n-312 [[deprecated(\"Warning: please include bool in the Rebinds for \"\n-313 \"simd type V, as Masks are not checked otherwise.\")]]\n-314 void warnMissingMaskRebind(std::true_type) {}\n-315 template\n-316 void warnMissingMaskRebind(std::false_type) {}\n-317\n-318 template class RebindPrune,\n-319 template class RebindAccept, class Recurse>\n-320 void checkRebindOf(Recurse recurse)\n-321 {\n-322 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(Rebinds{}, [this,recurse](auto target) {\n-323 using T = typename decltype(target)::type;\n-324\n-325 // check that the rebound type exists\n-326 using W = Rebind;\n-327 log_ << \"Type \" << className() << \" rebound to \"\n-328 << className() << \" is \" << className() << std::endl;\n-329\n-330 static_assert(std::is_same >::value, \"Rebound \"\n-331 \"types must not be references, and must not include \"\n-332 \"cv-qualifiers\");\n-333 static_assert(lanes() == lanes(), \"Rebound types must have \"\n-334 \"the same number of lanes as the original vector \"\n-335 \"types\");\n-336 static_assert(std::is_same >::value, \"Rebound types \"\n-337 \"must have the bound-to scalar type\");\n-338\n-339 if constexpr (RebindPrune{}) {\n-340 log_ << \"Pruning check of Simd type \" << className()\n-341 << std::endl;\n-342 }\n-343 else {\n-344 using Impl::debugTypes;\n-345 static_assert(debugTypes(RebindAccept{}),\n-346 \"Rebind is W, but that is not accepted \"\n-347 \"by RebindAccept\");\n-348 recurse(MetaType{});\n-349 }\n-350 });\n-351\n-352 static_assert(std::is_same, V>, V>::value, \"A type \"\n-353 \"rebound to its own scalar type must be the same type \"\n-354 \"as the original type\");\n-355 static_assert(std::is_same, Mask >::value, \"A type \"\n-356 \"rebound to bool must be the mask type for that type\");\n-357\n-358 constexpr bool hasBool = Impl::TypeInList::value;\n-359 warnMissingMaskRebind(Std::bool_constant{});\n-360 }\n-361\n-363 //\n-364 // Fundamental checks\n-365 //\n-366\n-367 template\n-368 void checkLanes()\n-369 {\n-370 // check lanes\n-371 static_assert(std::is_same())>::value,\n-372 \"return type of lanes() should be std::size_t\");\n-373 static_assert(std::is_same::value,\n-374 \"return type of lanes(V{}) should be std::size_t\");\n-375\n-376 // the result of lanes() must be constexpr\n-377 [[maybe_unused]] constexpr auto size = lanes();\n-378 // but the result of lanes(vec) does not need to be constexpr\n-379 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(lanes() == _\bl_\ba_\bn_\be_\bs(V{}));\n-380 }\n-381\n-382 template\n-383 void checkDefaultConstruct()\n-384 {\n-385 { [[maybe_unused]] V vec; }\n-386 { [[maybe_unused]] V vec{}; }\n-387 { [[maybe_unused]] V vec = {}; }\n-388 }\n-389\n-390 template\n-391 void checkLane()\n-392 {\n-393 // Avoid using broadcast() for initialization to avoid test\n-394 // interdependencies.\n-395 V vec(Scalar(0));\n-396 // check lane() on mutable lvalues\n-397 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n-398 _\bl_\ba_\bn_\be(l, vec) = l + 1;\n-399 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n-400 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bl_\ba_\bn_\be(l, vec) == Scalar(l + 1));\n-401 using MLRes = decltype(_\bl_\ba_\bn_\be(0, vec));\n-402 static_assert(std::is_same&>::value ||\n-403 std::is_same >::value,\n-404 \"Result of lane() on a mutable lvalue vector must \"\n-405 \"either be a mutable reference to a scalar of that \"\n-406 \"vector or a proxy object (which itself may not be a \"\n-407 \"reference nor const).\");\n-408\n-409 // check lane() on const lvalues\n-410 const V &vec2 = vec;\n-411 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n-412 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bl_\ba_\bn_\be(l, vec2) == Scalar(l + 1));\n-413 using CLRes = decltype(_\bl_\ba_\bn_\be(0, vec2));\n-414 static_assert(std::is_same&>::value ||\n-415 std::is_same >::value,\n-416 \"Result of lane() on a const lvalue vector must \"\n-417 \"either be a const lvalue reference to a scalar of that \"\n-418 \"vector or a proxy object (which itself may not be a \"\n-419 \"reference nor const).\");\n-420 static_assert(!std::is_assignable >::value,\n-421 \"Result of lane() on a const lvalue vector must not be \"\n-422 \"assignable from a scalar.\");\n-423\n-424 // check lane() on rvalues\n-425 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n-426 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bl_\ba_\bn_\be(l, prvalue(vec)) == Scalar(l + 1));\n-427 using RRes = decltype(_\bl_\ba_\bn_\be(0, prvalue(vec)));\n-428 // TODO: do we really want to allow Scalar&& here? If we allow it,\n-429 // then `auto &&res = lane(0, vec*vec);` creates a dangling reference,\n-430 // and the scalar (and even the vector types) are small enough to be\n-431 // passed in registers anyway. On the other hand, the only comparable\n-432 // accessor function in the standard library that I can think of is\n-433 // std::get(), and that does return an rvalue reference in this\n-434 // situation. However, that cannot assume anything about the size of\n-435 // the returned types.\n-436 static_assert(std::is_same >::value ||\n-437 std::is_same&&>::value,\n-438 \"Result of lane() on a rvalue vector V must be \"\n-439 \"Scalar or Scalar&&.\");\n-440 // Can't assert non-assignable, fails for any typical class,\n-441 // e.g. std::complex<>. Would need to return const Scalar or const\n-442 // Scalar&&, which would inhibit moving from the return value.\n-443 // static_assert(!std::is_assignable >::value,\n-444 // \"Result of lane() on a rvalue vector must not be \"\n-445 // \"assignable from a scalar.\");\n-446 }\n-447\n-448 // check non-default constructors\n-449 template\n-450 void checkCopyMoveConstruct()\n-451 {\n-452 // elided copy/move constructors\n-453 { V vec (make123()); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-454 { V vec = make123() ; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-455 { V vec {make123()}; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-456 { V vec = {make123()}; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-457\n-458 // copy constructors\n-459 { V ref(make123()); V vec (ref);\n-460 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n-461 { V ref(make123()); V vec = ref ;\n-462 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n-463 { V ref(make123()); V vec {ref};\n-464 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n-465 { V ref(make123()); V vec = {ref};\n-466 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n-467 { const V ref(make123()); V vec (ref);\n-468 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-469 { const V ref(make123()); V vec = ref ;\n-470 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-471 { const V ref(make123()); V vec {ref};\n-472 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-473 { const V ref(make123()); V vec = {ref};\n-474 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-475\n-476 // move constructors\n-477 { V ref(make123()); V vec (std::move(ref));\n-478 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-479 { V ref(make123()); V vec = std::move(ref) ;\n-480 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-481 { V ref(make123()); V vec {std::move(ref)};\n-482 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-483 { V ref(make123()); V vec = {std::move(ref)};\n-484 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-485 }\n-486\n-487 template\n-488 void checkBroadcastVectorConstruct()\n-489 {\n-490 // broadcast copy constructors\n-491 { Scalar ref = 42; V vec (ref);\n-492 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n-493 { Scalar ref = 42; V vec = ref ;\n-494 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n-495 // { Scalar ref = 42; V vec {ref};\n-496 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n-497 // { Scalar ref = 42; V vec = {ref};\n-498 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n-499 { const Scalar ref = 42; V vec (ref);\n-500 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-501 { const Scalar ref = 42; V vec = ref ;\n-502 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-503 // { const Scalar ref = 42; V vec {ref};\n-504 // DUNE_SIMD_CHECK(is42(vec)); }\n-505 // { const Scalar ref = 42; V vec = {ref};\n-506 // DUNE_SIMD_CHECK(is42(vec)); }\n-507\n-508 // broadcast move constructors\n-509 { Scalar ref = 42; V vec (std::move(ref));\n-510 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-511 { Scalar ref = 42; V vec = std::move(ref) ;\n-512 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-513 // { Scalar ref = 42; V vec {std::move(ref)};\n-514 // DUNE_SIMD_CHECK(is42(vec)); }\n-515 // { Scalar ref = 42; V vec = {std::move(ref)};\n-516 // DUNE_SIMD_CHECK(is42(vec)); }\n-517 }\n-518\n-519 template\n-520 void checkBroadcastMaskConstruct()\n-521 {\n-522 // broadcast copy constructors\n-523 { Scalar ref = 42; V vec (ref);\n-524 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n-525 // { Scalar ref = 42; V vec = ref ;\n-526 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n-527 { Scalar ref = 42; V vec {ref};\n-528 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42)); }\n-529 // { Scalar ref = 42; V vec = {ref};\n-530 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n-531 { const Scalar ref = 42; V vec (ref);\n-532 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-533 // { const Scalar ref = 42; V vec = ref ;\n-534 // DUNE_SIMD_CHECK(is42(vec)); }\n-535 { const Scalar ref = 42; V vec {ref};\n-536 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-537 // { const Scalar ref = 42; V vec = {ref};\n-538 // DUNE_SIMD_CHECK(is42(vec)); }\n-539\n-540 // broadcast move constructors\n-541 { Scalar ref = 42; V vec (std::move(ref));\n-542 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-543 // { Scalar ref = 42; V vec = std::move(ref) ;\n-544 // DUNE_SIMD_CHECK(is42(vec)); }\n-545 { Scalar ref = 42; V vec {std::move(ref)};\n-546 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec)); }\n-547 // { Scalar ref = 42; V vec = {std::move(ref)};\n-548 // DUNE_SIMD_CHECK(is42(vec)); }\n-549 }\n-550\n-551 // check the implCast function\n-552 template\n-553 void checkImplCast()\n-554 {\n-555 { // lvalue arg\n-556 FromV fromVec = make123();\n-557 auto toVec = implCast(fromVec);\n-558 static_assert(std::is_same::value,\n-559 \"Unexpected result type for implCast(FromV&)\");\n-560 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(fromVec));\n-561 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(toVec));\n-562 }\n-563\n-564 { // const lvalue arg\n-565 const FromV fromVec = make123();\n-566 auto toVec = implCast(fromVec);\n-567 static_assert(std::is_same::value,\n-568 \"Unexpected result type for implCast(const \"\n-569 \"FromV&)\");\n-570 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(toVec));\n-571 }\n-572\n-573 { // rvalue arg\n-574 auto toVec = implCast(make123());\n-575 static_assert(std::is_same::value,\n-576 \"Unexpected result type for implCast(FromV&&)\");\n-577 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(toVec));\n-578 }\n-579 }\n-580\n-581 // check the implCast function\n-582 template\n-583 void checkImplCast()\n-584 {\n-585 // check against LoopSIMD\n-586 using LoopV = _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD_\b<_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b>, lanes()>;\n-587\n-588 checkImplCast();\n-589 checkImplCast();\n-590 checkImplCast();\n-591 }\n-592\n-593 // check the broadcast function\n-594 template\n-595 void checkBroadcast()\n-596 {\n-597 // broadcast function\n-598 { // lvalue arg\n-599 Scalar ref = 42;\n-600 auto vec = broadcast(ref);\n-601 static_assert(std::is_same::value,\n-602 \"Unexpected result type for broadcast()\");\n-603 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n-604 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(ref == Scalar(42));\n-605 }\n-606\n-607 { // const lvalue arg\n-608 const Scalar ref = 42;\n-609 auto vec = broadcast(ref);\n-610 static_assert(std::is_same::value,\n-611 \"Unexpected result type for broadcast()\");\n-612 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n-613 }\n-614\n-615 { // rvalue arg\n-616 auto vec = broadcast(Scalar(42));\n-617 static_assert(std::is_same::value,\n-618 \"Unexpected result type for broadcast()\");\n-619 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n-620 }\n-621\n-622 { // int arg\n-623 auto vec = broadcast(42);\n-624 static_assert(std::is_same::value,\n-625 \"Unexpected result type for broadcast()\");\n-626 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n-627 }\n-628\n-629 { // double arg\n-630 auto vec = broadcast(42.0);\n-631 static_assert(std::is_same::value,\n-632 \"Unexpected result type for broadcast()\");\n-633 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is42(vec));\n-634 }\n-635 }\n-636\n-637 template\n-638 void checkBracedAssign()\n-639 {\n-640 // copy assignment\n-641 { V ref = make123(); V vec; vec = {ref};\n-642 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n-643 { const V ref = make123(); V vec; vec = {ref};\n-644 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(ref)); }\n-645\n-646 // move assignment\n-647 { V vec; vec = {make123()}; _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(is123(vec)); }\n-648 }\n-649\n-650 template\n-651 void checkBracedBroadcastAssign()\n-652 {\n-653 // nothing works here\n-654 // // broadcast copy assignment\n-655 // { Scalar ref = 42; V vec; vec = {ref};\n-656 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); }\n-657 // { const Scalar ref = 42; V vec; vec = {ref};\n-658 // DUNE_SIMD_CHECK(is42(vec)); }\n-659\n-660 // // broadcast move assignment\n-661 // { Scalar ref = 42; V vec; vec = {std::move(ref)};\n-662 // DUNE_SIMD_CHECK(is42(vec)); }\n-663 }\n-664\n-666 //\n-667 // checks for unary operators\n-668 //\n-669\n-_\b6_\b7_\b0#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL) \\\n-671 struct OpPostfix##NAME \\\n-672 { \\\n-673 template \\\n-674 auto operator()(V&& v) const \\\n-675 -> decltype(std::forward(v) SYMBOL) \\\n-676 { \\\n-677 return std::forward(v) SYMBOL; \\\n-678 } \\\n-679 }\n-680\n-_\b6_\b8_\b1#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL) \\\n-682 struct OpPrefix##NAME \\\n-683 { \\\n-684 template \\\n-685 auto operator()(V&& v) const \\\n-686 -> decltype(SYMBOL std::forward(v)) \\\n-687 { \\\n-688 return SYMBOL std::forward(v); \\\n-689 } \\\n-690 }\n-691\n-692 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(Decrement, -- );\n-693 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP(Increment, ++ );\n-694\n-695 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Decrement, -- );\n-696 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Increment, ++ );\n-697\n-698 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Plus, + );\n-699 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (Minus, - );\n-700 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (LogicNot, ! );\n-701 // Do not warn about ~ being applied to bool. (1) Yes, doing that is\n-702 // weird, but we do want to test the weird stuff too. (2) It avoids\n-703 // running into on\n-704 // g++-7.0 through 7.2. Also, ignore -Wpragmas to not warn about an\n-705 // unknown -Wbool-operation on compilers that do not know that option.\n-706#pragma GCC diagnostic push\n-707#pragma GCC diagnostic ignored \"-Wpragmas\"\n-708#pragma GCC diagnostic ignored \"-Wunknown-warning-option\" // clang 6.0.1\n-709#pragma GCC diagnostic ignored \"-Wbool-operation\"\n-710 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP (BitNot, ~ );\n-711#pragma GCC diagnostic pop\n-712\n-713#undef DUNE_SIMD_POSTFIX_OP\n-714#undef DUNE_SIMD_PREFIX_OP\n-715\n-716 template\n-717 std::enable_if_t<\n-718 IsCallable())))>::value>\n-719 checkUnaryOpV(Op op)\n-720 {\n-721#define DUNE_SIMD_OPNAME (className())\n-722 // arguments\n-723 auto val = leftVector>();\n-724\n-725 // copy the arguments in case V is a references\n-726 auto arg = val;\n-727 auto &&result = op(static_cast(arg));\n-728 using T = _\bS_\bc_\ba_\bl_\ba_\br >;\n-729 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(val); ++l)\n-730 {\n-731 // `op` might promote the argument. This is a problem if the\n-732 // argument of the operation on the right of the `==` is\n-733 // e.g. `(unsigned short)1` and the operation is e.g. unary `-`.\n-734 // Then the argument is promoted to `int` before applying the\n-735 // negation, and the result is `(int)-1`. However, the left side of\n-736 // the `==` is still `(unsigned short)-1`, which typically is the\n-737 // same as `(unsigned short)65535`. The `==` promotes the left side\n-738 // before comparing, so that becomes `(int)65535`. It will then\n-739 // compare `(int)65535` and `(int)-1` and rightly declare them to be\n-740 // not equal.\n-741\n-742 // To work around this, we explicitly convert the right side of the\n-743 // `==` to the scalar type before comparing.\n-744 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n-745 (_\bl_\ba_\bn_\be(l, result)\n-746 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(val)))));\n-747 }\n-748 // op might modify val, verify that any such modification also happens\n-749 // in the vector case\n-750 for(std::size_t l = 0; l < lanes >(); ++l)\n-751 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, val) == _\bl_\ba_\bn_\be(l, arg));\n-752#undef DUNE_SIMD_OPNAME\n-753 }\n-754\n-755 template\n-756 std::enable_if_t<\n-757 not IsCallable())))>::value>\n-758 checkUnaryOpV(Op op)\n-759 {\n-760 // log_ << \"No \" << className())))>()\n-761 // << std::endl\n-762 // << \" ==> Not checking \" << className() << std::endl;\n-763 }\n-764\n-765 template\n-766 void checkUnaryOpsV(Op op)\n-767 {\n-768 checkUnaryOpV(op);\n-769 checkUnaryOpV(op);\n-770 checkUnaryOpV(op);\n-771 }\n-772\n-774 //\n-775 // checks for binary operators\n-776 //\n-777\n-778 // The operators contain an `operator()`, which will be invoked for both\n-779 // scalar and vector arguments. The function `scalar()` is used the\n-780 // test whether the scalar types support the operation (via\n-781 // `ScalarResult`). The difference is that `scalar()` should only ever\n-782 // receive `const`-ref-qualified version of `Scalar`, while the\n-783 // `operator()` may also be called with proxies representing scalars.\n-_\b7_\b8_\b4#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL) \\\n-785 struct OpInfix##NAME \\\n-786 { \\\n-787 template \\\n-788 decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n-789 { \\\n-790 return std::forward(v1) SYMBOL std::forward(v2); \\\n-791 } \\\n-792 template \\\n-793 auto scalar(S1&& s1, S2&& s2) const \\\n-794 -> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n-795 }\n-796\n-797 // for assign ops, accept only non-const lvalue arguments for scalars.\n-798 // This is needed for class scalars (e.g. std::complex) because\n-799 // non-const class rvalues are actually usually assignable. Though that\n-800 // assignment happens to a temporary, and thus is lost. Except that the\n-801 // tests would bind the result of the assignment to a reference. And\n-802 // because that result is returned from a function by reference, even\n-803 // though it is a temporary passed as an argument to that function,\n-804 // accessing the result later is undefined behaviour.\n-_\b8_\b0_\b5#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL) \\\n-806 struct OpInfix##NAME \\\n-807 { \\\n-808 template \\\n-809 decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n-810 { \\\n-811 return std::forward(v1) SYMBOL std::forward(v2); \\\n-812 } \\\n-813 template \\\n-814 auto scalar(S1& s1, S2&& s2) const \\\n-815 -> decltype(s1 SYMBOL std::forward(s2)); \\\n-816 }\n-817\n-_\b8_\b1_\b8#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL) \\\n-819 struct OpInfix##NAME \\\n-820 { \\\n-821 template \\\n-822 decltype(auto) operator()(V1&& v1, V2&& v2) const \\\n-823 { \\\n-824 return Simd::REPLFN(std::forward(v1), std::forward(v2)); \\\n-825 } \\\n-826 template \\\n-827 auto scalar(S1&& s1, S2&& s2) const \\\n-828 -> decltype(std::forward(s1) SYMBOL std::forward(s2)); \\\n-829 }\n-830\n-831 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Mul, * );\n-832 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Div, / );\n-833 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Remainder, % );\n-834\n-835 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Plus, + );\n-836 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Minus, - );\n-837\n-838 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(LeftShift, << );\n-839 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(RightShift, >> );\n-840\n-841 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Less, < );\n-842 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Greater, > );\n-843 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(LessEqual, <= );\n-844 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(GreaterEqual, >= );\n-845\n-846 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(Equal, == );\n-847 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(NotEqual, != );\n-848\n-849 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(BitAnd, & );\n-850 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(BitXor, ^ );\n-851 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP(BitOr, | );\n-852\n-853 // Those are not supported in any meaningful way by vectorclass\n-854 // We need to test replacement functions maskAnd() and maskOr() instead.\n-855 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP(LogicAnd, _\bm_\ba_\bs_\bk_\bA_\bn_\bd, && );\n-856 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP(LogicOr, _\bm_\ba_\bs_\bk_\bO_\br, || );\n-857\n-858 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(Assign, = );\n-859 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignMul, *= );\n-860 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignDiv, /= );\n-861 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignRemainder, %= );\n-862 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignPlus, += );\n-863 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignMinus, -= );\n-864 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignLeftShift, <<=);\n-865 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignRightShift, >>=);\n-866 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignAnd, &= );\n-867 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignXor, ^= );\n-868 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(AssignOr, |= );\n-869\n-870#undef DUNE_SIMD_INFIX_OP\n-871#undef DUNE_SIMD_REPL_OP\n-872#undef DUNE_SIMD_ASSIGN_OP\n-873\n-874 // just used as a tag\n-875 struct OpInfixComma {};\n-876\n-877 template\n-878 void checkCommaOp(const std::decay_t &val1,\n-879 const std::decay_t &val2)\n-880 {\n-881#define DUNE_SIMD_OPNAME (className())\n-882 static_assert(std::is_same(),\n-883 std::declval())), T2>::value,\n-884 \"Type and value category of the comma operator must \"\n-885 \"match that of the second operand\");\n-886\n-887 // copy the arguments in case T1 or T2 are references\n-888 auto arg1 = val1;\n-889 auto arg2 = val2;\n-890 // Do not warn that the left side of the comma operator is unused.\n-891 // Seems to work for g++-4.9 and clang++-3.8. Appears to be harmless\n-892 // for icpc (14 and 17), and icpc does not seem to issue a warning\n-893 // anyway.\n-894#pragma GCC diagnostic push\n-895#pragma GCC diagnostic ignored \"-Wunused-value\"\n-896 auto &&result = (static_cast(arg1),\n-897 static_cast(arg2));\n-898#pragma GCC diagnostic pop\n-899 if(std::is_reference::value)\n-900 {\n-901 // comma should return the same object as the second argument for\n-902 // lvalues and xvalues\n-903 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(&result == &arg2);\n-904 // it should not modify any arguments\n-905 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(val1 == arg1));\n-906 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(val2 == arg2));\n-907 }\n-908 else\n-909 {\n-910 // comma should return the same value as the second argument for\n-911 // prvalues\n-912 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(result == arg2));\n-913 // it should not modify any arguments\n-914 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\ba_\bl_\bl_\bT_\br_\bu_\be(val1 == arg1));\n-915 // second argument is a prvalue, any modifications happen to a\n-916 // temporary and we can't detect them\n-917 }\n-918#undef DUNE_SIMD_OPNAME\n-919 }\n-920\n-922 //\n-923 // checks for vector-vector binary operations\n-924 //\n-925\n-926 // We check the following candidate operation\n-927 //\n-928 // vopres = vop1 @ vop2\n-929 //\n-930 // against the reference operation\n-931 //\n-932 // arefres[l] = aref1[l] @ aref2[l] foreach l\n-933 //\n-934 // v... variables are simd-vectors and a... variables are arrays. The\n-935 // operation may modify the operands, but if is does the modification\n-936 // needs to happen in both the candidate and the reference.\n-937 //\n-938 // We do the following checks:\n-939 // 1. lanes(vopres) == lanes(vop1)\n-940 // 2. lane(l, vopres) == arefres[l] foreach l\n-941 // 3. lane(l, vop1) == aref1[l] foreach l\n-942 // 4. lane(l, vop2) == aref2[l] foreach l\n-943 template\n-944 std::enable_if_t >\n-945 checkBinaryOpVV(MetaType, MetaType, Op op)\n-946 {\n-947#define DUNE_SIMD_OPNAME (className())\n-948 static_assert(std::is_same, std::decay_t >::value,\n-949 \"Internal testsystem error: called with two types that \"\n-950 \"don't decay to the same thing\");\n-951\n-952 // reference arguments\n-953 auto vref1 = leftVector>();\n-954 auto vref2 = rightVector>();\n-955\n-956 // candidate arguments\n-957 auto vop1 = vref1;\n-958 auto vop2 = vref2;\n-959\n-960 // candidate operation\n-961 auto &&vopres = op(static_cast(vop1), static_cast(vop2));\n-962 using VR = decltype(vopres);\n-963\n-964 // check 1. lanes(vopres) == lanes(vop1)\n-965 static_assert(lanes >() == _\bl_\ba_\bn_\be_\bs >(),\n-966 \"The result must have the same number of lanes as the \"\n-967 \"operands.\");\n-968\n-969 // do the reference operation, and simultaneously\n-970 // check 2. lane(l, vopres) == arefres[l] foreach l\n-971 using T = Scalar >;\n-972 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vopres)))\n-973 {\n-974 // see the lengthy comment in `checkUnaryOpV()` as to why the\n-975 // `static_cast` around the `op()` is necessary\n-976 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n-977 (_\bl_\ba_\bn_\be(l, vopres)\n-978 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(vref1)),\n-979 _\bl_\ba_\bn_\be(l, static_cast(vref2)))));\n-980 }\n-981\n-982 // check 3. lane(l, vop1) == aref1[l] foreach l\n-983 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop1)))\n-984 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop1) == _\bl_\ba_\bn_\be(l, vref1));\n-985\n-986 // check 4. lane(l, vop2) == aref2[l] foreach l\n-987 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop2)))\n-988 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop2) == _\bl_\ba_\bn_\be(l, vref2));\n-989\n-990#undef DUNE_SIMD_OPNAME\n-991 }\n-992\n-993 template\n-994 std::enable_if_t >\n-995 checkBinaryOpVV(MetaType, MetaType, Op op)\n-996 {\n-997 // log_ << \"No \" << className())),\n-998 // decltype(lane(0, std::declval())))>()\n-999 // << std::endl\n-1000 // << \" ==> Not checking \" << className() << std::endl;\n-1001 }\n-1002\n-1003 template\n-1004 void checkBinaryOpVV(MetaType, MetaType, OpInfixComma)\n-1005 {\n-1006 static_assert(std::is_same, std::decay_t >::value,\n-1007 \"Internal testsystem error: called with two types that \"\n-1008 \"don't decay to the same thing\");\n-1009\n-1010 checkCommaOp(leftVector>(),\n-1011 rightVector>());\n-1012 }\n-1013\n-1015 //\n-1016 // checks for vector-scalar binary operations\n-1017 //\n-1018\n-1019 // We check the following candidate operation\n-1020 //\n-1021 // vopres = vop1 @ sop2\n-1022 //\n-1023 // against the reference operation\n-1024 //\n-1025 // arefres[l] = aref1[l] @ sref2 foreach l\n-1026 //\n-1027 // v... variables are simd-vectors, a... variables are arrays, and\n-1028 // s... variables are scalars. The operation may modify the left\n-1029 // operand, but if is does the modifications needs to happen in both the\n-1030 // candidate and the reference.\n-1031 //\n-1032 // We do the following checks:\n-1033 // 1. lanes(vopres) == lanes(vop1)\n-1034 // 2. lane(l, vopres) == arefres[l] foreach l\n-1035 // 3. lane(l, vop1) == aref1[l] foreach l\n-1036 // 4. sop2 is never modified\n-1037 // 5. sref2 is never modified\n-1038 //\n-1039 // In fact, if the property \"sref2 is never modified\" is violated that\n-1040 // means the operation is unsuitable for an automatic broadcast of the\n-1041 // second operand and should not be checked. There are no operations in\n-1042 // the standard where the second operand is modified like this, but\n-1043 // there are operations where the first operand is modified -- and this\n-1044 // check is used for those ops as well by exchanging the first and second\n-1045 // argument below.\n-1046\n-1047 template\n-1048 std::enable_if_t >\n-1049 checkBinaryOpVS(MetaType, MetaType, Op op)\n-1050 {\n-1051#define DUNE_SIMD_OPNAME (className())\n-1052 static_assert(std::is_same >,\n-1053 std::decay_t >::value,\n-1054 \"Internal testsystem error: called with a scalar that \"\n-1055 \"does not match the vector type.\");\n-1056\n-1057 // initial values\n-1058 auto sinit2 = rightScalar>();\n-1059\n-1060 // reference arguments\n-1061 auto vref1 = leftVector>();\n-1062 auto sref2 = sinit2;\n-1063\n-1064 // candidate arguments\n-1065 auto vop1 = vref1;\n-1066 auto sop2 = sref2;\n-1067\n-1068 // candidate operation\n-1069 auto &&vopres = op(static_cast(vop1), static_cast(sop2));\n-1070 using VR = decltype(vopres);\n-1071\n-1072 // check 1. lanes(vopres) == lanes(vop1)\n-1073 static_assert(lanes >() == _\bl_\ba_\bn_\be_\bs >(),\n-1074 \"The result must have the same number of lanes as the \"\n-1075 \"operands.\");\n-1076\n-1077 // check 4. sop2 is never modified\n-1078 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(sop2 == sinit2);\n-1079\n-1080 // do the reference operation, and simultaneously check 2. and 5.\n-1081 using T = _\bS_\bc_\ba_\bl_\ba_\br >;\n-1082 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vopres)))\n-1083 {\n-1084 // check 2. lane(l, vopres) == arefres[l] foreach l\n-1085 // see the lengthy comment in `checkUnaryOpV()` as to why the\n-1086 // `static_cast` around the `op()` is necessary\n-1087 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n-1088 (_\bl_\ba_\bn_\be(l, vopres)\n-1089 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(vref1)),\n-1090 static_cast(sref2) )));\n-1091 // check 5. sref2 is never modified\n-1092 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(sref2 == sinit2);\n-1093 }\n-1094\n-1095 // check 3. lane(l, vop1) == aref1[l] foreach l\n-1096 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop1)))\n-1097 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop1) == _\bl_\ba_\bn_\be(l, vref1));\n-1098\n-1099#undef DUNE_SIMD_OPNAME\n-1100 }\n-1101\n-1102 template\n-1103 std::enable_if_t >\n-1104 checkBinaryOpVS(MetaType, MetaType, Op op)\n-1105 {\n-1106 // log_ << \"No \"\n-1107 // << className())), T2)>()\n-1108 // << std::endl\n-1109 // << \" ==> Not checking \" << className() << std::endl;\n-1110 }\n-1111\n-1112 template\n-1113 void checkBinaryOpVS(MetaType, MetaType, OpInfixComma)\n-1114 {\n-1115 static_assert(std::is_same >,\n-1116 std::decay_t >::value,\n-1117 \"Internal testsystem error: called with a scalar that \"\n-1118 \"does not match the vector type.\");\n-1119\n-1120 checkCommaOp(leftVector>(),\n-1121 rightScalar>());\n-1122 }\n-1123\n-1125 //\n-1126 // cross-check scalar-vector binary operations against vector-vector\n-1127 //\n-1128\n-1129 // We check the following candidate operation\n-1130 //\n-1131 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)\n-1132 //\n-1133 // against the reference operation\n-1134 //\n-1135 // vrefres = vref1 @ sref2\n-1136 //\n-1137 // v... variables are simd-vectors, a... variables are arrays, and\n-1138 // s... variables are scalars.\n-1139 //\n-1140 // We could check the following properties\n-1141 // 1. lanes(vopres) == lanes(vop1)\n-1142 // 2. lane(l, vopres) == lane(l, vrefres) foreach l\n-1143 // 3. lane(l, vop1) == lane(l, vref1) foreach l\n-1144 // but these are given by checking the operation against the scalar\n-1145 // operation in the vector@vector and vector@scalar cases above.\n-1146 //\n-1147 // The only thing left to check is:\n-1148 // 4. lane(l, vop2) foreach l is never modified\n-1149\n-1150 template\n-1151 std::enable_if_t >\n-1152 checkBinaryOpVVAgainstVS(MetaType, MetaType, Op op)\n-1153 {\n-1154#define DUNE_SIMD_OPNAME (className())\n-1155 static_assert(std::is_same >,\n-1156 std::decay_t >::value,\n-1157 \"Internal testsystem error: called with a scalar that \"\n-1158 \"does not match the vector type.\");\n-1159\n-1160 // initial values\n-1161 auto sinit2 = rightScalar>();\n-1162\n-1163 // reference arguments\n-1164 auto vop1 = leftVector>();\n-1165 using V2 = CopyRefQual;\n-1166 std::decay_t vop2(sinit2);\n-1167\n-1168 // candidate operation\n-1169 op(static_cast(vop1), static_cast(vop2));\n-1170\n-1171 // 4. lane(l, vop2) foreach l is never modified\n-1172 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop2)))\n-1173 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop2) == sinit2);\n-1174\n-1175#undef DUNE_SIMD_OPNAME\n-1176 }\n-1177\n-1178 template\n-1179 std::enable_if_t >\n-1180 checkBinaryOpVVAgainstVS(MetaType, MetaType, Op op)\n-1181 {\n-1182 // log_ << \"No \"\n-1183 // << className())), T2)>()\n-1184 // << std::endl\n-1185 // << \" ==> Not checking \" << className() << std::endl;\n-1186 }\n-1187\n-1188 template\n-1189 void checkBinaryOpVVAgainstVS(MetaType, MetaType, OpInfixComma)\n-1190 { }\n-1191\n-1193 //\n-1194 // checks for vector-proxy binary operations\n-1195 //\n-1196\n-1197 // We check the following candidate operation\n-1198 //\n-1199 // vopres = vop1 @ pop2\n-1200 //\n-1201 // against the reference operation\n-1202 //\n-1203 // arefres[l] = aref1[l] @ sref2 foreach l\n-1204 //\n-1205 // v... variables are simd-vectors, a... variables are arrays,\n-1206 // p... variables are proxies of simd-vector entries and s... variables\n-1207 // are scalars. The operation may modify the left operand, but if is\n-1208 // does the modifications needs to happen in both the candidate and the\n-1209 // reference.\n-1210 //\n-1211 // We do the following checks:\n-1212 // 1. lanes(vopres) == lanes(vop1)\n-1213 // 2. lane(l, vopres) == arefres[l] foreach l\n-1214 // 3. lane(l, vop1) == aref1[l] foreach l\n-1215 // 4. pop2 is never modified\n-1216 // 5. sref2 is never modified\n-1217 //\n-1218 // In fact, if the property \"sref2 is never modified\" is violated that\n-1219 // means the operation is unsuitable for an automatic broadcast of the\n-1220 // second operand and should not be checked. There are no operations in\n-1221 // the standard where the second operand is modified like this, but\n-1222 // there are operations where the first operand is modified -- and this\n-1223 // check is used for those ops as well by exchanging the first and second\n-1224 // argument below.\n-1225\n-1226 template\n-1227 std::enable_if_t >\n-1228 checkBinaryOpVP(MetaType, MetaType, Op op)\n-1229 {\n-1230 using P2 = decltype(_\bl_\ba_\bn_\be(0, std::declval()));\n-1231 using T2 = CopyRefQual, V2>;\n-1232#define DUNE_SIMD_OPNAME (className())\n-1233 static_assert(std::is_same, Scalar >::value,\n-1234 \"Internal testsystem error: called with two vector \"\n-1235 \"types whose scalar types don't match.\");\n-1236\n-1237 // initial values\n-1238 auto sinit2 = rightScalar>();\n-1239\n-1240 // reference arguments\n-1241 auto vref1 = leftVector>();\n-1242 auto sref2 = sinit2;\n-1243\n-1244 // candidate arguments\n-1245 auto vop1 = vref1;\n-1246 auto vop2 = std::decay_t(Scalar(0));\n-1247 _\bl_\ba_\bn_\be(0, vop2) = sref2; // pop2 is just a name for `lane(0, vop2)`\n-1248\n-1249 // candidate operation\n-1250 auto &&vopres =\n-1251 op(static_cast(vop1), _\bl_\ba_\bn_\be(0, static_cast(vop2)));\n-1252 using VR = decltype(vopres);\n-1253\n-1254 // check 1. lanes(vopres) == lanes(vop1)\n-1255 static_assert(lanes >() == _\bl_\ba_\bn_\be_\bs >(),\n-1256 \"The result must have the same number of lanes as the \"\n-1257 \"operands.\");\n-1258\n-1259 // check 4. pop2 is never modified\n-1260 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(0, vop2) == sinit2);\n-1261\n-1262 // do the reference operation, and simultaneously check 2. and 5.\n-1263 using T = _\bS_\bc_\ba_\bl_\ba_\br;\n-1264 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vopres)))\n-1265 {\n-1266 // check 2. lane(l, vopres) == arefres[l] foreach l\n-1267 // see the lengthy comment in `checkUnaryOpV()` as to why the\n-1268 // `static_cast` around the `op()` is necessary\n-1269 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n-1270 (_\bl_\ba_\bn_\be(l, vopres)\n-1271 == static_cast(op(_\bl_\ba_\bn_\be(l, static_cast(vref1)),\n-1272 static_cast(sref2) )));\n-1273 // check 5. sref2 is never modified\n-1274 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(sref2 == sinit2);\n-1275 }\n-1276\n-1277 // check 3. lane(l, vop1) == aref1[l] foreach l\n-1278 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vop1)))\n-1279 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP(_\bl_\ba_\bn_\be(l, vop1) == _\bl_\ba_\bn_\be(l, vref1));\n-1280\n-1281#undef DUNE_SIMD_OPNAME\n-1282 }\n-1283\n-1284 template\n-1285 std::enable_if_t >\n-1286 checkBinaryOpVP(MetaType, MetaType, Op op)\n-1287 {\n-1288 // log_ << \"No \"\n-1289 // << className())), T2)>()\n-1290 // << std::endl\n-1291 // << \" ==> Not checking \" << className() << std::endl;\n-1292 }\n-1293\n-1294 template\n-1295 void checkBinaryOpVP(MetaType, MetaType, OpInfixComma)\n-1296 {\n-1297 // Don't really know how to check comma operator for proxies\n-1298 }\n-1299\n-1301 //\n-1302 // checks for (scalar/proxy)-vector binary operations\n-1303 //\n-1304\n-1305 template\n-1306 struct OpInfixSwappedArgs\n-1307 {\n-1308 Op orig;\n-1309\n-1310 template\n-1311 decltype(auto) operator()(V1&& v1, V2&& v2) const\n-1312 {\n-1313 return orig(std::forward(v2), std::forward(v1));\n-1314 }\n-1315 template\n-1316 auto scalar(S1&& s1, S2&& s2) const\n-1317 -> decltype(orig.scalar(std::forward(s2), std::forward(s1)));\n-1318 };\n-1319\n-1320 template\n-1321 void checkBinaryOpSV(MetaType t1, MetaType v2, Op op)\n-1322 {\n-1323 checkBinaryOpVS(v2, t1, OpInfixSwappedArgs{op});\n-1324 }\n-1325\n-1326 template\n-1327 void checkBinaryOpSV(MetaType, MetaType, OpInfixComma)\n-1328 {\n-1329 static_assert(std::is_same,\n-1330 Scalar > >::value,\n-1331 \"Internal testsystem error: called with a scalar that \"\n-1332 \"does not match the vector type.\");\n-1333\n-1334 checkCommaOp(leftScalar>(),\n-1335 rightVector>());\n-1336 }\n-1337\n-1338 template\n-1339 void checkBinaryOpPV(MetaType v1, MetaType v2, Op op)\n-1340 {\n-1341 checkBinaryOpVP(v2, v1, OpInfixSwappedArgs{op});\n-1342 }\n-1343\n-1344 template\n-1345 void checkBinaryOpPV(MetaType, MetaType, OpInfixComma)\n-1346 {\n-1347 // Don't really know how to check comma operator for proxies\n-1348 }\n-1349\n-1351 //\n-1352 // cross-check scalar-vector binary operations against vector-vector\n-1353 //\n-1354\n-1355 // We check the following candidate operation\n-1356 //\n-1357 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)\n-1358 //\n-1359 // against the reference operation\n-1360 //\n-1361 // vrefres = vref1 @ sref2\n-1362 //\n-1363 // v... variables are simd-vectors, a... variables are arrays, and\n-1364 // s... variables are scalars.\n-1365 //\n-1366 // We could check the following properties\n-1367 // 1. lanes(vopres) == lanes(vop1)\n-1368 // 2. lane(l, vopres) == lane(l, vrefres) foreach l\n-1369 // 3. lane(l, vop1) == lane(l, vref1) foreach l\n-1370 // but these are given by checking the operation against the scalar\n-1371 // operation in the vector@vector and vector@scalar cases above.\n-1372 //\n-1373 // The only thing left to check is:\n-1374 // 4. lane(l, vop2) foreach l is never modified\n-1375\n-1376 template\n-1377 void checkBinaryOpVVAgainstSV(MetaType t1, MetaType v2, Op op)\n-1378 {\n-1379 checkBinaryOpVVAgainstVS(v2, t1, OpInfixSwappedArgs{op});\n-1380 }\n-1381\n-1382 template\n-1383 void checkBinaryOpVVAgainstSV(MetaType, MetaType, OpInfixComma)\n-1384 { }\n-1385\n-1387 //\n-1388 // Invoke the checks for all combinations\n-1389 //\n-1390\n-1391 template\n-1392 void checkBinaryRefQual(Checker checker)\n-1393 {\n-1394 if constexpr (condition) {\n-1395 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(TypeList{}, [=] (auto t1) {\n-1396 _\bH_\by_\bb_\br_\bi_\bd_\b:_\b:_\bf_\bo_\br_\bE_\ba_\bc_\bh(TypeList{}, [=] (auto t2) {\n-1397 checker(t1, t2);\n-1398 });\n-1399 });\n-1400 }\n-1401 }\n-1402\n-1403 template\n-1404 void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs(Checker checker)\n-1405 {\n-1406 using Std::bool_constant;\n-1407\n-1408 constexpr bool isMask = std::is_same, bool>::value;\n-1409\n-1410 constexpr bool do_ = false;\n-1411 constexpr bool do_SV = true;\n-1412 constexpr bool do_VV = true;\n-1413 constexpr bool do_VS = true;\n-1414\n-1415#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) \\\n-1416 checker(bool_constant{}, \\\n-1417 bool_constant{}, \\\n-1418 bool_constant{}, \\\n-1419 Op##NAME{})\n-1420\n-1421 // (Mask , Vector , Name );\n-1422\n-1423 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixMul );\n-1424 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixDiv );\n-1425 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixRemainder );\n-1426\n-1427 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixPlus );\n-1428 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixMinus );\n-1429\n-1430 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixLeftShift );\n-1431 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixRightShift );\n-1432\n-1433 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixLess );\n-1434 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixGreater );\n-1435 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixLessEqual );\n-1436 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixGreaterEqual );\n-1437\n-1438 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixEqual );\n-1439 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , SV, VV, VS, InfixNotEqual );\n-1440\n-1441 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , SV, VV, VS, InfixBitAnd );\n-1442 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , SV, VV, VS, InfixBitXor );\n-1443 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , SV, VV, VS, InfixBitOr );\n-1444\n-1445 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(SV, VV, VS, SV, VV, VS, InfixLogicAnd );\n-1446 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(SV, VV, VS, SV, VV, VS, InfixLogicOr );\n-1447\n-1448 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssign );\n-1449 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignMul );\n-1450 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignDiv );\n-1451 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignRemainder );\n-1452 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignPlus );\n-1453 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignMinus );\n-1454 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignLeftShift );\n-1455 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , , , , VV, VS, InfixAssignRightShift);\n-1456 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssignAnd );\n-1457 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssignXor );\n-1458 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO( , VV, , , VV, VS, InfixAssignOr );\n-1459\n-1460 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO(SV, VV, VS, SV, , VS, InfixComma );\n-1461\n-1462#undef DUNE_SIMD_DO\n-1463 }\n-1464\n-1466 //\n-1467 // SIMD interface functions\n-1468 //\n-1469\n-1470 template\n-1471 void checkAutoCopy()\n-1472 {\n-1473 using RValueResult = decltype(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(0, std::declval())));\n-1474 static_assert(std::is_same >::value,\n-1475 \"Result of autoCopy() must always be Scalar\");\n-1476\n-1477 using MutableLValueResult =\n-1478 decltype(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(0, std::declval())));\n-1479 static_assert(std::is_same >::value,\n-1480 \"Result of autoCopy() must always be Scalar\");\n-1481\n-1482 using ConstLValueResult =\n-1483 decltype(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(0, std::declval())));\n-1484 static_assert(std::is_same >::value,\n-1485 \"Result of autoCopy() must always be Scalar\");\n-1486\n-1487 V vec = make123();\n-1488 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(vec); ++l)\n-1489 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bl_\ba_\bn_\be(l, vec)) == Scalar(l+1));\n-1490 }\n-1491\n-1492 // may only be called for mask types\n-1493 template\n-1494 void checkBoolReductions()\n-1495 {\n-1496 M trueVec(true);\n-1497\n-1498 // mutable lvalue\n-1499 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n-1500 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n-1501 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n-1502 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n-1503\n-1504 // const lvalue\n-1505 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n-1506 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(trueVec)) == true);\n-1507 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n-1508 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(trueVec)) == false);\n-1509\n-1510 // rvalue\n-1511 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (M(true)) == true);\n-1512 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (M(true)) == true);\n-1513 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(M(true)) == false);\n-1514 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(M(true)) == false);\n-1515\n-1516 M falseVec(false);\n-1517\n-1518 // mutable lvalue\n-1519 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n-1520 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n-1521 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n-1522 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n-1523\n-1524 // const lvalue\n-1525 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n-1526 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(falseVec)) == false);\n-1527 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n-1528 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(falseVec)) == true);\n-1529\n-1530 // rvalue\n-1531 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (M(false)) == false);\n-1532 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (M(false)) == false);\n-1533 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(M(false)) == true);\n-1534 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(M(false)) == true);\n-1535\n-1536 auto mixedVec = broadcast(0);\n-1537 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(mixedVec); ++l)\n-1538 _\bl_\ba_\bn_\be(l, mixedVec) = (l % 2);\n-1539\n-1540 // mutable lvalue\n-1541 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1542 (_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(mixedVec)) == false);\n-1543 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1544 (_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(mixedVec)) == (lanes() > 1));\n-1545 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1546 (_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == (lanes() == 1));\n-1547 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1548 (_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == true);\n-1549\n-1550 // const lvalue\n-1551 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1552 (_\ba_\bl_\bl_\bT_\br_\bu_\be (static_cast(mixedVec)) == false);\n-1553 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1554 (_\ba_\bn_\by_\bT_\br_\bu_\be (static_cast(mixedVec)) == (lanes() > 1));\n-1555 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1556 (_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == (lanes() == 1));\n-1557 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-1558 (_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(static_cast(mixedVec)) == true);\n-1559\n-1560 // rvalue\n-1561 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be (M(mixedVec)) == false);\n-1562 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bT_\br_\bu_\be (M(mixedVec)) == (lanes() > 1));\n-1563 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(M(mixedVec)) == (lanes() == 1));\n-1564 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(M(mixedVec)) == true);\n-1565 }\n-1566\n-1567 template\n-1568 void checkCond()\n-1569 {\n-1570 using M = Mask;\n-1571\n-1572 static_assert\n-1573 (std::is_same(), std::declval(),\n-1574 std::declval())), V>::value,\n-1575 \"The result of cond(M, V, V) should have exactly the type V\");\n-1576\n-1577 static_assert\n-1578 (std::is_same(),\n-1579 std::declval(),\n-1580 std::declval())), V>::value,\n-1581 \"The result of cond(const M&, const V&, const V&) should have \"\n-1582 \"exactly the type V\");\n-1583\n-1584 static_assert\n-1585 (std::is_same(), std::declval(),\n-1586 std::declval())), V>::value,\n-1587 \"The result of cond(M&, V&, V&) should have exactly the type V\");\n-1588\n-1589 V vec1 = leftVector();\n-1590 V vec2 = rightVector();\n-1591\n-1592 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(M(true), vec1, vec2) == vec1));\n-1593 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(M(false), vec1, vec2) == vec2));\n-1594\n-1595 auto mixedResult = broadcast(0);\n-1596 auto mixedMask = broadcast(false);\n-1597 for(std::size_t l = 0; l < _\bl_\ba_\bn_\be_\bs(mixedMask); ++l)\n-1598 {\n-1599 _\bl_\ba_\bn_\be(l, mixedMask ) = (l % 2);\n-1600 _\bl_\ba_\bn_\be(l, mixedResult) = _\bl_\ba_\bn_\be(l, (l % 2) ? vec1 : vec2);\n-1601 }\n-1602\n-1603 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(mixedMask, vec1, vec2) == mixedResult));\n-1604 }\n-1605\n-1606 template\n-1607 void checkBoolCond()\n-1608 {\n-1609 static_assert\n-1610 (std::is_same(), std::declval(),\n-1611 std::declval())), V>::value,\n-1612 \"The result of cond(bool, V, V) should have exactly the type V\");\n-1613\n-1614 static_assert\n-1615 (std::is_same(),\n-1616 std::declval(),\n-1617 std::declval())), V>::value,\n-1618 \"The result of cond(const bool&, const V&, const V&) should have \"\n-1619 \"exactly the type V\");\n-1620\n-1621 static_assert\n-1622 (std::is_same(),\n-1623 std::declval(),\n-1624 std::declval())), V>::value,\n-1625 \"The result of cond(bool&, V&, V&) should have exactly the type V\");\n-1626\n-1627 V vec1 = leftVector();\n-1628 V vec2 = rightVector();\n-1629\n-1630 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(true, vec1, vec2) == vec1));\n-1631 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(_\bc_\bo_\bn_\bd(false, vec1, vec2) == vec2));\n-1632 }\n-1633\n-1634 template\n-1635 std::enable_if_t >::value>\n-1636 checkHorizontalMinMax() {}\n-1637\n-1638 template\n-1639 std::enable_if_t >::value>\n-1640 checkHorizontalMinMax()\n-1641 {\n-1642 static_assert\n-1643 (std::is_same())), Scalar >::value,\n-1644 \"The result of max(V) should be exactly Scalar\");\n-1645\n-1646 static_assert\n-1647 (std::is_same())), Scalar >::value,\n-1648 \"The result of min(V) should be exactly Scalar\");\n-1649\n-1650 static_assert\n-1651 (std::is_same())), Scalar >::value,\n-1652 \"The result of max(V) should be exactly Scalar\");\n-1653\n-1654 static_assert\n-1655 (std::is_same())), Scalar >::value,\n-1656 \"The result of min(V) should be exactly Scalar\");\n-1657\n-1658 const V vec1 = leftVector();\n-1659\n-1660 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bm_\ba_\bx(vec1) == Scalar(_\bl_\ba_\bn_\be_\bs(vec1)));\n-1661 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\bm_\bi_\bn(vec1) == Scalar(1));\n-1662 }\n-1663\n-1664 template\n-1665 std::enable_if_t >::value>\n-1666 checkBinaryMinMax() {}\n-1667\n-1668 template\n-1669 std::enable_if_t >::value>\n-1670 checkBinaryMinMax()\n-1671 {\n-1672 using std::max;\n-1673 using std::min;\n-1674\n-1675 static_assert\n-1676 (std::is_same(),\n-1677 std::declval())), V>::value,\n-1678 \"The result of Simd::max(V, V) should be exactly V\");\n-1679 static_assert\n-1680 (std::is_same(),\n-1681 std::declval())), V>::value,\n-1682 \"The result of Simd::min(V, V) should be exactly V\");\n-1683\n-1684 static_assert\n-1685 (std::is_same(),\n-1686 std::declval())), V>::value,\n-1687 \"The result of Simd::max(V&, V&) should be exactly V\");\n-1688 static_assert\n-1689 (std::is_same(),\n-1690 std::declval())), V>::value,\n-1691 \"The result of Simd::min(V&, V&) should be exactly V\");\n-1692\n-1693 const V arg1 = leftVector();\n-1694 const V arg2 = rightVector();\n-1695\n-1696 V maxExp(Scalar(0)), minExp(Scalar(0));\n-1697 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs()))\n-1698 {\n-1699 _\bl_\ba_\bn_\be(l, maxExp) = _\bm_\ba_\bx(_\bl_\ba_\bn_\be(l, arg1), _\bl_\ba_\bn_\be(l, arg2));\n-1700 _\bl_\ba_\bn_\be(l, minExp) = _\bm_\bi_\bn(_\bl_\ba_\bn_\be(l, arg1), _\bl_\ba_\bn_\be(l, arg2));\n-1701 }\n-1702\n-1703 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(maxExp == _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bx(arg1, arg2)));\n-1704 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(_\ba_\bl_\bl_\bT_\br_\bu_\be(minExp == _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\bi_\bn(arg1, arg2)));\n-1705 }\n-1706\n-1707 template\n-1708 void checkIO()\n-1709 {\n-1710 const V vec1 = leftVector();\n-1711\n-1712 std::string reference;\n-1713 {\n-1714 const char *sep = \"\";\n-1715 for(auto l : _\br_\ba_\bn_\bg_\be(_\bl_\ba_\bn_\be_\bs(vec1)))\n-1716 {\n-1717 std::ostringstream stream;\n-1718 stream << _\bl_\ba_\bn_\be(l, vec1);\n-1719\n-1720 reference += sep;\n-1721 reference += stream.str();\n-1722 sep = \", \";\n-1723 }\n-1724 }\n-1725\n-1726 {\n-1727 std::ostringstream stream;\n-1728 stream << _\bi_\bo(vec1);\n-1729 if(_\bl_\ba_\bn_\be_\bs(vec1) == 1)\n-1730 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(stream.str() == reference);\n-1731 else\n-1732 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(stream.str() == \"<\" + reference + \">\");\n-1733 }\n-1734\n-1735 {\n-1736 std::ostringstream stream;\n-1737 stream << _\bv_\bi_\bo(vec1);\n-1738 _\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK(stream.str() == \"<\" + reference + \">\");\n-1739 }\n-1740 }\n-1741\n-1742#undef DUNE_SIMD_CHECK\n-1743\n-1744 public:\n-1807 template void _\bc_\bh_\be_\bc_\bk_\bT_\by_\bp_\be();\n-1808 template void _\bc_\bh_\be_\bc_\bk_\bN_\bo_\bn_\bO_\bp_\bs();\n-1809 template void _\bc_\bh_\be_\bc_\bk_\bU_\bn_\ba_\br_\by_\bO_\bp_\bs();\n-1810 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs();\n-1811 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bV_\be_\bc_\bt_\bo_\br();\n-1812 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br();\n-1813 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bS_\bc_\ba_\bl_\ba_\br();\n-1814 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bP_\br_\bo_\bx_\by_\bV_\be_\bc_\bt_\bo_\br();\n-1815 template void _\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bP_\br_\bo_\bx_\by();\n-1819\n-1836 template class RebindPrune = _\bI_\bs_\bL_\bo_\bo_\bp,\n-1838 template class RebindAccept = _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bT_\br_\bu_\be>\n-_\b1_\b8_\b3_\b9 void _\bc_\bh_\be_\bc_\bk() {\n-1840 // check whether the test for this type already started\n-1841 if(seen_.emplace(typeid (V)).second == false)\n-1842 {\n-1843 // type already seen, nothing to do\n-1844 return;\n-1845 }\n-1846\n-1847 // do these first so everything that appears after \"Checking SIMD type\n-1848 // ...\" really pertains to that type\n-1849 auto recurse = [this](auto w) {\n-1850 using W = typename decltype(w)::type;\n-1851 this->template check();\n-1852 };\n-1853 checkRebindOf(recurse);\n-1854\n-1855 checkType();\n-1856 }\n-1857\n-_\b1_\b8_\b5_\b9 bool _\bg_\bo_\bo_\bd() const\n-1860 {\n-1861 return good_;\n-1862 }\n-1863\n-1864 }; // class UnitTest\n-1865\n-_\b1_\b8_\b6_\b6 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bT_\by_\bp_\be()\n-1867 {\n-1868 static_assert(std::is_same >::value, \"Simd types \"\n-1869 \"must not be references, and must not include \"\n-1870 \"cv-qualifiers\");\n-1871\n-1872 log_ << \"Checking SIMD type \" << className() << std::endl;\n-1873\n-1874 checkNonOps();\n-1875 checkUnaryOps();\n-1876 checkBinaryOps();\n-1877 }\n-_\b1_\b8_\b7_\b8 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bN_\bo_\bn_\bO_\bp_\bs()\n-1879 {\n-1880 constexpr auto isMask = typename std::is_same, bool>::type{};\n-1881\n-1882 checkLanes();\n-1883 checkScalar();\n-1884\n-1885 checkDefaultConstruct();\n-1886 checkLane();\n-1887 checkCopyMoveConstruct();\n-1888 checkImplCast();\n-1889 checkBroadcast();\n-1890 if constexpr (isMask)\n-1891 this->template checkBroadcastMaskConstruct();\n-1892 else\n-1893 this->template checkBroadcastVectorConstruct();\n-1894 checkBracedAssign();\n-1895 checkBracedBroadcastAssign();\n-1896\n-1897 checkAutoCopy();\n-1898 checkCond();\n-1899 checkBoolCond();\n-1900\n-1901 if constexpr (isMask)\n-1902 this->template checkBoolReductions();\n-1903 // checkBoolReductions() is not applicable for non-masks\n-1904\n-1905 checkHorizontalMinMax();\n-1906 checkBinaryMinMax();\n-1907 checkIO();\n-1908 }\n-_\b1_\b9_\b0_\b9 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bU_\bn_\ba_\br_\by_\bO_\bp_\bs()\n-1910 {\n-1911 if constexpr (std::is_same_v, bool>) {\n-1912 // check mask\n-1913 auto _\bc_\bh_\be_\bc_\bk = [this](auto op) {\n-1914 this->template checkUnaryOpsV(op);\n-1915 };\n-1916\n-1917 // postfix\n-1918 // check(OpPostfixDecrement{});\n-1919 // clang deprecation warning if bool++ is tested\n-1920 // check(OpPostfixIncrement{});\n-1921\n-1922 // prefix\n-1923 // check(OpPrefixDecrement{});\n-1924 // clang deprecation warning if ++bool is tested\n-1925 // check(OpPrefixIncrement{});\n-1926\n-1927 // check(OpPrefixPlus{});\n-1928 // check(OpPrefixMinus{});\n-1929 _\bc_\bh_\be_\bc_\bk(OpPrefixLogicNot{});\n-1930 // check(OpPrefixBitNot{});\n-1931 }\n-1932 else {\n-1933 // check vector\n-1934 auto _\bc_\bh_\be_\bc_\bk = [this](auto op) {\n-1935 this->template checkUnaryOpsV(op);\n-1936 };\n-1937\n-1938 // postfix\n-1939 // check(OpPostfixDecrement{});\n-1940 // check(OpPostfixIncrement{});\n-1941\n-1942 // prefix\n-1943 // check(OpPrefixDecrement{});\n-1944 // check(OpPrefixIncrement{});\n-1945\n-1946 // check(OpPrefixPlus{});\n-1947 _\bc_\bh_\be_\bc_\bk(OpPrefixMinus{});\n-1948 _\bc_\bh_\be_\bc_\bk(OpPrefixLogicNot{});\n-1949 _\bc_\bh_\be_\bc_\bk(OpPrefixBitNot{});\n-1950 }\n-1951 }\n-_\b1_\b9_\b5_\b2 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs()\n-1953 {\n-1954 checkBinaryOpsVectorVector();\n-1955 checkBinaryOpsScalarVector();\n-1956 checkBinaryOpsVectorScalar();\n-1957 checkBinaryOpsProxyVector();\n-1958 checkBinaryOpsVectorProxy();\n-1959 }\n-_\b1_\b9_\b6_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bV_\be_\bc_\bt_\bo_\br()\n-1961 {\n-1962 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n-1963 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n-1964 this->checkBinaryOpVV(t1, t2, op);\n-1965 };\n-1966 this->checkBinaryRefQual(_\bc_\bh_\be_\bc_\bk);\n-1967 };\n-1968 checkBinaryOps(checker);\n-1969 }\n-_\b1_\b9_\b7_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br()\n-1971 {\n-1972 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n-1973 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n-1974 this->checkBinaryOpSV(t1, t2, op);\n-1975 };\n-1976 this->checkBinaryRefQual, V, doSV>(_\bc_\bh_\be_\bc_\bk);\n-1977\n-1978 auto crossCheck = [this,op](auto t1, auto t2) {\n-1979 this->checkBinaryOpVVAgainstSV(t1, t2, op);\n-1980 };\n-1981 this->checkBinaryRefQual, V, doSV && doVV>(crossCheck);\n-1982 };\n-1983 checkBinaryOps(checker);\n-1984 }\n-_\b1_\b9_\b8_\b5 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bS_\bc_\ba_\bl_\ba_\br()\n-1986 {\n-1987 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n-1988 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n-1989 this->checkBinaryOpVS(t1, t2, op);\n-1990 };\n-1991 this->checkBinaryRefQual, doVS>(_\bc_\bh_\be_\bc_\bk);\n-1992\n-1993 auto crossCheck = [this,op](auto t1, auto t2) {\n-1994 this->checkBinaryOpVVAgainstVS(t1, t2, op);\n-1995 };\n-1996 this->checkBinaryRefQual, doVV && doVS>(crossCheck);\n-1997 };\n-1998 checkBinaryOps(checker);\n-1999 }\n-_\b2_\b0_\b0_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bP_\br_\bo_\bx_\by_\bV_\be_\bc_\bt_\bo_\br()\n-2001 {\n-2002 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n-2003 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n-2004 this->checkBinaryOpPV(t1, t2, op);\n-2005 };\n-2006 this->checkBinaryRefQual(_\bc_\bh_\be_\bc_\bk);\n-2007 };\n-2008 checkBinaryOps(checker);\n-2009 }\n-_\b2_\b0_\b1_\b0 template void _\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bP_\br_\bo_\bx_\by()\n-2011 {\n-2012 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {\n-2013 auto _\bc_\bh_\be_\bc_\bk = [this,op](auto t1, auto t2) {\n-2014 this->checkBinaryOpVP(t1, t2, op);\n-2015 };\n-2016 this->checkBinaryRefQual(_\bc_\bh_\be_\bc_\bk);\n-2017 };\n-2018 checkBinaryOps(checker);\n-2019 }\n-2020\n-2021 } // namespace Simd\n-2022} // namespace Dune\n-2023\n-2024#endif // DUNE_COMMON_SIMD_TEST_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-_\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-_\bl_\bo_\bo_\bp_\b._\bh_\bh\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bO_\bS_\bT_\bF_\bI_\bX_\b__\bO_\bP\n-#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:670\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bI_\bN_\bF_\bI_\bX_\b__\bO_\bP\n-#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:784\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK_\b__\bO_\bP\n-#define DUNE_SIMD_CHECK_OP(expr)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:191\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bC_\bH_\bE_\bC_\bK\n-#define DUNE_SIMD_CHECK(expr)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:186\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bR_\bE_\bP_\bL_\b__\bO_\bP\n-#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:818\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n-#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:805\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bP_\bR_\bE_\bF_\bI_\bX_\b__\bO_\bP\n-#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:681\n-_\bD_\bU_\bN_\bE_\b__\bS_\bI_\bM_\bD_\b__\bD_\bO\n-#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)\n-_\bi_\bo_\b._\bh_\bh\n-IO interface of the SIMD abstraction.\n-_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-_\bh_\by_\bb_\br_\bi_\bd_\bu_\bt_\bi_\bl_\bi_\bt_\bi_\be_\bs_\b._\bh_\bh\n-_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\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:_\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:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\by_\bp_\be_\bL_\bi_\bs_\bt\n-std::tuple< MetaType< T >... > TypeList\n-A simple type list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:87\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:268\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:642\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_\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:_\bm_\ba_\bs_\bk_\bO_\br\n-auto maskOr(const V1 &v1, const V2 &v2)\n-Logic or of masks.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:499\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:_\bi_\bo\n-auto io(const V &v)\n-construct a stream inserter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:106\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:_\bv_\bi_\bo\n-auto vio(const V &v)\n-construct a stream inserter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bx\n-auto max(const V &v1, const V &v2)\n-The binary maximum value over two simd objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:409\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n-bool anyFalse(const Mask &mask)\n-Whether any entry is false\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:449\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:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n-bool allFalse(const Mask &mask)\n-Whether all entries are false\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:459\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\bA_\bn_\bd\n-auto maskAnd(const V1 &v1, const V2 &v2)\n-Logic and of masks.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:509\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br\n-typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n-Element type of some SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bm_\bi_\bn\n-auto min(const V &v1, const V &v2)\n-The binary minimum value over two simd objects.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:419\n-_\bs_\bt_\bd\n-STL namespace.\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:_\bS_\bi_\bm_\bd_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bL_\bi_\bs_\bt\n-typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type RebindList\n-A list of types with the final element removed.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bI_\bs_\bL_\bo_\bo_\bp\n-typename Impl::IsLoop< T >::type IsLoop\n-check whether a type is an instance of LoopSIMD\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bI_\bM_\bD\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn loop.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bE_\bn_\bd_\bM_\ba_\br_\bk\n-final element marker for RebindList\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bU_\bn_\ba_\br_\by_\bO_\bp_\bs\n-void checkUnaryOps()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1909\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs\n-void checkBinaryOps()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1952\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bS_\bc_\ba_\bl_\ba_\br_\bV_\be_\bc_\bt_\bo_\br\n-void checkBinaryOpsScalarVector()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1970\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bT_\by_\bp_\be\n-void checkType()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1866\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk\n-void check()\n-run unit tests for simd vector type V\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1839\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bS_\bc_\ba_\bl_\ba_\br\n-void checkBinaryOpsVectorScalar()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1985\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bg_\bo_\bo_\bd\n-bool good() const\n-whether all tests succeeded\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1859\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bV_\be_\bc_\bt_\bo_\br\n-void checkBinaryOpsVectorVector()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1960\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bN_\bo_\bn_\bO_\bp_\bs\n-void checkNonOps()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:1878\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bV_\be_\bc_\bt_\bo_\br_\bP_\br_\bo_\bx_\by\n-void checkBinaryOpsVectorProxy()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:2010\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bU_\bn_\bi_\bt_\bT_\be_\bs_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk_\bB_\bi_\bn_\ba_\br_\by_\bO_\bp_\bs_\bP_\br_\bo_\bx_\by_\bV_\be_\bc_\bt_\bo_\br\n-void checkBinaryOpsProxyVector()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn test.hh:2000\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-_\bs_\bi_\bm_\bd_\b._\bh_\bh\n-Include file for users of the SIMD abstraction layer.\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+Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const\n+Key &key)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn propertymap.hh:84\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/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: defaults.hh File Reference\n+dune-common: function.hh File Reference\n \n \n \n \n \n \n \n@@ -65,127 +65,82 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n- \n+Classes |\n+Namespaces |\n+Macros |\n+Functions
    \n+
    function.hh File Reference
    \n
    \n
    \n \n-

    Default implementations for SIMD Implementations. \n+

    Simple base class templates for functions. \n More...

    \n-
    #include <algorithm>
    \n-#include <cstddef>
    \n-#include <type_traits>
    \n-#include <dune/common/rangeutilities.hh>
    \n-#include <dune/common/simd/base.hh>
    \n-#include <dune/common/simd/interface.hh>
    \n-#include <dune/common/typelist.hh>
    \n-#include <dune/common/typetraits.hh>
    \n+
    #include <utility>
    \n+#include <dune/common/deprecated.hh>
    \n+#include "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::Function< Domain, Range >
     Base class template for function classes. More...
     
    struct  Dune::Function< Domain, Range >::Traits
     Traits class containing raw types. More...
     
    class  Dune::VirtualFunction< DomainType, RangeType >
     Virtual base class template for function classes. More...
     
    \n \n \n \n \n-\n-\n-\n-\n-\n-\n+

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    \n+\n+\n+\n

    \n+Macros

    #define DUNE_FUNCTION_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-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\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

    Overloadable and default functions

    This group contains functions that you, as an abstraction developer, must implement. All functions that are deleted must be provided, functions that have a default implementation may be left unimplemented if the default behaviour is satisfactory.

    \n-
    template<class V >
    decltype(auto) Dune::Simd::Overloads::lane (ADLTag< 0 >, std::size_t l, V v)=delete
     implements Simd::lane()
     
    template<class V >
    constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, const V &u)
     implements Simd::implCast<V>(V)
     
    template<class V , class U >
    constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, const U &u)
     implements Simd::implCast<V>(U)
     
    template<class V , class S >
    auto Dune::Simd::Overloads::broadcast (ADLTag< 0 >, MetaType< V >, S s)
     implements Simd::broadcast<V>()
     
    template<class V >
    Dune::Simd::Overloads::cond (ADLTag< 0 >, const Mask< V > &mask, const V &ifTrue, const V &ifFalse)=delete
     implements Simd::cond()
     
    template<class V >
    auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v1, const V &v2)
     implements binary Simd::max()
     
    template<class V >
    auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v1, const V &v2)
     implements binary Simd::min()
     
    template<class Mask >
    bool Dune::Simd::Overloads::anyTrue (ADLTag< 0 >, const Mask &mask)=delete
     implements Simd::anyTrue()
     
    template<class Mask >
    bool Dune::Simd::Overloads::allTrue (ADLTag< 0 >, const Mask &mask)
     implements Simd::allTrue()
     
    template<class Mask >
    bool Dune::Simd::Overloads::anyFalse (ADLTag< 0 >, const Mask &mask)
     implements Simd::anyFalse()
     
    template<class Mask >
    bool Dune::Simd::Overloads::allFalse (ADLTag< 0 >, const Mask &mask)
     implements Simd::allFalse()
     
    template<class V >
    auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v)
     implements Simd::maxValue()
     
    template<class V >
    auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v)
     implements Simd::minValue()
     
    template<class V >
    Mask< V > Dune::Simd::Overloads::mask (ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
     implements Simd::mask()
     
    template<class V >
    auto Dune::Simd::Overloads::mask (ADLTag< 0, !std::is_same< V, Mask< V > >::value >, const V &v)
     implements Simd::mask()
     
    template<class V1 , class V2 >
    auto Dune::Simd::Overloads::maskOr (ADLTag< 0 >, const V1 &v1, const V2 &v2)
     implements Simd::maskOr()
     
    template<class V1 , class V2 >
    auto Dune::Simd::Overloads::maskAnd (ADLTag< 0 >, const V1 &v1, const V2 &v2)
     implements Simd::maskAnd()
     
    template<typename Domain , typename Range , typename F >
    Impl::LambdaVirtualFunction< Domain, Range, std::decay_t< F > > Dune::makeVirtualFunction (F &&f)
     make VirtualFunction out of a function object
     
    \n

    Detailed Description

    \n-

    Default implementations for SIMD Implementations.

    \n-

    This file provides default overloads for SIMD implementation functions, and deleted placeholders where there are no default implementations.

    \n-

    This file should never be included by users of the SIMD abstraction. Include <dune/common/simd/simd.hh> instead.

    \n-
    \n+

    Simple base class templates for functions.

    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_FUNCTION_HH

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_FUNCTION_HH
    \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,126 +1,45 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-defaults.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bA_\bb_\bs_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-Default implementations for SIMD Implementations. _\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/_\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_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\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/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\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+_\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+function.hh File Reference\n+_\bC_\bo_\bm_\bm_\bo_\bn\n+Simple base class templates for functions. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bp_\br_\be_\bc_\ba_\bt_\be_\bd_\b._\bh_\bh>\n+#include \"_\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:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b _\b>\n+\u00a0 Base class template for function classes. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b _\b>_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs\n+\u00a0 _\bT_\br_\ba_\bi_\bt_\bs class containing raw types. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be_\b,_\b _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b _\b>\n+\u00a0 Virtual base class template for function classes. _\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_\bi_\bm_\bd\n-\u00a0 Namespace for vectorization interface functions used by library\n- developers.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n-\u00a0 Namespace for the overloads and specializations that make up a SIMD\n- implementation.\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bF_\bU_\bN_\bC_\bT_\bI_\bO_\bN_\b__\bH_\bH\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-Overloadable and default functions\n-This group contains functions that you, as an abstraction developer, must\n-implement. All functions that are deleted must be provided, functions that have\n-a default implementation may be left unimplemented if the default behaviour is\n-satisfactory.\n-template\n-decltype(auto)\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, std::size_t l, V\n- v)=delete\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\b(_\b)\n-\u00a0\n-template\n- constexpr V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be< V >,\n- const V &u)\n-\u00a0 implements Simd::implCast(V)\n-\u00a0\n-template\n- constexpr V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be< V >,\n- const U &u)\n-\u00a0 implements Simd::implCast(U)\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be< V >, S\n- s)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt_\b<_\bV_\b>_\b(_\b)\n-\u00a0\n-template\n- V\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk< V >\n- &_\bm_\ba_\bs_\bk, const V &ifTrue, const V &ifFalse)=delete\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bc_\bo_\bn_\bd_\b(_\b)\n-\u00a0\n-template\n- auto\u00a0 _\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_\bx (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v1, const V\n- &v2)\n-\u00a0 implements binary _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bx_\b(_\b)\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bm_\bi_\bn (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v1, const V\n- &v2)\n-\u00a0 implements binary _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\bi_\bn_\b(_\b)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk\n- &_\bm_\ba_\bs_\bk)=delete\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be_\b(_\b)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be_\b(_\b)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be_\b(_\b)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be_\b(_\b)\n-\u00a0\n-template\n- auto\u00a0 _\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_\bx (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v)\n-\u00a0 implements Simd::maxValue()\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bm_\bi_\bn (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V &v)\n-\u00a0 implements Simd::minValue()\n-\u00a0\n-template\n- _\bM_\ba_\bs_\bk< V >\u00a0 _\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 (_\bA_\bD_\bL_\bT_\ba_\bg< 0, std::is_same< V, _\bM_\ba_\bs_\bk<\n- V > >::value >, const V &v)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\b(_\b)\n-\u00a0\n-template\n- auto\u00a0 _\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 (_\bA_\bD_\bL_\bT_\ba_\bg< 0, !std::is_same< V, _\bM_\ba_\bs_\bk<\n- V > >::value >, const V &v)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\b(_\b)\n-\u00a0\n-template\n- auto\u00a0 _\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_\bO_\br (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V1 &v1, const\n- V2 &v2)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\bO_\br_\b(_\b)\n-\u00a0\n-template\n- auto\u00a0 _\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_\bA_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 0 >, const V1 &v1,\n- const V2 &v2)\n-\u00a0 implements _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk_\bA_\bn_\bd_\b(_\b)\n+template\n+Impl::LambdaVirtualFunction< Domain,\n+ Range, std::decay_t< F > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn (F &&f)\n+\u00a0 make _\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn out of a function\n+ object\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-Default implementations for SIMD Implementations.\n-This file provides default overloads for SIMD implementation functions, and\n-deleted placeholders where there are no default implementations.\n-This file should never be included by users of the SIMD abstraction. Include\n-<_\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+Simple base class templates for functions.\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_F\bFU\bUN\bNC\bCT\bTI\bIO\bON\bN_\b_H\bHH\bH *\b**\b**\b**\b**\b*\n+#define DUNE_FUNCTION_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/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: defaults.hh Source File\n+dune-common: function.hh Source File\n \n \n \n \n \n \n \n@@ -70,215 +70,147 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    defaults.hh
    \n+
    function.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_DEFAULTS_HH
    \n-
    4#define DUNE_COMMON_SIMD_DEFAULTS_HH
    \n-
    5
    \n-
    17#include <algorithm>
    \n-
    18#include <cstddef>
    \n-
    19#include <type_traits>
    \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 (C) 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_FUNCTION_HH_SILENCE_DEPRECATION
    \n+
    6#warning This file is deprecated after Dune 2.7! Use C++ function objects and std::function stuff instead!
    \n+
    7#else // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION
    \n+
    8#undef DUNE_FUNCTION_HH_SILENCE_DEPRECATION
    \n+
    9#endif // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION
    \n+
    10
    \n+
    11#ifndef DUNE_FUNCTION_HH
    \n+
    12#define DUNE_FUNCTION_HH
    \n+
    13
    \n+
    14#include <utility>
    \n+
    15
    \n+\n+
    17#include "typetraits.hh"
    \n+
    18
    \n+
    19namespace Dune {
    \n
    20
    \n-\n-\n-\n-\n-\n-
    26
    \n-
    27namespace Dune {
    \n-
    28 namespace Simd {
    \n-
    29 namespace Overloads {
    \n-
    30
    \n-
    47 template<class V>
    \n-
    48 decltype(auto) lane(ADLTag<0>, std::size_t l, V v) = delete;
    \n+
    36 template <class Domain, class Range>
    \n+
    \n+
    37 class
    \n+
    38 [[deprecated("Dune::Function is deprecated after Dune 2.7. Use C++ "
    \n+
    39 "function objects instead!")]]
    \n+\n+
    41 {
    \n+
    42 typedef typename std::remove_cv<typename std::remove_reference< Domain >::type >::type RawDomainType;
    \n+
    43 typedef typename std::remove_cv<typename std::remove_reference< Range >::type >::type RawRangeType;
    \n+
    44
    \n+
    45 public:
    \n+
    46
    \n+
    48 typedef RawRangeType RangeType;
    \n
    49
    \n-
    51 template<class V>
    \n-
    \n-
    52 constexpr V implCast(ADLTag<0>, MetaType<V>, const V &u)
    \n-
    53 {
    \n-
    54 return u;
    \n-
    55 }
    \n-
    \n-
    56
    \n-
    58 template<class V, class U>
    \n-
    \n-
    59 constexpr V implCast(ADLTag<0>, MetaType<V>, const U &u)
    \n-
    60 {
    \n-
    61 V result(Simd::Scalar<V>(0));
    \n-
    62 for(auto l : range(Simd::lanes(u)))
    \n-
    63 Simd::lane(l, result) = Simd::lane(l, u);
    \n-
    64 return result;
    \n-
    65 }
    \n-
    \n-
    66
    \n-
    68 template<class V, class S>
    \n-
    \n-\n-
    70 {
    \n-
    71 return V(Simd::Scalar<V>(s));
    \n-
    72 }
    \n-
    \n-
    73
    \n-
    75 template<class V>
    \n-\n-
    77 const V &ifTrue, const V &ifFalse) = delete;
    \n-
    78
    \n-
    80 template<class V>
    \n-
    \n-
    81 auto max(ADLTag<0>, const V &v1, const V &v2)
    \n-
    82 {
    \n-
    83 using std::max;
    \n-
    84 return max(v1, v2);
    \n-
    85 }
    \n-
    \n-
    86
    \n-
    88 template<class V>
    \n-
    \n-
    89 auto min(ADLTag<0>, const V &v1, const V &v2)
    \n-
    90 {
    \n-
    91 using std::min;
    \n-
    92 return min(v1, v2);
    \n-
    93 }
    \n-
    \n-
    94
    \n-
    96 template<class Mask>
    \n-
    97 bool anyTrue(ADLTag<0>, const Mask &mask) = delete;
    \n-
    98
    \n-
    100
    \n-
    103 template<class Mask>
    \n-
    \n-\n-
    105 {
    \n-
    106 return !Dune::Simd::anyTrue(!mask);
    \n-
    107 }
    \n-
    \n-
    108
    \n-
    110
    \n-
    113 template<class Mask>
    \n-
    \n-\n-
    115 {
    \n-
    116 return Dune::Simd::anyTrue(!mask);
    \n-
    117 }
    \n-
    \n-
    118
    \n-
    120
    \n-
    123 template<class Mask>
    \n-
    \n-\n-
    125 {
    \n-
    126 return !Dune::Simd::anyTrue(mask);
    \n-
    127 }
    \n-
    \n-
    128
    \n-
    130 template<class V>
    \n-
    \n-
    131 auto max(ADLTag<0>, const V &v)
    \n-
    132 {
    \n-
    133 Scalar<V> m = Simd::lane(0, v);
    \n-
    134 for(std::size_t l = 1; l < Simd::lanes(v); ++l)
    \n-
    135 if(m < Simd::lane(l, v))
    \n-
    136 m = Simd::lane(l, v);
    \n-
    137 return m;
    \n-
    138 }
    \n-
    \n-
    139
    \n-
    141 template<class V>
    \n-
    \n-
    142 auto min(ADLTag<0>, const V &v)
    \n-
    143 {
    \n-
    144 Scalar<V> m = Simd::lane(0, v);
    \n-
    145 for(std::size_t l = 1; l < Simd::lanes(v); ++l)
    \n-
    146 if(Simd::lane(l, v) < m)
    \n-
    147 m = Simd::lane(l, v);
    \n-
    148 return m;
    \n-
    149 }
    \n-
    \n-
    150
    \n-
    152 template<class V>
    \n+
    51 typedef RawDomainType DomainType;
    \n+
    52
    \n+
    \n+
    54 struct Traits
    \n+
    55 {
    \n+
    56 typedef RawDomainType DomainType;
    \n+
    57 typedef RawRangeType RangeType;
    \n+
    58 };
    \n+
    \n+
    59
    \n+
    66 void evaluate(const typename Traits::DomainType& x, typename Traits::RangeType& y) const;
    \n+
    67 }; // end of Function class
    \n+
    \n+
    68
    \n+
    69
    \n+
    70
    \n+\n+
    82 template <class DomainType, class RangeType>
    \n+
    \n+
    83 class
    \n+
    84 [[deprecated("Dune::VirtualFunction is deprecated after Dune 2.7. Use C++ "
    \n+
    85 "function objects and std::function instead!")]]
    \n+\n+
    87 {
    \n+
    88 public:
    \n+\n+
    90
    \n+
    91 virtual ~VirtualFunction() {}
    \n+
    98 virtual void evaluate(const typename Traits::DomainType& x, typename Traits::RangeType& y) const = 0;
    \n+
    99 }; // end of VirtualFunction class
    \n+
    \n+\n+
    101
    \n+
    102 namespace Impl {
    \n+
    103
    \n+\n+
    105 template<typename Domain, typename Range, typename F>
    \n+
    106 class LambdaVirtualFunction final
    \n+
    107 : public VirtualFunction<Domain, Range>
    \n+
    108 {
    \n+
    109 public:
    \n+
    110 LambdaVirtualFunction(F&& f)
    \n+
    111 : f_(std::move(f))
    \n+
    112 {}
    \n+
    113
    \n+
    114 LambdaVirtualFunction(const F& f)
    \n+
    115 : f_(f)
    \n+
    116 {}
    \n+
    117
    \n+
    118 void evaluate(const Domain& x, Range& y) const override
    \n+
    119 {
    \n+
    120 y = f_(x);
    \n+
    121 }
    \n+
    122
    \n+
    123 private:
    \n+
    124 const F f_;
    \n+
    125 };
    \n+\n+
    127
    \n+
    128 } /* namespace Impl */
    \n+
    129
    \n+
    149 template<typename Domain, typename Range, typename F>
    \n+
    150 [[deprecated("Dune::LambdaVirtualFunction is deprecated after Dune 2.7. "
    \n+
    151 "Use std::function instead!")]]
    \n+
    152 Impl::LambdaVirtualFunction< Domain, Range, std::decay_t<F> >
    \n
    \n-
    153 Mask<V> mask(ADLTag<0, std::is_same<V, Mask<V> >::value>,
    \n-
    154 const V &v)
    \n-
    155 {
    \n-
    156 return v;
    \n-
    157 }
    \n-
    \n-
    158
    \n-
    160 template<class V>
    \n-
    \n-
    161 auto mask(ADLTag<0, !std::is_same<V, Mask<V> >::value>,
    \n-
    162 const V &v)
    \n-
    163 {
    \n-
    164 using Copy = AutonomousValue<V>; // just in case we are handed a proxy
    \n-
    165 return v != Copy(Scalar<Copy>(0));
    \n-
    166 }
    \n-
    \n-
    167
    \n-
    169 template<class V1, class V2>
    \n-
    \n-
    170 auto maskOr(ADLTag<0>, const V1 &v1, const V2 &v2)
    \n-
    171 {
    \n-
    172 return Simd::mask(v1) || Simd::mask(v2);
    \n-
    173 }
    \n-
    \n-
    174
    \n-
    176 template<class V1, class V2>
    \n-
    \n-
    177 auto maskAnd(ADLTag<0>, const V1 &v1, const V2 &v2)
    \n-
    178 {
    \n-
    179 return Simd::mask(v1) && Simd::mask(v2);
    \n-
    180 }
    \n-
    \n-
    181
    \n-
    184 } // namespace Overloads
    \n-
    185 } // namespace Simd
    \n-
    186} // namespace Dune
    \n-
    187
    \n-
    188#endif // DUNE_COMMON_SIMD_DEFAULTS_HH
    \n-
    Utilities for reduction like operations on ranges.
    \n-
    Basic definitions for SIMD Implementations.
    \n-\n-
    Traits for type conversions and type information.
    \n-
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n-
    typename AutonomousValueType< T >::type AutonomousValue
    Type free of internal references that T can be converted to.
    Definition typetraits.hh:558
    \n-
    bool anyTrue(const Mask &mask)
    Whether any entry is true
    Definition simd/interface.hh:429
    \n-
    auto mask(const V &v)
    Convert to mask, analogue of bool(s) for scalars.
    Definition simd/interface.hh:489
    \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-
    Rebind< bool, V > Mask
    Mask type type of some SIMD type.
    Definition simd/interface.hh:289
    \n-
    typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
    Element type of some SIMD type.
    Definition simd/interface.hh:235
    \n-
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n-
    constexpr V implCast(ADLTag< 0 >, MetaType< V >, const V &u)
    implements Simd::implCast<V>(V)
    Definition defaults.hh:52
    \n-
    bool allFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::allFalse()
    Definition defaults.hh:124
    \n-
    bool allTrue(ADLTag< 0 >, const Mask &mask)
    implements Simd::allTrue()
    Definition defaults.hh:104
    \n-
    auto maskAnd(ADLTag< 0 >, const V1 &v1, const V2 &v2)
    implements Simd::maskAnd()
    Definition defaults.hh:177
    \n-
    auto maskOr(ADLTag< 0 >, const V1 &v1, const V2 &v2)
    implements Simd::maskOr()
    Definition defaults.hh:170
    \n-
    bool anyFalse(ADLTag< 0 >, const Mask &mask)
    implements Simd::anyFalse()
    Definition defaults.hh:114
    \n-
    auto min(ADLTag< 0 >, const V &v1, const V &v2)
    implements binary Simd::min()
    Definition defaults.hh:89
    \n-
    auto broadcast(ADLTag< 0 >, MetaType< V >, S s)
    implements Simd::broadcast<V>()
    Definition defaults.hh:69
    \n-
    auto max(ADLTag< 0 >, const V &v1, const V &v2)
    implements binary Simd::max()
    Definition defaults.hh:81
    \n+\n+
    154 {
    \n+
    155 return {std::forward<F>(f)};
    \n+
    156 }
    \n+
    \n+
    157
    \n+
    160} // end namespace
    \n+
    161
    \n+
    162#endif
    \n+
    Traits for type conversions and type information.
    \n+
    Definition of the DUNE_NO_DEPRECATED_* macros.
    \n+
    Impl::LambdaVirtualFunction< Domain, Range, std::decay_t< F > > makeVirtualFunction(F &&f)
    make VirtualFunction out of a function object
    Definition function.hh:153
    \n+
    #define DUNE_NO_DEPRECATED_END
    Ignore deprecation warnings (end)
    Definition deprecated.hh:38
    \n+
    #define DUNE_NO_DEPRECATED_BEGIN
    Ignore deprecation warnings (start)
    Definition deprecated.hh:32
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
    Definition debugalign.hh:543
    \n-
    const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
    Definition debugalign.hh:535
    \n-
    T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
    Definition debugalign.hh:520
    \n-
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n-
    A type that refers to another type.
    Definition typelist.hh:33
    \n-
    User interface of the SIMD abstraction.
    \n+
    Base class template for function classes.
    Definition function.hh:41
    \n+
    RawDomainType DomainType
    Raw type of output variable with removed reference and constness.
    Definition function.hh:51
    \n+
    void evaluate(const typename Traits::DomainType &x, typename Traits::RangeType &y) const
    Function evaluation.
    \n+
    RawRangeType RangeType
    Raw type of input variable with removed reference and constness.
    Definition function.hh:48
    \n+
    Traits class containing raw types.
    Definition function.hh:55
    \n+
    RawDomainType DomainType
    Definition function.hh:56
    \n+
    RawRangeType RangeType
    Definition function.hh:57
    \n+
    Virtual base class template for function classes.
    Definition function.hh:87
    \n+
    Function< constDomainType &, RangeType & >::Traits Traits
    Definition function.hh:89
    \n+
    virtual ~VirtualFunction()
    Definition function.hh:91
    \n+
    virtual void evaluate(const typename Traits::DomainType &x, typename Traits::RangeType &y) const =0
    Function evaluation.
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,250 +1,174 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-defaults.hh\n+function.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 (C) 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 (C) 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_DEFAULTS_HH\n-4#define DUNE_COMMON_SIMD_DEFAULTS_HH\n-5\n-17#include \n-18#include \n-19#include \n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_FUNCTION_HH_SILENCE_DEPRECATION\n+6#warning This file is deprecated after Dune 2.7! Use C++ function objects and\n+std::function stuff instead!\n+7#else // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION\n+8#undef DUNE_FUNCTION_HH_SILENCE_DEPRECATION\n+9#endif // !DUNE_FUNCTION_HH_SILENCE_DEPRECATION\n+10\n+11#ifndef DUNE_FUNCTION_HH\n+_\b1_\b2#define DUNE_FUNCTION_HH\n+13\n+14#include \n+15\n+16#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bd_\be_\bp_\br_\be_\bc_\ba_\bt_\be_\bd_\b._\bh_\bh>\n+17#include \"_\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#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-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh>\n-24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh>\n-25#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-26\n-27namespace _\bD_\bu_\bn_\be {\n-28 namespace Simd {\n-29 namespace Overloads {\n-30\n-47 template\n-_\b4_\b8 decltype(auto) _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, std::size_t l, V v) = delete;\n+36 template \n+_\b3_\b7 class\n+38 [[deprecated(\"Dune::Function is deprecated after Dune 2.7. Use C++ \"\n+39 \"function objects instead!\")]]\n+40 _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+41 {\n+42 typedef typename std::remove_cv::\n+type >::type RawDomainType;\n+43 typedef typename std::remove_cv::\n+type >::type RawRangeType;\n+44\n+45 public:\n+46\n+_\b4_\b8 typedef RawRangeType _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n 49\n-51 template\n-_\b5_\b2 constexpr V _\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b<_\bV_\b>, const V &u)\n-53 {\n-54 return u;\n-55 }\n-56\n-58 template\n-_\b5_\b9 constexpr V _\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b<_\bV_\b>, const U &u)\n-60 {\n-61 V result(_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b>(0));\n-62 for(auto l : _\br_\ba_\bn_\bg_\be(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(u)))\n-63 _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, result) = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, u);\n-64 return result;\n-65 }\n-66\n-68 template\n-_\b6_\b9 auto _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, _\bM_\be_\bt_\ba_\bT_\by_\bp_\be_\b<_\bV_\b>, S s)\n-70 {\n-71 return V(_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b>(s));\n-72 }\n-73\n-75 template\n-_\b7_\b6 V _\bc_\bo_\bn_\bd(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk_\b<_\bV_\b> &_\bm_\ba_\bs_\bk,\n-77 const V &ifTrue, const V &ifFalse) = delete;\n-78\n-80 template\n-_\b8_\b1 auto _\bm_\ba_\bx(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v1, const V &v2)\n-82 {\n-83 using std::max;\n-84 return _\bm_\ba_\bx(v1, v2);\n-85 }\n-86\n-88 template\n-_\b8_\b9 auto _\bm_\bi_\bn(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v1, const V &v2)\n-90 {\n-91 using std::min;\n-92 return _\bm_\bi_\bn(v1, v2);\n-93 }\n-94\n-96 template\n-_\b9_\b7 bool _\ba_\bn_\by_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk) = delete;\n-98\n-100\n-103 template\n-_\b1_\b0_\b4 bool _\ba_\bl_\bl_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n-105 {\n-106 return !_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(!_\bm_\ba_\bs_\bk);\n-107 }\n-108\n-110\n-113 template\n-_\b1_\b1_\b4 bool _\ba_\bn_\by_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n-115 {\n-116 return _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(!_\bm_\ba_\bs_\bk);\n-117 }\n-118\n-120\n-123 template\n-_\b1_\b2_\b4 bool _\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const _\bM_\ba_\bs_\bk &_\bm_\ba_\bs_\bk)\n-125 {\n-126 return !_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be(_\bm_\ba_\bs_\bk);\n-127 }\n-128\n-130 template\n-_\b1_\b3_\b1 auto _\bm_\ba_\bx(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v)\n-132 {\n-133 _\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b> m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(0, v);\n-134 for(std::size_t l = 1; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(v); ++l)\n-135 if(m < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v))\n-136 m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v);\n-137 return m;\n-138 }\n-139\n-141 template\n-_\b1_\b4_\b2 auto _\bm_\bi_\bn(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V &v)\n-143 {\n-144 _\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b> m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(0, v);\n-145 for(std::size_t l = 1; l < _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(v); ++l)\n-146 if(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v) < m)\n-147 m = _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, v);\n-148 return m;\n-149 }\n-150\n-152 template\n-_\b1_\b5_\b3 _\bM_\ba_\bs_\bk_\b<_\bV_\b> _\bm_\ba_\bs_\bk(_\bA_\bD_\bL_\bT_\ba_\bg<0, std::is_same >::value>,\n-154 const V &v)\n-155 {\n-156 return v;\n-157 }\n-158\n-160 template\n-_\b1_\b6_\b1 auto _\bm_\ba_\bs_\bk(_\bA_\bD_\bL_\bT_\ba_\bg<0, !std::is_same >::value>,\n-162 const V &v)\n-163 {\n-164 using Copy = _\bA_\bu_\bt_\bo_\bn_\bo_\bm_\bo_\bu_\bs_\bV_\ba_\bl_\bu_\be_\b<_\bV_\b>; // just in case we are handed a proxy\n-165 return v != Copy(_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bC_\bo_\bp_\by_\b>(0));\n-166 }\n-167\n-169 template\n-_\b1_\b7_\b0 auto _\bm_\ba_\bs_\bk_\bO_\br(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V1 &v1, const V2 &v2)\n-171 {\n-172 return _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v1) || _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v2);\n-173 }\n-174\n-176 template\n-_\b1_\b7_\b7 auto _\bm_\ba_\bs_\bk_\bA_\bn_\bd(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b0_\b>, const V1 &v1, const V2 &v2)\n-178 {\n-179 return _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v1) && _\bS_\bi_\bm_\bd_\b:_\b:_\bm_\ba_\bs_\bk(v2);\n-180 }\n-181\n-184 } // namespace Overloads\n-185 } // namespace Simd\n-186} // namespace Dune\n-187\n-188#endif // DUNE_COMMON_SIMD_DEFAULTS_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-_\bb_\ba_\bs_\be_\b._\bh_\bh\n-Basic definitions for SIMD Implementations.\n-_\bt_\by_\bp_\be_\bl_\bi_\bs_\bt_\b._\bh_\bh\n+_\b5_\b1 typedef RawDomainType _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n+52\n+_\b5_\b4 struct _\bT_\br_\ba_\bi_\bt_\bs\n+55 {\n+_\b5_\b6 typedef RawDomainType _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n+_\b5_\b7 typedef RawRangeType _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n+58 };\n+59\n+_\b6_\b6 void _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be(const typename _\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x, typename _\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:\n+_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& y) const;\n+67 }; // end of Function class\n+68\n+69\n+70\n+71 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bB_\bE_\bG_\bI_\bN\n+82 template \n+_\b8_\b3 class\n+84 [[deprecated(\"Dune::VirtualFunction is deprecated after Dune 2.7. Use C++ \"\n+85 \"function objects and std::function instead!\")]]\n+86 _\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn : public _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be_\b&_\b,_\b _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b&_\b>\n+87 {\n+88 public:\n+_\b8_\b9 typedef typename _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be_\b&_\b,_\b _\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b&_\b>_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs _\bT_\br_\ba_\bi_\bt_\bs;\n+90\n+_\b9_\b1 virtual _\b~_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn() {}\n+_\b9_\b8 virtual void _\be_\bv_\ba_\bl_\bu_\ba_\bt_\be(const typename _\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x, typename\n+_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& y) const = 0;\n+99 }; // end of VirtualFunction class\n+100 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bE_\bN_\bD\n+101\n+102 namespace Impl {\n+103\n+104 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bB_\bE_\bG_\bI_\bN\n+105 template\n+106 class LambdaVirtualFunction final\n+107 : public _\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+108 {\n+109 public:\n+110 LambdaVirtualFunction(F&& f)\n+111 : f_(std::move(f))\n+112 {}\n+113\n+114 LambdaVirtualFunction(const F& f)\n+115 : f_(f)\n+116 {}\n+117\n+118 void evaluate(const Domain& x, Range& y) const override\n+119 {\n+120 y = f_(x);\n+121 }\n+122\n+123 private:\n+124 const F f_;\n+125 };\n+126 _\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bE_\bN_\bD\n+127\n+128 } /* namespace Impl */\n+129\n+149 template\n+150 [[deprecated(\"Dune::LambdaVirtualFunction is deprecated after Dune 2.7. \"\n+151 \"Use std::function instead!\")]]\n+152 Impl::LambdaVirtualFunction< Domain, Range, std::decay_t >\n+_\b1_\b5_\b3 _\bm_\ba_\bk_\be_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn(F&& f)\n+154 {\n+155 return {std::forward(f)};\n+156 }\n+157\n+160} // end namespace\n+161\n+162#endif\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:_\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:300\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:558\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:_\bm_\ba_\bs_\bk\n-auto mask(const V &v)\n-Convert to mask, analogue of bool(s) for scalars.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:489\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:_\bM_\ba_\bs_\bk\n-Rebind< bool, V > Mask\n-Mask type type of some SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br\n-typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n-Element type of some SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\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-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bi_\bm_\bp_\bl_\bC_\ba_\bs_\bt\n-constexpr V implCast(ADLTag< 0 >, MetaType< V >, const V &u)\n-implements Simd::implCast(V)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bF_\ba_\bl_\bs_\be\n-bool allFalse(ADLTag< 0 >, const Mask &mask)\n-implements Simd::allFalse()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bl_\bl_\bT_\br_\bu_\be\n-bool allTrue(ADLTag< 0 >, const Mask &mask)\n-implements Simd::allTrue()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:104\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_\bA_\bn_\bd\n-auto maskAnd(ADLTag< 0 >, const V1 &v1, const V2 &v2)\n-implements Simd::maskAnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:177\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_\bO_\br\n-auto maskOr(ADLTag< 0 >, const V1 &v1, const V2 &v2)\n-implements Simd::maskOr()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:170\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bF_\ba_\bl_\bs_\be\n-bool anyFalse(ADLTag< 0 >, const Mask &mask)\n-implements Simd::anyFalse()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:114\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_\bi_\bn\n-auto min(ADLTag< 0 >, const V &v1, const V &v2)\n-implements binary Simd::min()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt\n-auto broadcast(ADLTag< 0 >, MetaType< V >, S s)\n-implements Simd::broadcast()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:69\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_\bx\n-auto max(ADLTag< 0 >, const V &v1, const V &v2)\n-implements binary Simd::max()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn defaults.hh:81\n+_\bd_\be_\bp_\br_\be_\bc_\ba_\bt_\be_\bd_\b._\bh_\bh\n+Definition of the DUNE_NO_DEPRECATED_* macros.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+Impl::LambdaVirtualFunction< Domain, Range, std::decay_t< F > >\n+makeVirtualFunction(F &&f)\n+make VirtualFunction out of a function object\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:153\n+_\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bE_\bN_\bD\n+#define DUNE_NO_DEPRECATED_END\n+Ignore deprecation warnings (end)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn deprecated.hh:38\n+_\bD_\bU_\bN_\bE_\b__\bN_\bO_\b__\bD_\bE_\bP_\bR_\bE_\bC_\bA_\bT_\bE_\bD_\b__\bB_\bE_\bG_\bI_\bN\n+#define DUNE_NO_DEPRECATED_BEGIN\n+Ignore deprecation warnings (start)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn deprecated.hh:32\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_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n-bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:543\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd\n-const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align\n-> mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align\n-> &ifFalse)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:535\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be\n-T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:520\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n-Tag used to force late-binding lookup in Dune::Simd::Overloads.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\ba_\bT_\by_\bp_\be\n-A type that refers to another type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn typelist.hh:33\n-_\bi_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b._\bh_\bh\n-User interface of the SIMD abstraction.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+Base class template for function classes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n+RawDomainType DomainType\n+Raw type of output variable with removed reference and constness.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n+void evaluate(const typename Traits::DomainType &x, typename Traits::RangeType\n+&y) const\n+Function evaluation.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n+RawRangeType RangeType\n+Raw type of input variable with removed reference and constness.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs\n+Traits class containing raw types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n+RawDomainType DomainType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n+RawRangeType RangeType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+Virtual base class template for function classes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\bT_\br_\ba_\bi_\bt_\bs\n+Function< constDomainType &, RangeType & >::Traits Traits\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\b~_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn\n+virtual ~VirtualFunction()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn function.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\br_\bt_\bu_\ba_\bl_\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\b:_\b:_\be_\bv_\ba_\bl_\bu_\ba_\bt_\be\n+virtual void evaluate(const typename Traits::DomainType &x, typename Traits::\n+RangeType &y) const =0\n+Function evaluation.\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: test.cc File Reference\n+dune-common: stdstreams.cc File Reference\n \n \n \n \n \n \n \n@@ -65,25 +65,53 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    test.cc File Reference
    \n+ \n+
    stdstreams.cc File Reference
    \n
    \n
    \n-
    #include <config.h>
    \n-#include <ostream>
    \n-#include <string>
    \n-#include <dune/common/simd/test.hh>
    \n-
    \n+
    #include "stdstreams.hh"
    \n+
    \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+Variables

    DVVerbType Dune::dvverb (std::cout)
     stream for very verbose output.
     
    DVerbType Dune::dverb (std::cout)
     Singleton of verbose debug stream.
     
    DInfoType Dune::dinfo (std::cout)
     Stream for informative output.
     
    DWarnType Dune::dwarn (std::cerr)
     Stream for warnings indicating problems.
     
    DGraveType Dune::dgrave (std::cerr)
     Stream for warnings indicating fatal errors.
     
    DErrType Dune::derr (std::cerr)
     Stream for error messages.
     
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,14 +1,34 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-test.cc File Reference\n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bt_\be_\bs_\bt_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+stdstreams.cc File Reference\n+#include \"_\bs_\bt_\bd_\bs_\bt_\br_\be_\ba_\bm_\bs_\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+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+_\bD_\bV_\bV_\be_\br_\bb_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\bv_\be_\br_\bb (std::cout)\n+\u00a0 stream for very verbose output.\n+\u00a0\n+ _\bD_\bV_\be_\br_\bb_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bv_\be_\br_\bb (std::cout)\n+\u00a0 _\bS_\bi_\bn_\bg_\bl_\be_\bt_\bo_\bn of verbose debug stream.\n+\u00a0\n+ _\bD_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bi_\bn_\bf_\bo (std::cout)\n+\u00a0 Stream for informative output.\n+\u00a0\n+ _\bD_\bW_\ba_\br_\bn_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bw_\ba_\br_\bn (std::cerr)\n+\u00a0 Stream for warnings indicating problems.\n+\u00a0\n+_\bD_\bG_\br_\ba_\bv_\be_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bg_\br_\ba_\bv_\be (std::cerr)\n+\u00a0 Stream for warnings indicating fatal errors.\n+\u00a0\n+ _\bD_\bE_\br_\br_\bT_\by_\bp_\be\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\br_\br (std::cerr)\n+\u00a0 Stream for error messages.\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.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: io.hh File Reference\n+dune-common: diagonalmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,76 +65,80 @@\n
    \n
    \n
    \n
    \n \n \n
    \n \n+
    diagonalmatrix.hh File Reference
    \n
    \n
    \n \n-

    IO interface of the SIMD abstraction. \n+

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

    \n-
    #include <ios>
    \n-#include <type_traits>
    \n-#include <dune/common/rangeutilities.hh>
    \n-#include <dune/common/simd/simd.hh>
    \n-#include <dune/common/typetraits.hh>
    \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/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 Classes

    class  Dune::SimdImpl::Inserter< T >
    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-\n-\n-\n-\n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::SimdImpl
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-Functions

    template<class V , class = std::enable_if_t<Simd::lanes<V>() != 1>>
    Inserter< V > Dune::SimdImpl::io (const V &v)
     
    template<class V , class = std::enable_if_t<Simd::lanes<V>() == 1>>
    Simd::Scalar< V > Dune::SimdImpl::io (const V &v)
     
    IO interface

    Templates and functions in this group provide syntactic sugar for IO. They are implemented using the functionality from SimdInterfaceBase, and are not customizable by implementations.

    \n-
    template<class V >
    auto Dune::Simd::vio (const V &v)
     construct a stream inserter
     
    template<class V >
    auto Dune::Simd::io (const V &v)
     construct a stream inserter
     
    \n

    Detailed Description

    \n-

    IO interface of the SIMD abstraction.

    \n-

    This file provides IO interface functions of the SIMD abstraction layer.

    \n-

    This file is intended for direct inclusion by header making use of the IO interface.

    \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,56 +1,58 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\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-io.hh File Reference\n-_\bC_\bo_\bm_\bm_\bo_\bn \u00bb _\bV_\be_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn \u00bb _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\bD_\be_\bv_\be_\bl_\bo_\bp_\be_\br_\b'_\bs_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-IO interface of the SIMD abstraction. _\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/_\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_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\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:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b<_\b _\bT_\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-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd\n-\u00a0 Namespace for vectorization interface functions used by library\n- developers.\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template() != 1>>\n- _\bI_\bn_\bs_\be_\br_\bt_\be_\br< V >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo (const V &v)\n-\u00a0\n-template() == 1>>\n-_\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br< V >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo (const V &v)\n-\u00a0\n-IO interface\n-Templates and functions in this group provide syntactic sugar for IO. They are\n-implemented using the functionality from SimdInterfaceBase, and are not\n-customizable by implementations.\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bv_\bi_\bo (const V &v)\n-\u00a0 construct a stream inserter\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bi_\bo (const V &v)\n-\u00a0 construct a stream inserter\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-IO interface of the SIMD abstraction.\n-This file provides IO interface functions of the SIMD abstraction layer.\n-This file is intended for direct inclusion by header making use of the IO\n-interface.\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/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: io.hh Source File\n+dune-common: diagonalmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,125 +70,1357 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    io.hh
    \n+
    diagonalmatrix.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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_IO_HH
    \n-
    4#define DUNE_COMMON_SIMD_IO_HH
    \n-
    5
    \n-
    16#include <ios>
    \n-
    17#include <type_traits>
    \n-
    18
    \n-\n-\n-\n-
    22
    \n-
    23namespace Dune {
    \n-
    24
    \n-
    \n-
    25 namespace SimdImpl {
    \n-
    26
    \n-
    27 template<class T>
    \n-
    \n-
    28 class Inserter {
    \n-
    29 T value_;
    \n-
    30
    \n-
    31 public:
    \n-
    32 Inserter(const T &value) : value_(value) {}
    \n-
    33
    \n-
    34 template<class Stream,
    \n-
    35 class = std::enable_if_t<std::is_base_of<std::ios_base,
    \n-
    36 Stream>::value> >
    \n-
    \n-
    37 friend Stream& operator<<(Stream &out, const Inserter &ins)
    \n-
    38 {
    \n-
    39 const char *sep = "<";
    \n-
    40 for(auto l : range(Simd::lanes(ins.value_)))
    \n-
    41 {
    \n-
    42 out << sep << autoCopy(Simd::lane(l, ins.value_));
    \n-
    43 sep = ", ";
    \n-
    44 }
    \n-
    45 out << '>';
    \n-
    46 return out;
    \n-
    47 }
    \n-
    \n-
    48 };
    \n-
    \n-
    49
    \n-
    50 template<class V, class = std::enable_if_t<Simd::lanes<V>() != 1> >
    \n-
    \n-
    51 Inserter<V> io(const V &v)
    \n-
    52 {
    \n-
    53 return { v };
    \n-
    54 }
    \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 (C) 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_DIAGONAL_MATRIX_HH
    \n+
    6#define DUNE_DIAGONAL_MATRIX_HH
    \n+
    7
    \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 template<class V, class = std::enable_if_t<Simd::lanes<V>() == 1> >
    \n-
    \n-
    57 Simd::Scalar<V> io(const V &v)
    \n-
    58 {
    \n-
    59 return Simd::lane(0, v);
    \n-
    60 }
    \n-
    \n-
    61
    \n-
    62 }
    \n-
    \n-
    63
    \n-
    64 namespace Simd {
    \n+
    56 public:
    \n+
    57 //===== type definitions and constants
    \n+
    58
    \n+
    60 typedef K value_type;
    \n+\n+
    62
    \n+
    64 typedef K block_type;
    \n
    65
    \n-
    82
    \n-
    89 template<class V>
    \n-
    \n-
    90 auto vio(const V &v)
    \n-
    91 {
    \n-
    92 return SimdImpl::Inserter<V>{ v };
    \n-
    93 }
    \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-
    94
    \n+
    91
    \n+
    92 //===== constructors
    \n+
    93
    \n+
    95 constexpr DiagonalMatrix() = default;
    \n
    96
    \n-
    105 template<class V>
    \n-
    \n-
    106 auto io(const V &v)
    \n-
    107 {
    \n-
    108 return SimdImpl::io(v);
    \n-
    109 }
    \n-
    \n-
    110
    \n-
    112
    \n-
    114
    \n-
    115 } // namespace Simd
    \n-
    116} // namespace Dune
    \n-
    117
    \n-
    118#endif // DUNE_COMMON_SIMD_IO_HH
    \n-
    Utilities for reduction like operations on ranges.
    \n-
    Traits for type conversions and type information.
    \n-
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \n-
    constexpr AutonomousValue< T > autoCopy(T &&v)
    Autonomous copy of an expression's value for use in auto type deduction.
    Definition typetraits.hh:642
    \n-
    auto io(const V &v)
    construct a stream inserter
    Definition io.hh:106
    \n-
    auto vio(const V &v)
    construct a stream inserter
    Definition io.hh:90
    \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-
    typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
    Element type of some SIMD type.
    Definition simd/interface.hh:235
    \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+
    106
    \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+
    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+
    \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+
    237
    \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+
    Traits for type conversions and type information.
    \n+
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n+
    Implements a matrix constructed from a given type representing a field and compile-time given number ...
    \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 a compile-time given numbe...
    \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+
    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-
    Inserter< V > io(const V &v)
    Definition io.hh:51
    \n-
    Definition io.hh:28
    \n-
    Inserter(const T &value)
    Definition io.hh:32
    \n-
    friend Stream & operator<<(Stream &out, const Inserter &ins)
    Definition io.hh:37
    \n-
    Include file for users of the SIMD abstraction layer.
    \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:95
    \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:274
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,135 +1,1601 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n- * _\bs_\bi_\bm_\bd\n-io.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// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_IO_HH\n-4#define DUNE_COMMON_SIMD_IO_HH\n-5\n-16#include \n-17#include \n-18\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_\bi_\bm_\bd_\b/_\bs_\bi_\bm_\bd_\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-_\b2_\b5 namespace SimdImpl {\n-26\n-27 template\n-_\b2_\b8 class _\bI_\bn_\bs_\be_\br_\bt_\be_\br {\n-29 T value_;\n-30\n-31 public:\n-_\b3_\b2 _\bI_\bn_\bs_\be_\br_\bt_\be_\br(const T &value) : value_(value) {}\n-33\n-34 template::value> >\n-_\b3_\b7 friend Stream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(Stream &out, const _\bI_\bn_\bs_\be_\br_\bt_\be_\br &ins)\n-38 {\n-39 const char *sep = \"<\";\n-40 for(auto l : _\br_\ba_\bn_\bg_\be(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be_\bs(ins.value_)))\n-41 {\n-42 out << sep << _\ba_\bu_\bt_\bo_\bC_\bo_\bp_\by(_\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(l, ins.value_));\n-43 sep = \", \";\n-44 }\n-45 out << '>';\n-46 return out;\n-47 }\n-48 };\n-49\n-50 template() != 1> >\n-_\b5_\b1 _\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b<_\bV_\b> _\bi_\bo(const V &v)\n-52 {\n-53 return { v };\n-54 }\n+4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n+5#ifndef DUNE_DIAGONAL_MATRIX_HH\n+6#define DUNE_DIAGONAL_MATRIX_HH\n+7\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 template() == 1> >\n-_\b5_\b7 _\bS_\bi_\bm_\bd_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\b<_\bV_\b> _\bi_\bo(const V &v)\n-58 {\n-59 return _\bS_\bi_\bm_\bd_\b:_\b:_\bl_\ba_\bn_\be(0, v);\n-60 }\n-61\n-62 }\n-63\n-64 namespace Simd {\n+56 public:\n+57 //===== type definitions and constants\n+58\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-82\n-89 template\n-_\b9_\b0 auto _\bv_\bi_\bo(const V &v)\n-91 {\n-92 return _\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b<_\bV_\b>{ v };\n-93 }\n-94\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-105 template\n-_\b1_\b0_\b6 auto _\bi_\bo(const V &v)\n-107 {\n-108 return _\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo(v);\n-109 }\n-110\n-112\n-114\n-115 } // namespace Simd\n-116} // namespace Dune\n-117\n-118#endif // DUNE_COMMON_SIMD_IO_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+_\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_\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_\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+_\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+_\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 _\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:_\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:300\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:642\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bi_\bo\n-auto io(const V &v)\n-construct a stream inserter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bv_\bi_\bo\n-auto vio(const V &v)\n-construct a stream inserter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:90\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:_\bS_\bc_\ba_\bl_\ba_\br\n-typename Overloads::ScalarType< std::decay_t< V > >::type Scalar\n-Element type of some SIMD type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn simd/interface.hh:235\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_\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+_\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+_\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+_\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:_\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:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bo\n-Inserter< V > io(const V &v)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br\n-Inserter(const T &value)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bs_\be_\br_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-friend Stream & operator<<(Stream &out, const Inserter &ins)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:37\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:_\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:95\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:274\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: vc.hh File Reference\n+dune-common: assertandreturn.hh File Reference\n \n \n \n \n \n \n \n@@ -69,25 +69,29 @@\n \n
    \n \n
    \n
    \n
    \n-
    vc.hh File Reference
    \n+
    \n+Macros
    \n+
    assertandreturn.hh File Reference
    \n
    \n
    \n-\n-

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

    \n-\n+
    #include <cassert>
    \n+
    \n

    Go to the source code of this file.

    \n-

    Detailed Description

    \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+\n+\n+\n+

    \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+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,15 +1,17 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-vc.hh File Reference\n-Compatibility header for including _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bM_\ba_\bc_\br_\bo_\bs\n+assertandreturn.hh File Reference\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-*\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-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+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 ===============================================================================\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: vc.hh Source File\n+dune-common: assertandreturn.hh Source File\n \n \n \n \n \n \n \n@@ -74,38 +74,36 @@\n \n
    \n \n
    \n
    \n
    \n-
    vc.hh
    \n+
    assertandreturn.hh
    \n
    \n
    \n-Go to the documentation of this file.
    1// SPDX-FileCopyrightInfo: Copyright (C) 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+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 (C) 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#include <cassert>
    \n+
    9
    \n+
    11
    \n+
    19#ifdef NDEBUG
    \n+
    20 #define DUNE_ASSERT_AND_RETURN(C,X) X
    \n+
    21#else
    \n+
    22 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return 0;}() : 0), X
    \n
    23#endif
    \n
    24
    \n-
    25// include the rest of Vc
    \n-
    26#include <Vc/Vc>
    \n-
    27
    \n-
    28#endif // HAVE_VC
    \n-
    29
    \n-
    30#endif // DUNE_COMMON_VC_HH
    \n+
    25
    \n+
    26
    \n+
    27#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,32 +1,31 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-vc.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 (C) 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 (C) 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_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+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#include \n+9\n+11\n+19#ifdef NDEBUG\n+20 #define DUNE_ASSERT_AND_RETURN(C,X) X\n+21#else\n+_\b2_\b2 #define DUNE_ASSERT_AND_RETURN(C,X) (!(C) ? throw [&](){assert(!#C);return\n+0;}() : 0), X\n 23#endif\n 24\n-25// include the rest of Vc\n-26#include \n-27\n-28#endif // HAVE_VC\n-29\n-30#endif // DUNE_COMMON_VC_HH\n+25\n+26\n+27#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/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: quadmath.hh File Reference\n+dune-common: proxymemberaccess.hh File Reference\n \n \n \n \n \n \n \n@@ -69,19 +69,43 @@\n \n
    \n \n
    \n
    \n
    \n-
    quadmath.hh File Reference
    \n+ \n+
    proxymemberaccess.hh File Reference
    \n
    \n
    \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,10 +1,28 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-quadmath.hh File Reference\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/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: quadmath.hh Source File\n+dune-common: proxymemberaccess.hh Source File\n \n \n \n \n \n \n \n@@ -74,490 +74,107 @@\n \n
    \n \n
    \n
    \n
    \n-
    quadmath.hh
    \n+
    proxymemberaccess.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 (C) 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_QUADMATH_HH
    \n-
    6#define DUNE_QUADMATH_HH
    \n+
    5#ifndef DUNE_COMMON_PROXYMEMBERACCESS_HH
    \n+
    6#define DUNE_COMMON_PROXYMEMBERACCESS_HH
    \n
    7
    \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 } // end namespace Impl
    \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 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-
    41 class Float128
    \n-
    42 {
    \n-
    43 float128_t value_ = 0.0q;
    \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 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 // 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 // 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 // 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 // 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+
    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 DUNE_ASSIGN_OP(*=);
    \n-
    122 DUNE_ASSIGN_OP(/=);
    \n-
    123
    \n-
    124#undef DUNE_ASSIGN_OP
    \n-
    125
    \n-
    126 }; // end class Float128
    \n-
    127
    \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-
    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-
    327
    \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 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 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-
    #define DUNE_BINARY_OP(OP)
    Definition debugalign.hh:248
    \n-
    #define DUNE_UNARY_FUNC(name)
    \n-
    #define DUNE_ASSIGN_OP(OP)
    Definition debugalign.hh:207
    \n-
    Traits for type conversions and type information.
    \n-
    A few common exception classes.
    \n-
    Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
    Read a std::tuple.
    Definition streamoperators.hh:43
    \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+
    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-
    T max_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:481
    \n-
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:487
    \n-
    auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:447
    \n-
    auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:425
    \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,527 +1,110 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-quadmath.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// -*- 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 (C) 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_QUADMATH_HH\n-6#define DUNE_QUADMATH_HH\n+5#ifndef DUNE_COMMON_PROXYMEMBERACCESS_HH\n+6#define DUNE_COMMON_PROXYMEMBERACCESS_HH\n 7\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 } // end namespace Impl\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 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-41 class Float128\n-42 {\n-43 float128_t value_ = 0.0q;\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 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 // 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 out << buf;\n-95 return out;\n-96 }\n-97\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 // 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 // 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+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 _\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#undef DUNE_ASSIGN_OP\n-125\n-126 }; // end class Float128\n-127\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-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-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 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 const bool isneg = (x < 0);\n-364 const bool isnan = (x != x);\n-365 const bool isinf = (isneg ? bool(-x > _\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-_\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:248\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:207\n-_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n-Traits for type conversions and type information.\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-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:_\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+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-_\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:481\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:487\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:_\bm_\bi_\bn\n-auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n-&b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:447\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:_\bm_\ba_\bx\n-auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n-&b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:425\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/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: debugalign.cc File Reference\n+dune-common: iteratorrange.hh File Reference\n \n \n \n \n \n \n \n@@ -70,45 +70,33 @@\n
    \n \n
    \n
    \n
    \n \n-
    debugalign.cc File Reference
    \n+Classes |\n+Namespaces
    \n+
    iteratorrange.hh File Reference
    \n
    \n
    \n-
    #include <config.h>
    \n-#include <cstddef>
    \n-#include <cstdlib>
    \n-#include <functional>
    \n-#include <ios>
    \n-#include <iostream>
    \n-#include <utility>
    \n-#include <dune/common/debugalign.hh>
    \n-
    \n+\n+

    Go to the source code of this file.

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

    \n+Classes

    class  Dune::IteratorRange< Iterator >
     Simple range between a begin and an end iterator. 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

    static void Dune::defaultViolatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
     default alignment violation handler
     
    ViolatedAlignmentHandlerDune::violatedAlignmentHandler ()
     access the handler called by violatedAlignment()
     
    void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
     called when an alignment violation is detected
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,19 @@\n dune-common\u00a02.9.0\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-debugalign.cc File Reference\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/_\bd_\be_\bb_\bu_\bg_\ba_\bl_\bi_\bg_\bn_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+iteratorrange.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+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+\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- static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt (const char\n- *_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be, std::size_t expectedAlignment, const\n- void *address)\n-\u00a0 default alignment violation handler\n-\u00a0\n-_\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br ()\n-\u00a0 access the handler called by _\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\b(_\b)\n-\u00a0\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt (const char *_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be,\n- std::size_t expectedAlignment, const void *address)\n-\u00a0 called when an alignment violation is detected\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/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: streamoperators.hh File Reference\n+dune-common: float_cmp.cc File Reference\n \n \n \n \n \n \n \n@@ -70,52 +70,120 @@\n
    \n \n
    \n
    \n
    \n \n-
    streamoperators.hh File Reference
    \n+
    float_cmp.cc File Reference
    \n
    \n
    \n-\n-

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

    \n-
    #include <array>
    \n-#include <tuple>
    \n-#include <utility>
    \n-#include <dune/common/hybridutilities.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+Classes

    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 Namespaces

    namespace  Dune
     Dune namespace.
     
    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+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

    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.
     
    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-

    Detailed Description

    \n-

    Implementation of stream operators for std::array and 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,35 +1,126 @@\n dune-common\u00a02.9.0\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-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+_\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:_\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:_\bF_\bl_\bo_\ba_\bt_\bC_\bm_\bp\n+\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\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+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-*\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-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/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: streamoperators.hh Source File\n+dune-common: float_cmp.cc Source File\n \n \n \n \n \n \n \n@@ -74,83 +74,627 @@\n \n
    \n \n
    \n
    \n
    \n-
    streamoperators.hh
    \n+
    float_cmp.cc
    \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 (C) 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_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+
    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
    \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-
    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:268
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \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+
    Various ways to compare floating-point numbers.
    \n+
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \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+
    vector space out of a tensor product of fields.
    Definition fvector.hh:95
    \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,81 +1,707 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-streamoperators.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: 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 (C) 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_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+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\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-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:268\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+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 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::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 size = val.size();\n+292 std::vector res(size);\n+293 for(unsigned int i = 0; i < size; ++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 size = val.size();\n+388 std::vector res(size);\n+389 for(unsigned int i = 0; i < size; ++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_\bl_\bo_\ba_\bt_\b__\bc_\bm_\bp_\b._\bh_\bh\n+Various ways to compare floating-point numbers.\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:_\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:_\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:95\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/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: ftraits.hh File Reference\n+dune-common: reservedvector.hh File Reference\n \n \n \n \n \n \n \n@@ -71,47 +71,71 @@\n \n
    \n
    \n
    \n \n-
    ftraits.hh File Reference
    \n+Namespaces |\n+Macros
    \n+
    reservedvector.hh File Reference
    \n
    \n
    \n \n-

    Type traits to determine the type of reals (when working with complex numbers) \n+

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

    \n-
    #include <complex>
    \n-#include <vector>
    \n+
    #include <algorithm>
    \n+#include <array>
    \n+#include <cassert>
    \n+#include <iostream>
    \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 Classes

    struct  Dune::FieldTraits< T >
     
    struct  Dune::FieldTraits< const T >
     
    struct  Dune::FieldTraits< std::complex< T > >
     
    struct  Dune::FieldTraits< T[N] >
     
    struct  Dune::FieldTraits< std::vector< T > >
    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+Macros

    #define CHECKSIZE(X)   {}
     
    \n

    Detailed Description

    \n-

    Type traits to determine the type of reals (when working with complex numbers)

    \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,32 +1,37 @@\n dune-common\u00a02.9.0\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-ftraits.hh File Reference\n-Type traits to determine the type of reals (when working with complex numbers)\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 \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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\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 _\bc_\bo_\bn_\bs_\bt_\b _\bT_\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 _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\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 _\bT_\b[_\bN_\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 _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>_\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+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-Type traits to determine the type of reals (when working with complex numbers)\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/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: ftraits.hh Source File\n+dune-common: reservedvector.hh Source File\n \n \n \n \n \n \n \n@@ -74,90 +74,528 @@\n \n
    \n \n
    \n
    \n
    \n-
    ftraits.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 (C) 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_FTRAITS_HH
    \n-
    6#define DUNE_FTRAITS_HH
    \n+
    5#ifndef DUNE_COMMON_RESERVEDVECTOR_HH
    \n+
    6#define DUNE_COMMON_RESERVEDVECTOR_HH
    \n
    7
    \n-
    12#include <complex>
    \n-
    13#include <vector>
    \n-
    14
    \n-
    15namespace Dune {
    \n-
    16
    \n-
    24 template<class T>
    \n-
    \n-\n-
    26 {
    \n-
    28 typedef T field_type;
    \n-
    30 typedef T real_type;
    \n-
    31 };
    \n-
    \n-
    32
    \n-
    33 template<class T>
    \n-
    \n-
    34 struct FieldTraits<const T>
    \n-
    35 {
    \n-\n-\n-
    38 };
    \n-
    \n-
    39
    \n-
    40 template<class T>
    \n-
    \n-
    41 struct FieldTraits< std::complex<T> >
    \n-
    42 {
    \n-
    43 typedef std::complex<T> field_type;
    \n-
    44 typedef T real_type;
    \n-
    45 };
    \n-
    \n-
    46
    \n-
    47 template<class T, unsigned int N>
    \n-
    \n-
    48 struct FieldTraits< T[N] >
    \n-
    49 {
    \n-\n-\n-
    52 };
    \n-
    \n-
    53
    \n-
    54 template<class T>
    \n-
    \n-
    55 struct FieldTraits< std::vector<T> >
    \n-
    56 {
    \n-\n-\n-
    59 };
    \n-
    \n-
    60
    \n-
    61} // end namespace Dune
    \n-
    62
    \n-
    63#endif // DUNE_FTRAITS_HH
    \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 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+
    \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+
    \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+
    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 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+
    \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+
    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+
    #define CHECKSIZE(X)
    Definition reservedvector.hh:25
    \n
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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-
    FieldTraits< T >::field_type field_type
    Definition ftraits.hh:36
    \n-
    FieldTraits< T >::real_type real_type
    Definition ftraits.hh:37
    \n-
    T real_type
    Definition ftraits.hh:44
    \n-
    std::complex< T > field_type
    Definition ftraits.hh:43
    \n-
    FieldTraits< T >::field_type field_type
    Definition ftraits.hh:50
    \n-
    FieldTraits< T >::real_type real_type
    Definition ftraits.hh:51
    \n-
    FieldTraits< T >::real_type real_type
    Definition ftraits.hh:58
    \n-
    FieldTraits< T >::field_type field_type
    Definition ftraits.hh:57
    \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,100 +1,633 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-ftraits.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 (C) 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_FTRAITS_HH\n-6#define DUNE_FTRAITS_HH\n+5#ifndef DUNE_COMMON_RESERVEDVECTOR_HH\n+6#define DUNE_COMMON_RESERVEDVECTOR_HH\n 7\n-12#include \n-13#include \n-14\n-15namespace _\bD_\bu_\bn_\be {\n-16\n-24 template\n-_\b2_\b5 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n-26 {\n-_\b2_\b8 typedef T _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b3_\b0 typedef T _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-31 };\n-32\n-33 template\n-_\b3_\b4 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs\n-35 {\n-_\b3_\b6 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b3_\b7 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-38 };\n-39\n-40 template\n-_\b4_\b1 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bs_\bt_\bd::complex >\n-42 {\n-_\b4_\b3 typedef std::complex _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b4_\b4 typedef T _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-45 };\n-46\n-47 template\n-_\b4_\b8 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< T[N] >\n-49 {\n-_\b5_\b0 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\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_\b1 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-52 };\n-53\n-54 template\n-_\b5_\b5 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bs_\bt_\bd::vector >\n-56 {\n-_\b5_\b7 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\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_\b8 typedef typename _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-59 };\n-60\n-61} // end namespace Dune\n-62\n-63#endif // DUNE_FTRAITS_HH\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 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+_\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_\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_\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 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+_\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+_\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+_\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 _\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:_\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:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< T >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bc_\bo_\bn_\bs_\bt_\b _\bT_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< T >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-T real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-std::complex< T > field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b[_\bN_\b]_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< T >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b[_\bN_\b]_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< T >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< T >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< T >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ftraits.hh:57\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/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: matrixconcepts.hh File Reference\n+dune-common: to_unique_ptr.hh File Reference\n \n \n \n \n \n \n \n@@ -70,29 +70,43 @@\n
    \n \n
    \n
    \n
    \n \n-
    matrixconcepts.hh File Reference
    \n+Namespaces |\n+Typedefs |\n+Functions
    \n+
    to_unique_ptr.hh File Reference
    \n
    \n
    \n-
    #include <utility>
    \n-#include <type_traits>
    \n-#include <dune/common/std/type_traits.hh>
    \n+
    #include <memory>
    \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+Typedefs

    template<class T >
    using Dune::ToUniquePtr = std::unique_ptr< T >
     Alias for std::unique_ptr introduced as transition wrapper.
     
    \n+\n+\n+\n+\n+\n

    \n+Functions

    template<class T , class... Args>
    std::unique_ptr< T > Dune::makeToUnique (Args &&... args)
     Alias for std::make_unique introduced as transition wrapper.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,18 +1,27 @@\n dune-common\u00a02.9.0\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\n-matrixconcepts.hh File Reference\n-#include \n-#include \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+_\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+to_unique_ptr.hh File Reference\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+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be_\bP_\bt_\br = std::unique_ptr< T >\n+\u00a0 Alias for std::unique_ptr introduced as transition wrapper.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+std::unique_ptr< T >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be (Args &&... args)\n+\u00a0 Alias for std::make_unique introduced as transition\n+ wrapper.\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/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: matrixconcepts.hh Source File\n+dune-common: to_unique_ptr.hh Source File\n \n \n \n \n \n \n \n@@ -74,109 +74,48 @@\n \n
    \n \n
    \n
    \n
    \n-
    matrixconcepts.hh
    \n+
    to_unique_ptr.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 (C) 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_MATRIXCONCEPTS_HH
    \n-
    6#define DUNE_COMMON_MATRIXCONCEPTS_HH
    \n-
    7
    \n+
    5
    \n+
    6#ifndef DUNE_TO_UNIQUE_PTR_HH
    \n+
    7#define DUNE_TO_UNIQUE_PTR_HH
    \n
    8
    \n-
    9
    \n-
    10#include <utility>
    \n-
    11#include <type_traits>
    \n+
    9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr or std::shared_ptr instead.
    \n+
    10
    \n+
    11#include <memory>
    \n
    12
    \n-\n-
    14
    \n-
    15
    \n-
    16
    \n-
    17namespace Dune {
    \n-
    18
    \n-
    19 template<class, int, int>
    \n-
    20 class FieldMatrix;
    \n-
    21
    \n-
    22 template<class>
    \n-
    23 class DynamicMatrix;
    \n-
    24
    \n-
    25}
    \n-
    26
    \n-
    27namespace Dune::Impl {
    \n-
    28
    \n+
    13namespace Dune
    \n+
    14{
    \n+
    17 template <class T>
    \n+
    18 using ToUniquePtr [[deprecated]] = std::unique_ptr<T>;
    \n+
    19
    \n+
    22 template <class T, class... Args>
    \n+
    \n+
    23 [[deprecated]] std::unique_ptr<T> makeToUnique (Args&&... args)
    \n+
    24 {
    \n+
    25 return std::make_unique(std::forward<Args>(args)...);
    \n+
    26 }
    \n+
    \n+
    27
    \n+
    28} // end namespace Dune
    \n
    29
    \n-
    30 // Some traits for checking matrix concepts. Currently these are
    \n-
    31 // all technical internal helpers that just serve different headers
    \n-
    32 // to do internal checks and are thus collected here.
    \n-
    33
    \n-
    34 template<class T>
    \n-
    35 using IsMatrixHelper = std::void_t<decltype(std::declval<T>().N(), std::declval<T>().M())>;
    \n-
    36
    \n-
    37 template<class T>
    \n-
    38 struct IsMatrix : public Dune::Std::is_detected<IsMatrixHelper, T> {};
    \n-
    39
    \n-
    40 // Check if T is a matrix by checking for member functions N() and M().
    \n-
    41 template<class T>
    \n-
    42 constexpr bool IsMatrix_v = Impl::IsMatrix<T>::value;
    \n-
    43
    \n-
    44
    \n-
    45
    \n-
    46 template<class T>
    \n-
    47 using IsStaticSizeMatrixHelper = std::void_t<decltype(T::rows, T::cols)>;
    \n-
    48
    \n-
    49 template<class T>
    \n-
    50 struct IsStaticSizeMatrix : public Dune::Std::is_detected<IsStaticSizeMatrixHelper, T> {};
    \n-
    51
    \n-
    52 // Check if T is a statically sized matrix by checking for static members rows and cols.
    \n-
    53 template<class T>
    \n-
    54 constexpr bool IsStaticSizeMatrix_v = Impl::IsStaticSizeMatrix<T>::value;
    \n-
    55
    \n-
    56
    \n-
    57
    \n-
    58 template<class T>
    \n-
    59 class IsFieldMatrix : public std::false_type {};
    \n-
    60
    \n-
    61 template< class K, int ROWS, int COLS>
    \n-
    62 class IsFieldMatrix<Dune::FieldMatrix<K, ROWS, COLS>> : public std::true_type {};
    \n-
    63
    \n-
    64 // Check if T is an instance of FieldMatrix
    \n-
    65 template<class T>
    \n-
    66 constexpr bool IsFieldMatrix_v = Impl::IsFieldMatrix<T>::value;
    \n-
    67
    \n-
    68
    \n-
    69
    \n-
    70 template<class T>
    \n-
    71 class IsDenseMatrix : public std::false_type {};
    \n-
    72
    \n-
    73 template<class K, int ROWS, int COLS>
    \n-
    74 class IsDenseMatrix<Dune::FieldMatrix<K, ROWS, COLS>> : public std::true_type {};
    \n-
    75
    \n-
    76 template<class K>
    \n-
    77 class IsDenseMatrix<Dune::DynamicMatrix<K>> : public std::true_type {};
    \n-
    78
    \n-
    79 // Check if T is a dense matrix. This is implemented by specialization.
    \n-
    80 template<class T>
    \n-
    81 constexpr bool IsDenseMatrix_v = Impl::IsDenseMatrix<T>::value;
    \n-
    82
    \n-
    83
    \n-
    84
    \n-
    85} // namespace Dune::Impl
    \n-
    86
    \n-
    87
    \n-
    88
    \n-
    89#endif // DUNE_COMMON_MATRIXCONCEPTS_HH
    \n-\n-
    typename detected_or< nonesuch, Op, Args... >::value_t is_detected
    Detects whether Op<Args...> is valid.
    Definition type_traits.hh:141
    \n+
    30#endif // DUNE_TO_UNIQUE_PTR_HH
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    std::unique_ptr< T > makeToUnique(Args &&... args)
    Alias for std::make_unique introduced as transition wrapper.
    Definition to_unique_ptr.hh:23
    \n+
    std::unique_ptr< T > ToUniquePtr
    Alias for std::unique_ptr introduced as transition wrapper.
    Definition to_unique_ptr.hh:18
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,113 +1,49 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-matrixconcepts.hh\n+to_unique_ptr.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 (C) 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_MATRIXCONCEPTS_HH\n-6#define DUNE_COMMON_MATRIXCONCEPTS_HH\n-7\n+5\n+6#ifndef DUNE_TO_UNIQUE_PTR_HH\n+7#define DUNE_TO_UNIQUE_PTR_HH\n 8\n-9\n-10#include \n-11#include \n+9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr\n+or std::shared_ptr instead.\n+10\n+11#include \n 12\n-13#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-14\n-15\n-16\n-17namespace _\bD_\bu_\bn_\be {\n-18\n-19 template\n-20 class FieldMatrix;\n-21\n-22 template\n-23 class DynamicMatrix;\n-24\n-25}\n-26\n-27namespace Dune::Impl {\n-28\n+13namespace _\bD_\bu_\bn_\be\n+14{\n+17 template \n+_\b1_\b8 using _\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be_\bP_\bt_\br [[deprecated]] = std::unique_ptr;\n+19\n+22 template \n+_\b2_\b3 [[deprecated]] std::unique_ptr _\bm_\ba_\bk_\be_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be (Args&&... args)\n+24 {\n+25 return std::make_unique(std::forward(args)...);\n+26 }\n+27\n+28} // end namespace Dune\n 29\n-30 // Some traits for checking matrix concepts. Currently these are\n-31 // all technical internal helpers that just serve different headers\n-32 // to do internal checks and are thus collected here.\n-33\n-34 template\n-35 using IsMatrixHelper = std::void_t().N(), std::\n-declval().M())>;\n-36\n-37 template\n-38 struct IsMatrix : public _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd {};\n-39\n-40 // Check if T is a matrix by checking for member functions N() and M().\n-41 template\n-42 constexpr bool IsMatrix_v = Impl::IsMatrix::value;\n-43\n-44\n-45\n-46 template\n-47 using IsStaticSizeMatrixHelper = std::void_t;\n-48\n-49 template\n-50 struct IsStaticSizeMatrix : public _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bd_\b:_\b:\n-_\bi_\bs_\b__\bd_\be_\bt_\be_\bc_\bt_\be_\bd {};\n-51\n-52 // Check if T is a statically sized matrix by checking for static members\n-rows and cols.\n-53 template\n-54 constexpr bool IsStaticSizeMatrix_v = Impl::IsStaticSizeMatrix::value;\n-55\n-56\n-57\n-58 template\n-59 class IsFieldMatrix : public std::false_type {};\n-60\n-61 template< class K, int ROWS, int COLS>\n-62 class IsFieldMatrix<_\bD_\bu_\bn_\be::FieldMatrix> : public std::\n-true_type {};\n-63\n-64 // Check if T is an instance of FieldMatrix\n-65 template\n-66 constexpr bool IsFieldMatrix_v = Impl::IsFieldMatrix::value;\n-67\n-68\n-69\n-70 template\n-71 class IsDenseMatrix : public std::false_type {};\n-72\n-73 template\n-74 class IsDenseMatrix<_\bD_\bu_\bn_\be::FieldMatrix> : public std::\n-true_type {};\n-75\n-76 template\n-77 class IsDenseMatrix<_\bD_\bu_\bn_\be::DynamicMatrix> : public std::true_type {};\n-78\n-79 // Check if T is a dense matrix. This is implemented by specialization.\n-80 template\n-81 constexpr bool IsDenseMatrix_v = Impl::IsDenseMatrix::value;\n-82\n-83\n-84\n-85} // namespace Dune::Impl\n-86\n-87\n-88\n-89#endif // DUNE_COMMON_MATRIXCONCEPTS_HH\n-_\bt_\by_\bp_\be_\b__\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\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:141\n+30#endif // DUNE_TO_UNIQUE_PTR_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:_\bm_\ba_\bk_\be_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be\n+std::unique_ptr< T > makeToUnique(Args &&... args)\n+Alias for std::make_unique introduced as transition wrapper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn to_unique_ptr.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\bo_\bU_\bn_\bi_\bq_\bu_\be_\bP_\bt_\br\n+std::unique_ptr< T > ToUniquePtr\n+Alias for std::unique_ptr introduced as transition wrapper.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn to_unique_ptr.hh:18\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: stdthread.hh File Reference\n+dune-common: fvector.hh File Reference\n \n \n \n \n \n \n \n@@ -70,64 +70,85 @@\n
    \n \n
    \n
    \n
    \n \n-
    stdthread.hh File Reference
    \n+ \n
    \n
    \n \n+

    Implements a vector constructed from a given type representing a field and a compile-time given size. \n+More...

    \n+
    #include <array>
    \n+#include <cmath>
    \n+#include <cstddef>
    \n+#include <cstdlib>
    \n+#include <complex>
    \n+#include <cstring>
    \n+#include <utility>
    \n+#include <initializer_list>
    \n+#include <algorithm>
    \n+#include "typetraits.hh"
    \n+#include "exceptions.hh"
    \n+#include "ftraits.hh"
    \n+#include "densevector.hh"
    \n+#include "boundschecking.hh"
    \n+#include <dune/common/math.hh>
    \n+#include <dune/common/promotiontraits.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::DenseMatVecTraits< FieldVector< K, SIZE > >
     
    struct  Dune::FieldTraits< FieldVector< K, SIZE > >
     
    struct  Dune::IsFieldVectorSizeCorrect< C, SIZE >
     TMP to check the size of a DenseVectors statically, if possible. More...
     
    struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE >, SIZE >
     
    struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE1 >, SIZE >
     
    class  Dune::FieldVector< K, SIZE >
     vector space out of a tensor product of fields. More...
     
    \n \n \n \n \n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n-\n-\n-\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.
     
    namespace  Dune::MathOverloads
     namespace for customization of math functions with Dune-Semantics
     
    \n \n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\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.
     
    template<class K , int SIZE>
    auto Dune::MathOverloads::isFinite (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
     
    template<class K , int SIZE>
    bool Dune::MathOverloads::isInf (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
     
    template<class K , int SIZE, typename = std::enable_if_t<HasNaN<K>::value>>
    bool Dune::MathOverloads::isNaN (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
     
    template<class K , typename = std::enable_if_t<HasNaN<K>::value>>
    bool Dune::MathOverloads::isUnordered (const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
     
    \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+

    Detailed Description

    \n+

    Implements a vector constructed from a given type representing a field and a compile-time given size.

    \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.9.0\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 | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-stdthread.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+fvector.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 vector constructed from a given type representing a field and a\n+compile-time given 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 \n+#include \"_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n+#include \"_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n+#include \"_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n+#include \"_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\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/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\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 _\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\b _\bC_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\n+\u00a0 TMP to check the size of a DenseVectors statically, if possible.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bS_\bI_\bZ_\bE_\b1_\b _\b>_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>\n+\u00a0 vector space out of a tensor product of fields. _\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__\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+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 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+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_\bF_\bi_\bn_\bi_\bt_\be (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, SIZE > &b,\n+ _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n+\u00a0\n+template\n+bool\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, SIZE > &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg<\n+ 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n+\u00a0\n+template::value>>\n+bool\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, SIZE > &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg<\n+ 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\n+\u00a0\n+template::value>>\n+bool\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, 1 > &b, const\n+ _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br< K, 1 > &c, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg< 2 >, _\bA_\bD_\bL_\bT_\ba_\bg)\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+*\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 vector constructed from a given type representing a field and a\n+compile-time given 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/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: stdthread.hh Source File\n+dune-common: fvector.hh Source File\n \n \n \n \n \n \n \n@@ -74,54 +74,639 @@\n \n
    \n \n
    \n
    \n
    \n-
    stdthread.hh
    \n+
    fvector.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 (C) 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_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+
    5#ifndef DUNE_FVECTOR_HH
    \n+
    6#define DUNE_FVECTOR_HH
    \n+
    7
    \n+
    8#include <array>
    \n+
    9#include <cmath>
    \n+
    10#include <cstddef>
    \n+
    11#include <cstdlib>
    \n+
    12#include <complex>
    \n+
    13#include <cstring>
    \n+
    14#include <utility>
    \n+
    15#include <initializer_list>
    \n+
    16#include <algorithm>
    \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-
    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+
    18#include "typetraits.hh"
    \n+
    19#include "exceptions.hh"
    \n+
    20
    \n+
    21#include "ftraits.hh"
    \n+
    22#include "densevector.hh"
    \n+
    23#include "boundschecking.hh"
    \n+
    24
    \n+
    25#include <dune/common/math.hh>
    \n+\n+
    27
    \n+
    28namespace Dune {
    \n+
    29
    \n+
    39 template< class K, int SIZE > class FieldVector;
    \n+
    40 template< class K, int SIZE >
    \n+
    \n+\n+
    42 {
    \n+\n+
    44 typedef std::array<K,SIZE> container_type;
    \n+
    45 typedef K value_type;
    \n+
    46 typedef typename container_type::size_type size_type;
    \n+
    47 };
    \n+
    \n+
    48
    \n+
    49 template< class K, int SIZE >
    \n+
    \n+
    50 struct FieldTraits< FieldVector<K,SIZE> >
    \n+
    51 {
    \n+\n+\n+
    54 };
    \n+
    \n+
    55
    \n+
    64 template<typename C, int SIZE>
    \n+
    \n+\n+
    66 {
    \n+
    71 constexpr static bool value = true;
    \n+
    72 };
    \n+
    \n+
    73
    \n+
    74 template<typename T, int SIZE>
    \n+
    \n+\n+
    76 {
    \n+
    77 constexpr static bool value = true;
    \n+
    78 };
    \n+
    \n+
    79
    \n+
    80 template<typename T, int SIZE, int SIZE1>
    \n+
    \n+\n+
    82 {
    \n+
    83 constexpr static bool value = false;
    \n+
    84 };
    \n+
    \n+
    85
    \n+
    86
    \n+
    92 template< class K, int SIZE >
    \n+
    \n+\n+
    94 public DenseVector< FieldVector<K,SIZE> >
    \n+
    95 {
    \n+
    96 std::array<K,SIZE> _data;
    \n+\n+
    98 public:
    \n+
    100 constexpr static int dimension = SIZE;
    \n+
    101
    \n+
    102 typedef typename Base::size_type size_type;
    \n+
    103 typedef typename Base::value_type value_type;
    \n+
    104
    \n+\n+
    107
    \n+\n+
    110
    \n+
    \n+
    112 constexpr FieldVector()
    \n+
    113 : _data{{}}
    \n+
    114 {}
    \n+
    \n+
    115
    \n+
    \n+
    117 explicit FieldVector (const K& t)
    \n+
    118 {
    \n+
    119 std::fill(_data.begin(),_data.end(),t);
    \n+
    120 }
    \n+
    \n+
    121
    \n+
    122#if __GNUC__ == 5 && !defined(__clang__)
    \n+
    123 // `... = default;` causes an internal compiler error on GCC 5.4 (Ubuntu 16.04)
    \n+
    125 FieldVector(const FieldVector& x) : _data(x._data) {}
    \n+
    126#else
    \n+
    128 FieldVector (const FieldVector&) = default;
    \n+
    129#endif
    \n+
    130
    \n+
    \n+
    132 FieldVector (std::initializer_list<K> const &l)
    \n+
    133 {
    \n+
    134 assert(l.size() == dimension);// Actually, this is not needed any more!
    \n+
    135 std::copy_n(l.begin(), std::min(static_cast<std::size_t>(dimension),
    \n+
    136 l.size()),
    \n+
    137 _data.begin());
    \n+
    138 }
    \n+
    \n+
    139
    \n+
    141 FieldVector& operator= (const FieldVector&) = default;
    \n+
    142
    \n+
    143 template <typename T>
    \n+
    \n+
    144 FieldVector& operator= (const FieldVector<T, SIZE>& x)
    \n+
    145 {
    \n+
    146 std::copy_n(x.begin(), SIZE, _data.begin());
    \n+
    147 return *this;
    \n+
    148 }
    \n+
    \n+
    149
    \n+
    150 template<typename T, int N>
    \n+\n+
    152
    \n+
    164 template<class C>
    \n+
    \n+\n+
    166 [[maybe_unused]] typename std::enable_if<IsFieldVectorSizeCorrect<C,SIZE>::value>::type* dummy=0)
    \n+
    167 {
    \n+
    168 // do a run-time size check, for the case that x is not a FieldVector
    \n+
    169 assert(x.size() == SIZE); // Actually this is not needed any more!
    \n+
    170 std::copy_n(x.begin(), std::min(static_cast<std::size_t>(SIZE),x.size()), _data.begin());
    \n+
    171 }
    \n+
    \n+
    172
    \n+
    174 template<class K1>
    \n+
    \n+\n+
    176 {
    \n+
    177 std::copy_n(x.begin(), SIZE, _data.begin());
    \n+
    178 }
    \n+
    \n+
    179
    \n+
    180 template<typename T, int N>
    \n+
    181 explicit FieldVector(const FieldVector<T, N>&) = delete;
    \n+
    182
    \n+
    183 using Base::operator=;
    \n+
    184
    \n+
    185 // make this thing a vector
    \n+
    186 static constexpr size_type size () { return SIZE; }
    \n+
    187
    \n+
    \n+\n+
    189 DUNE_ASSERT_BOUNDS(i < SIZE);
    \n+
    190 return _data[i];
    \n+
    191 }
    \n+
    \n+
    \n+
    192 const K & operator[](size_type i) const {
    \n+
    193 DUNE_ASSERT_BOUNDS(i < SIZE);
    \n+
    194 return _data[i];
    \n+
    195 }
    \n+
    \n+
    196
    \n+
    \n+
    198 K* data() noexcept
    \n+
    199 {
    \n+
    200 return _data.data();
    \n+
    201 }
    \n+
    \n+
    202
    \n+
    \n+
    204 const K* data() const noexcept
    \n+
    205 {
    \n+
    206 return _data.data();
    \n+
    207 }
    \n+
    \n+
    208
    \n+
    210 template <class Scalar,
    \n+
    211 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n+
    \n+
    212 friend auto operator* ( const FieldVector& vector, Scalar scalar)
    \n+
    213 {
    \n+\n+
    215
    \n+
    216 for (size_type i = 0; i < vector.size(); ++i)
    \n+
    217 result[i] = vector[i] * scalar;
    \n+
    218
    \n+
    219 return result;
    \n+
    220 }
    \n+
    \n+
    221
    \n+
    223 template <class Scalar,
    \n+
    224 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n+
    \n+
    225 friend auto operator* ( Scalar scalar, const FieldVector& vector)
    \n+
    226 {
    \n+\n+
    228
    \n+
    229 for (size_type i = 0; i < vector.size(); ++i)
    \n+
    230 result[i] = scalar * vector[i];
    \n+
    231
    \n+
    232 return result;
    \n+
    233 }
    \n+
    \n+
    234
    \n+
    236 template <class Scalar,
    \n+
    237 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n+
    \n+
    238 friend auto operator/ ( const FieldVector& vector, Scalar scalar)
    \n+
    239 {
    \n+\n+
    241
    \n+
    242 for (size_type i = 0; i < vector.size(); ++i)
    \n+
    243 result[i] = vector[i] / scalar;
    \n+
    244
    \n+
    245 return result;
    \n+
    246 }
    \n+
    \n+
    247
    \n+
    248 };
    \n+
    \n+
    249
    \n+
    261 template<class K, int SIZE>
    \n+
    \n+
    262 inline std::istream &operator>> ( std::istream &in,
    \n+\n+
    264 {
    \n+\n+
    266 for( typename FieldVector<K, SIZE>::size_type i = 0; i < SIZE; ++i )
    \n+
    267 in >> w[ i ];
    \n+
    268 if(in)
    \n+
    269 v = w;
    \n+
    270 return in;
    \n+
    271 }
    \n+
    \n+
    272
    \n+
    273#ifndef DOXYGEN
    \n+
    274 template< class K >
    \n+
    275 struct DenseMatVecTraits< FieldVector<K,1> >
    \n+
    276 {
    \n+
    277 typedef FieldVector<K,1> derived_type;
    \n+
    278 typedef K container_type;
    \n+
    279 typedef K value_type;
    \n+
    280 typedef size_t size_type;
    \n+
    281 };
    \n+
    282
    \n+
    285 template<class K>
    \n+
    286 class FieldVector<K, 1> :
    \n+
    287 public DenseVector< FieldVector<K,1> >
    \n+
    288 {
    \n+
    289 K _data;
    \n+
    290 typedef DenseVector< FieldVector<K,1> > Base;
    \n+
    291 public:
    \n+
    293 constexpr static int dimension = 1;
    \n+
    294
    \n+
    295 typedef typename Base::size_type size_type;
    \n+
    296
    \n+
    298 typedef K& reference;
    \n+
    299
    \n+
    301 typedef const K& const_reference;
    \n+
    302
    \n+
    303 //===== construction
    \n+
    304
    \n+
    306 constexpr FieldVector ()
    \n+
    307 : _data()
    \n+
    308 {}
    \n+
    309
    \n+
    311 template<typename T,
    \n+
    312 typename EnableIf = typename std::enable_if<
    \n+
    313 std::is_convertible<T, K>::value &&
    \n+
    314 ! std::is_base_of<DenseVector<typename FieldTraits<T>::field_type>, K
    \n+
    315 >::value
    \n+
    316 >::type
    \n+
    317 >
    \n+
    318 FieldVector (const T& k) : _data(k) {}
    \n+
    319
    \n+
    321 template<class C,
    \n+
    322 std::enable_if_t<
    \n+
    323 std::is_assignable<K&, typename DenseVector<C>::value_type>::value, int> = 0>
    \n+
    324 FieldVector (const DenseVector<C> & x)
    \n+
    325 {
    \n+
    326 static_assert(((bool)IsFieldVectorSizeCorrect<C,1>::value), "FieldVectors do not match in dimension!");
    \n+
    327 assert(x.size() == 1);
    \n+
    328 _data = x[0];
    \n+
    329 }
    \n+
    330
    \n+
    332 FieldVector(const FieldVector&) = default;
    \n+
    333
    \n+
    335 FieldVector& operator=(const FieldVector&) = default;
    \n+
    336
    \n+
    337 template <typename T>
    \n+
    338 FieldVector& operator= (const FieldVector<T, 1>& other)
    \n+
    339 {
    \n+
    340 _data = other[0];
    \n+
    341 return *this;
    \n+
    342 }
    \n+
    343
    \n+
    344 template<typename T, int N>
    \n+
    345 FieldVector& operator=(const FieldVector<T, N>&) = delete;
    \n+
    346
    \n+
    348 FieldVector (std::initializer_list<K> const &l)
    \n+
    349 {
    \n+
    350 assert(l.size() == 1);
    \n+
    351 _data = *l.begin();
    \n+
    352 }
    \n+
    353
    \n+
    355 template<typename T,
    \n+
    356 typename EnableIf = typename std::enable_if<
    \n+
    357 std::is_assignable<K&, T>::value &&
    \n+
    358 ! std::is_base_of<DenseVector<typename FieldTraits<T>::field_type>, K
    \n+
    359 >::value
    \n+
    360 >::type
    \n+
    361 >
    \n+
    362 inline FieldVector& operator= (const T& k)
    \n+
    363 {
    \n+
    364 _data = k;
    \n+
    365 return *this;
    \n+
    366 }
    \n+
    367
    \n+
    368 //===== forward methods to container
    \n+
    369 static constexpr size_type size () { return 1; }
    \n+
    370
    \n+
    371 K & operator[]([[maybe_unused]] size_type i)
    \n+
    372 {
    \n+
    373 DUNE_ASSERT_BOUNDS(i == 0);
    \n+
    374 return _data;
    \n+
    375 }
    \n+
    376 const K & operator[]([[maybe_unused]] size_type i) const
    \n+
    377 {
    \n+
    378 DUNE_ASSERT_BOUNDS(i == 0);
    \n+
    379 return _data;
    \n+
    380 }
    \n+
    381
    \n+
    383 K* data() noexcept
    \n+
    384 {
    \n+
    385 return &_data;
    \n+
    386 }
    \n+
    387
    \n+
    389 const K* data() const noexcept
    \n+
    390 {
    \n+
    391 return &_data;
    \n+
    392 }
    \n+
    393
    \n+
    394 //===== conversion operator
    \n+
    395
    \n+
    397 operator K& () { return _data; }
    \n+
    398
    \n+
    400 operator const K& () const { return _data; }
    \n+
    401 };
    \n+
    402
    \n+
    403 /* ----- FV / FV ----- */
    \n+
    404 /* mostly not necessary as these operations are already covered via the cast operator */
    \n+
    405
    \n+
    407 template<class K>
    \n+
    408 inline bool operator> (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n+
    409 {
    \n+
    410 return a[0]>b[0];
    \n+
    411 }
    \n+
    412
    \n+
    414 template<class K>
    \n+
    415 inline bool operator>= (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n+
    416 {
    \n+
    417 return a[0]>=b[0];
    \n+
    418 }
    \n+
    419
    \n+
    421 template<class K>
    \n+
    422 inline bool operator< (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n+
    423 {
    \n+
    424 return a[0]<b[0];
    \n+
    425 }
    \n+
    426
    \n+
    428 template<class K>
    \n+
    429 inline bool operator<= (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
    \n+
    430 {
    \n+
    431 return a[0]<=b[0];
    \n+
    432 }
    \n+
    433
    \n+
    434 /* ----- FV / scalar ----- */
    \n+
    435
    \n+
    437 template<class K>
    \n+
    438 inline FieldVector<K,1> operator+ (const FieldVector<K,1>& a, const K b)
    \n+
    439 {
    \n+
    440 return a[0]+b;
    \n+
    441 }
    \n+
    442
    \n+
    444 template<class K>
    \n+
    445 inline FieldVector<K,1> operator- (const FieldVector<K,1>& a, const K b)
    \n+
    446 {
    \n+
    447 return a[0]-b;
    \n+
    448 }
    \n+
    449
    \n+
    451 template<class K>
    \n+
    452 inline FieldVector<K,1> operator* (const FieldVector<K,1>& a, const K b)
    \n+
    453 {
    \n+
    454 return a[0]*b;
    \n+
    455 }
    \n+
    456
    \n+
    458 template<class K>
    \n+
    459 inline FieldVector<K,1> operator/ (const FieldVector<K,1>& a, const K b)
    \n+
    460 {
    \n+
    461 return a[0]/b;
    \n+
    462 }
    \n+
    463
    \n+
    465 template<class K>
    \n+
    466 inline bool operator> (const FieldVector<K,1>& a, const K b)
    \n+
    467 {
    \n+
    468 return a[0]>b;
    \n+
    469 }
    \n+
    470
    \n+
    472 template<class K>
    \n+
    473 inline bool operator>= (const FieldVector<K,1>& a, const K b)
    \n+
    474 {
    \n+
    475 return a[0]>=b;
    \n+
    476 }
    \n+
    477
    \n+
    479 template<class K>
    \n+
    480 inline bool operator< (const FieldVector<K,1>& a, const K b)
    \n+
    481 {
    \n+
    482 return a[0]<b;
    \n+
    483 }
    \n+
    484
    \n+
    486 template<class K>
    \n+
    487 inline bool operator<= (const FieldVector<K,1>& a, const K b)
    \n+
    488 {
    \n+
    489 return a[0]<=b;
    \n+
    490 }
    \n+
    491
    \n+
    493 template<class K>
    \n+
    494 inline bool operator== (const FieldVector<K,1>& a, const K b)
    \n+
    495 {
    \n+
    496 return a[0]==b;
    \n+
    497 }
    \n+
    498
    \n+
    500 template<class K>
    \n+
    501 inline bool operator!= (const FieldVector<K,1>& a, const K b)
    \n+
    502 {
    \n+
    503 return a[0]!=b;
    \n+
    504 }
    \n+
    505
    \n+
    506 /* ----- scalar / FV ------ */
    \n+
    507
    \n+
    509 template<class K>
    \n+
    510 inline FieldVector<K,1> operator+ (const K a, const FieldVector<K,1>& b)
    \n+
    511 {
    \n+
    512 return a+b[0];
    \n+
    513 }
    \n+
    514
    \n+
    516 template<class K>
    \n+
    517 inline FieldVector<K,1> operator- (const K a, const FieldVector<K,1>& b)
    \n+
    518 {
    \n+
    519 return a-b[0];
    \n+
    520 }
    \n+
    521
    \n+
    523 template<class K>
    \n+
    524 inline FieldVector<K,1> operator* (const K a, const FieldVector<K,1>& b)
    \n+
    525 {
    \n+
    526 return a*b[0];
    \n+
    527 }
    \n+
    528
    \n+
    530 template<class K>
    \n+
    531 inline FieldVector<K,1> operator/ (const K a, const FieldVector<K,1>& b)
    \n+
    532 {
    \n+
    533 return a/b[0];
    \n+
    534 }
    \n+
    535
    \n+
    537 template<class K>
    \n+
    538 inline bool operator> (const K a, const FieldVector<K,1>& b)
    \n+
    539 {
    \n+
    540 return a>b[0];
    \n+
    541 }
    \n+
    542
    \n+
    544 template<class K>
    \n+
    545 inline bool operator>= (const K a, const FieldVector<K,1>& b)
    \n+
    546 {
    \n+
    547 return a>=b[0];
    \n+
    548 }
    \n+
    549
    \n+
    551 template<class K>
    \n+
    552 inline bool operator< (const K a, const FieldVector<K,1>& b)
    \n+
    553 {
    \n+
    554 return a<b[0];
    \n+
    555 }
    \n+
    556
    \n+
    558 template<class K>
    \n+
    559 inline bool operator<= (const K a, const FieldVector<K,1>& b)
    \n+
    560 {
    \n+
    561 return a<=b[0];
    \n+
    562 }
    \n+
    563
    \n+
    565 template<class K>
    \n+
    566 inline bool operator== (const K a, const FieldVector<K,1>& b)
    \n+
    567 {
    \n+
    568 return a==b[0];
    \n+
    569 }
    \n+
    570
    \n+
    572 template<class K>
    \n+
    573 inline bool operator!= (const K a, const FieldVector<K,1>& b)
    \n+
    574 {
    \n+
    575 return a!=b[0];
    \n+
    576 }
    \n+
    577#endif
    \n+
    578
    \n+
    579 /* Overloads for common classification functions */
    \n+
    \n+
    580 namespace MathOverloads {
    \n+
    581
    \n+
    582 // ! Returns whether all entries are finite
    \n+
    583 template<class K, int SIZE>
    \n+
    \n+\n+
    585 bool out = true;
    \n+
    586 for(int i=0; i<SIZE; i++) {
    \n+
    587 out &= Dune::isFinite(b[i]);
    \n+
    588 }
    \n+
    589 return out;
    \n+
    590 }
    \n+
    \n+
    591
    \n+
    592 // ! Returns whether any entry is infinite
    \n+
    593 template<class K, int SIZE>
    \n+
    \n+\n+
    595 bool out = false;
    \n+
    596 for(int i=0; i<SIZE; i++) {
    \n+
    597 out |= Dune::isInf(b[i]);
    \n+
    598 }
    \n+
    599 return out;
    \n+
    600 }
    \n+
    \n+
    601
    \n+
    602 // ! Returns whether any entry is NaN
    \n+
    603 template<class K, int SIZE, typename = std::enable_if_t<HasNaN<K>::value>>
    \n+
    \n+\n+
    605 bool out = false;
    \n+
    606 for(int i=0; i<SIZE; i++) {
    \n+
    607 out |= Dune::isNaN(b[i]);
    \n+
    608 }
    \n+
    609 return out;
    \n+
    610 }
    \n+
    \n+
    611
    \n+
    612 // ! Returns true if either b or c is NaN
    \n+
    613 template<class K, typename = std::enable_if_t<HasNaN<K>::value>>
    \n+
    \n+\n+\n+
    616 return Dune::isUnordered(b[0],c[0]);
    \n+
    617 }
    \n+
    \n+
    618 } //MathOverloads
    \n+
    \n+
    619
    \n+
    622} // end namespace
    \n+
    623
    \n+
    624#endif
    \n+
    Traits for type conversions and type information.
    \n+
    Some useful basic math stuff.
    \n+
    Type traits to determine the type of reals (when working with complex numbers)
    \n+
    Macro for wrapping boundary checks.
    \n+
    Implements the dense vector interface, with an exchangeable storage class.
    \n+
    A few common exception classes.
    \n+
    Compute type of the result of an arithmetic operation involving two different number types.
    \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+
    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:556
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \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:42
    \n+
    bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:604
    \n+
    bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:594
    \n+
    auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:584
    \n+
    bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
    Definition fvector.hh:614
    \n+
    vector space out of a tensor product of fields.
    Definition fvector.hh:95
    \n+
    K * data() noexcept
    return pointer to underlying array
    Definition fvector.hh:198
    \n+
    constexpr FieldVector()
    Constructor making default-initialized vector.
    Definition fvector.hh:112
    \n+
    const value_type & const_reference
    The type used for const references to the vector entry.
    Definition fvector.hh:109
    \n+
    Base::size_type size_type
    Definition fvector.hh:102
    \n+
    FieldVector(const DenseVector< C > &x, typename std::enable_if< IsFieldVectorSizeCorrect< C, SIZE >::value >::type *dummy=0)
    Copy constructor from a second vector of possibly different type.
    Definition fvector.hh:165
    \n+
    FieldVector(const FieldVector< T, N > &)=delete
    \n+
    FieldVector(const K &t)
    Constructor making vector with identical coordinates.
    Definition fvector.hh:117
    \n+
    FieldVector(std::initializer_list< K > const &l)
    Construct from a std::initializer_list.
    Definition fvector.hh:132
    \n+
    const K * data() const noexcept
    return pointer to underlying array
    Definition fvector.hh:204
    \n+
    static constexpr int dimension
    The size of this vector.
    Definition fvector.hh:100
    \n+
    FieldVector(const FieldVector< K1, SIZE > &x)
    Constructor making vector with identical coordinates.
    Definition fvector.hh:175
    \n+
    static constexpr size_type size()
    Definition fvector.hh:186
    \n+
    K & operator[](size_type i)
    Definition fvector.hh:188
    \n+
    value_type & reference
    The type used for references to the vector entry.
    Definition fvector.hh:106
    \n+
    Base::value_type value_type
    Definition fvector.hh:103
    \n+
    const K & operator[](size_type i) const
    Definition fvector.hh:192
    \n+
    FieldVector & operator=(const FieldVector< T, N > &)=delete
    \n+
    FieldVector(const FieldVector &)=default
    Copy constructor.
    \n+
    Interface for a class of dense vectors over a given field.
    Definition densevector.hh:229
    \n+
    Traits::value_type value_type
    export the type representing the field
    Definition densevector.hh:250
    \n+
    Iterator begin()
    begin iterator
    Definition densevector.hh:347
    \n+
    size_type size() const
    size method
    Definition densevector.hh:336
    \n+
    Traits::size_type size_type
    The type used for the index access and size operation.
    Definition densevector.hh:259
    \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+\n+
    std::array< K, SIZE > container_type
    Definition fvector.hh:44
    \n+
    container_type::size_type size_type
    Definition fvector.hh:46
    \n+
    FieldVector< K, SIZE > derived_type
    Definition fvector.hh:43
    \n+
    FieldTraits< K >::real_type real_type
    Definition fvector.hh:53
    \n+
    FieldTraits< K >::field_type field_type
    Definition fvector.hh:52
    \n+
    TMP to check the size of a DenseVectors statically, if possible.
    Definition fvector.hh:66
    \n+
    static constexpr bool value
    True if C is not of type FieldVector or its dimension is not equal SIZE.
    Definition fvector.hh:71
    \n+
    Tag to make sure the functions in this namespace can be found by ADL.
    Definition math.hh:230
    \n+
    Definition matvectraits.hh:31
    \n+
    Helper class for tagging priorities.
    Definition typeutilities.hh:73
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,52 +1,713 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-stdthread.hh\n+fvector.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 (C) 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_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+5#ifndef DUNE_FVECTOR_HH\n+6#define DUNE_FVECTOR_HH\n+7\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \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-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+18#include \"_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n+19#include \"_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n+20\n+21#include \"_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\"\n+22#include \"_\bd_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+23#include \"_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\"\n+24\n+25#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bm_\ba_\bt_\bh_\b._\bh_\bh>\n+26#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+27\n+28namespace _\bD_\bu_\bn_\be {\n+29\n+39 template< class K, int SIZE > class FieldVector;\n+40 template< class K, int SIZE >\n+_\b4_\b1 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n+42 {\n+_\b4_\b3 typedef _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> _\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be;\n+_\b4_\b4 typedef std::array _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be;\n+_\b4_\b5 typedef K _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b4_\b6 typedef typename container_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+47 };\n+48\n+49 template< class K, int SIZE >\n+_\b5_\b0 struct _\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n+51 {\n+_\b5_\b2 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_\b3 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+54 };\n+55\n+64 template\n+_\b6_\b5 struct _\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt\n+66 {\n+_\b7_\b1 constexpr static bool _\bv_\ba_\bl_\bu_\be = true;\n+72 };\n+73\n+74 template\n+_\b7_\b5 struct _\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br,SIZE>\n+76 {\n+_\b7_\b7 constexpr static bool _\bv_\ba_\bl_\bu_\be = true;\n+78 };\n+79\n+80 template\n+_\b8_\b1 struct _\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br,SIZE>\n+82 {\n+_\b8_\b3 constexpr static bool _\bv_\ba_\bl_\bu_\be = false;\n+84 };\n+85\n+86\n+92 template< class K, int SIZE >\n+_\b9_\b3 class _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br :\n+94 public _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br< FieldVector >\n+95 {\n+96 std::array _data;\n+97 typedef _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> > _\bB_\ba_\bs_\be;\n+98 public:\n+_\b1_\b0_\b0 constexpr static int _\bd_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn = SIZE;\n+101\n+_\b1_\b0_\b2 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+_\b1_\b0_\b3 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+104\n+_\b1_\b0_\b6 typedef _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+107\n+_\b1_\b0_\b9 typedef const _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be& _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+110\n+_\b1_\b1_\b2 constexpr _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br()\n+113 : _data{{}}\n+114 {}\n+115\n+_\b1_\b1_\b7 explicit _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const K& t)\n+118 {\n+119 std::fill(_data.begin(),_data.end(),t);\n+120 }\n+121\n+122#if __GNUC__ == 5 && !defined(__clang__)\n+123 // `... = default;` causes an internal compiler error on GCC 5.4 (Ubuntu\n+16.04)\n+125 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& x) : _data(x._data) {}\n+126#else\n+_\b1_\b2_\b8 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br&) = default;\n+129#endif\n+130\n+_\b1_\b3_\b2 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (std::initializer_list const &l)\n+133 {\n+134 assert(l.size() == dimension);// Actually, this is not needed any more!\n+135 std::copy_n(l.begin(), std::min(static_cast(dimension),\n+136 l.size()),\n+137 _data.begin());\n+138 }\n+139\n+_\b1_\b4_\b1 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& operator= (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br&) = default;\n+142\n+143 template \n+_\b1_\b4_\b4 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& operator= (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bS_\bI_\bZ_\bE_\b>& x)\n+145 {\n+146 std::copy_n(x._\bb_\be_\bg_\bi_\bn(), SIZE, _data.begin());\n+147 return *this;\n+148 }\n+149\n+150 template\n+_\b1_\b5_\b1 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bN_\b>&) = delete;\n+152\n+164 template\n+_\b1_\b6_\b5 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const _\bD_\be_\bn_\bs_\be_\bV_\be_\bc_\bt_\bo_\br_\b<_\bC_\b> & x,\n+166 [[maybe_unused]] typename std::enable_if<_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b<_\bC_\b,_\bS_\bI_\bZ_\bE_\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be>::type* dummy=0)\n+167 {\n+168 // do a run-time size check, for the case that x is not a FieldVector\n+169 assert(x._\bs_\bi_\bz_\be() == SIZE); // Actually this is not needed any more!\n+170 std::copy_n(x._\bb_\be_\bg_\bi_\bn(), std::min(static_cast(SIZE),x._\bs_\bi_\bz_\be()),\n+_data.begin());\n+171 }\n+172\n+174 template\n+_\b1_\b7_\b5 explicit _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br (const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b1_\b,_\bS_\bI_\bZ_\bE_\b> & x)\n+176 {\n+177 std::copy_n(x._\bb_\be_\bg_\bi_\bn(), SIZE, _data.begin());\n+178 }\n+179\n+180 template\n+_\b1_\b8_\b1 explicit _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\b _\bN_\b>&) = delete;\n+182\n+183 using Base::operator=;\n+184\n+185 // make this thing a vector\n+_\b1_\b8_\b6 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be () { return SIZE; }\n+187\n+_\b1_\b8_\b8 K & _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {\n+189 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < SIZE);\n+190 return _data[i];\n+191 }\n+_\b1_\b9_\b2 const K & _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const {\n+193 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i < SIZE);\n+194 return _data[i];\n+195 }\n+196\n+_\b1_\b9_\b8 K* _\bd_\ba_\bt_\ba() noexcept\n+199 {\n+200 return _data.data();\n+201 }\n+202\n+_\b2_\b0_\b4 const K* _\bd_\ba_\bt_\ba() const noexcept\n+205 {\n+206 return _data.data();\n+207 }\n+208\n+210 template ::value, int> = 0>\n+_\b2_\b1_\b2 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& vector, Scalar scalar)\n+213 {\n+214 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,SIZE>\n+result;\n+215\n+216 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < vector._\bs_\bi_\bz_\be(); ++i)\n+217 result[i] = vector[i] * scalar;\n+218\n+219 return result;\n+220 }\n+221\n+223 template ::value, int> = 0>\n+_\b2_\b2_\b5 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( Scalar scalar, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& vector)\n+226 {\n+227 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,SIZE>\n+result;\n+228\n+229 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < vector._\bs_\bi_\bz_\be(); ++i)\n+230 result[i] = scalar * vector[i];\n+231\n+232 return result;\n+233 }\n+234\n+236 template ::value, int> = 0>\n+_\b2_\b3_\b8 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b ( const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br& vector, Scalar scalar)\n+239 {\n+240 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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<_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be,SIZE>\n+result;\n+241\n+242 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < vector._\bs_\bi_\bz_\be(); ++i)\n+243 result[i] = vector[i] / scalar;\n+244\n+245 return result;\n+246 }\n+247\n+248 };\n+249\n+261 template\n+_\b2_\b6_\b2 inline std::istream &operator>> ( std::istream &in,\n+263 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b> &v )\n+264 {\n+265 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b> w;\n+266 for( typename _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < SIZE; ++i )\n+267 in >> w[ i ];\n+268 if(in)\n+269 v = w;\n+270 return in;\n+271 }\n+272\n+273#ifndef DOXYGEN\n+274 template< class K >\n+275 struct _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bV_\be_\bc_\bT_\br_\ba_\bi_\bt_\bs< _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br >\n+276 {\n+277 typedef _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b1_\b> derived_type;\n+278 typedef K container_type;\n+279 typedef K value_type;\n+280 typedef size_t size_type;\n+281 };\n+282\n+285 template\n+286 class FieldVector :\n+287 public DenseVector< FieldVector >\n+288 {\n+289 K _data;\n+290 typedef DenseVector< FieldVector > Base;\n+291 public:\n+293 constexpr static int dimension = 1;\n+294\n+295 typedef typename Base::size_type size_type;\n+296\n+298 typedef K& reference;\n+299\n+301 typedef const K& const_reference;\n+302\n+303 //===== construction\n+304\n+306 constexpr FieldVector ()\n+307 : _data()\n+308 {}\n+309\n+311 template::value &&\n+314 ! std::is_base_of::field_type>, K\n+315 >::value\n+316 >::type\n+317 >\n+318 FieldVector (const T& k) : _data(k) {}\n+319\n+321 template::value_type>::value, int> =\n+0>\n+324 FieldVector (const DenseVector & x)\n+325 {\n+326 static_assert(((bool)IsFieldVectorSizeCorrect::value), \"FieldVectors\n+do not match in dimension!\");\n+327 assert(x.size() == 1);\n+328 _data = x[0];\n+329 }\n+330\n+332 FieldVector(const FieldVector&) = default;\n+333\n+335 FieldVector& operator=(const FieldVector&) = default;\n+336\n+337 template \n+338 FieldVector& operator= (const FieldVector& other)\n+339 {\n+340 _data = other[0];\n+341 return *this;\n+342 }\n+343\n+344 template\n+345 FieldVector& operator=(const FieldVector&) = delete;\n+346\n+348 FieldVector (std::initializer_list const &l)\n+349 {\n+350 assert(l.size() == 1);\n+351 _data = *l.begin();\n+352 }\n+353\n+355 template::value &&\n+358 ! std::is_base_of::field_type>, K\n+359 >::value\n+360 >::type\n+361 >\n+362 inline FieldVector& operator= (const T& k)\n+363 {\n+364 _data = k;\n+365 return *this;\n+366 }\n+367\n+368 //===== forward methods to container\n+369 static constexpr size_type size () { return 1; }\n+370\n+371 K & operator[]([[maybe_unused]] size_type i)\n+372 {\n+373 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n+374 return _data;\n+375 }\n+376 const K & operator[]([[maybe_unused]] size_type i) const\n+377 {\n+378 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bE_\bR_\bT_\b__\bB_\bO_\bU_\bN_\bD_\bS(i == 0);\n+379 return _data;\n+380 }\n+381\n+383 K* data() noexcept\n+384 {\n+385 return &_data;\n+386 }\n+387\n+389 const K* data() const noexcept\n+390 {\n+391 return &_data;\n+392 }\n+393\n+394 //===== conversion operator\n+395\n+397 operator K& () { return _data; }\n+398\n+400 operator const K& () const { return _data; }\n+401 };\n+402\n+403 /* ----- FV / FV ----- */\n+404 /* mostly not necessary as these operations are already covered via the\n+cast operator */\n+405\n+407 template\n+408 inline bool operator> (const FieldVector& a, const FieldVector&\n+b)\n+409 {\n+410 return a[0]>b[0];\n+411 }\n+412\n+414 template\n+415 inline bool operator>= (const FieldVector& a, const FieldVector&\n+b)\n+416 {\n+417 return a[0]>=b[0];\n+418 }\n+419\n+421 template\n+422 inline bool operator< (const FieldVector& a, const FieldVector&\n+b)\n+423 {\n+424 return a[0]\n+429 inline bool operator<= (const FieldVector& a, const FieldVector&\n+b)\n+430 {\n+431 return a[0]<=b[0];\n+432 }\n+433\n+434 /* ----- FV / scalar ----- */\n+435\n+437 template\n+438 inline FieldVector operator+ (const FieldVector& a, const K b)\n+439 {\n+440 return a[0]+b;\n+441 }\n+442\n+444 template\n+445 inline FieldVector operator- (const FieldVector& a, const K b)\n+446 {\n+447 return a[0]-b;\n+448 }\n+449\n+451 template\n+452 inline FieldVector operator* (const FieldVector& a, const K b)\n+453 {\n+454 return a[0]*b;\n+455 }\n+456\n+458 template\n+459 inline FieldVector operator/ (const FieldVector& a, const K b)\n+460 {\n+461 return a[0]/b;\n+462 }\n+463\n+465 template\n+466 inline bool operator> (const FieldVector& a, const K b)\n+467 {\n+468 return a[0]>b;\n+469 }\n+470\n+472 template\n+473 inline bool operator>= (const FieldVector& a, const K b)\n+474 {\n+475 return a[0]>=b;\n+476 }\n+477\n+479 template\n+480 inline bool operator< (const FieldVector& a, const K b)\n+481 {\n+482 return a[0]\n+487 inline bool operator<= (const FieldVector& a, const K b)\n+488 {\n+489 return a[0]<=b;\n+490 }\n+491\n+493 template\n+494 inline bool operator== (const FieldVector& a, const K b)\n+495 {\n+496 return a[0]==b;\n+497 }\n+498\n+500 template\n+501 inline bool operator!= (const FieldVector& a, const K b)\n+502 {\n+503 return a[0]!=b;\n+504 }\n+505\n+506 /* ----- scalar / FV ------ */\n+507\n+509 template\n+510 inline FieldVector operator+ (const K a, const FieldVector& b)\n+511 {\n+512 return a+b[0];\n+513 }\n+514\n+516 template\n+517 inline FieldVector operator- (const K a, const FieldVector& b)\n+518 {\n+519 return a-b[0];\n+520 }\n+521\n+523 template\n+524 inline FieldVector operator* (const K a, const FieldVector& b)\n+525 {\n+526 return a*b[0];\n+527 }\n+528\n+530 template\n+531 inline FieldVector operator/ (const K a, const FieldVector& b)\n+532 {\n+533 return a/b[0];\n+534 }\n+535\n+537 template\n+538 inline bool operator> (const K a, const FieldVector& b)\n+539 {\n+540 return a>b[0];\n+541 }\n+542\n+544 template\n+545 inline bool operator>= (const K a, const FieldVector& b)\n+546 {\n+547 return a>=b[0];\n+548 }\n+549\n+551 template\n+552 inline bool operator< (const K a, const FieldVector& b)\n+553 {\n+554 return a\n+559 inline bool operator<= (const K a, const FieldVector& b)\n+560 {\n+561 return a<=b[0];\n+562 }\n+563\n+565 template\n+566 inline bool operator== (const K a, const FieldVector& b)\n+567 {\n+568 return a==b[0];\n+569 }\n+570\n+572 template\n+573 inline bool operator!= (const K a, const FieldVector& b)\n+574 {\n+575 return a!=b[0];\n+576 }\n+577#endif\n+578\n+579 /* Overloads for common classification functions */\n+_\b5_\b8_\b0 namespace MathOverloads {\n+581\n+582 // ! Returns whether all entries are finite\n+583 template\n+_\b5_\b8_\b4 auto _\bi_\bs_\bF_\bi_\bn_\bi_\bt_\be(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n+585 bool out = true;\n+586 for(int i=0; i\n+_\b5_\b9_\b4 bool _\bi_\bs_\bI_\bn_\bf(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n+595 bool out = false;\n+596 for(int i=0; i::value>>\n+_\b6_\b0_\b4 bool _\bi_\bs_\bN_\ba_\bN(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\bS_\bI_\bZ_\bE_\b> &b, _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n+605 bool out = false;\n+606 for(int i=0; i::value>>\n+_\b6_\b1_\b4 bool _\bi_\bs_\bU_\bn_\bo_\br_\bd_\be_\br_\be_\bd(const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b1_\b> &b, const _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b1_\b> &c,\n+615 _\bP_\br_\bi_\bo_\br_\bi_\bt_\by_\bT_\ba_\bg_\b<_\b2_\b>, _\bA_\bD_\bL_\bT_\ba_\bg) {\n+616 return Dune::isUnordered(b[0],c[0]);\n+617 }\n+618 } //MathOverloads\n+619\n+622} // end namespace\n+623\n+624#endif\n+_\bt_\by_\bp_\be_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Traits for type conversions and type information.\n+_\bm_\ba_\bt_\bh_\b._\bh_\bh\n+Some useful basic math stuff.\n+_\bf_\bt_\br_\ba_\bi_\bt_\bs_\b._\bh_\bh\n+Type traits to determine the type of reals (when working with complex numbers)\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_\be_\bn_\bs_\be_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+Implements the dense vector interface, with an exchangeable storage class.\n+_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+A few common exception classes.\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_\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:_\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:556\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_\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:42\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+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_\bI_\bn_\bf\n+bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:594\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:584\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:614\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:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\ba_\bt_\ba\n+K * data() noexcept\n+return pointer to underlying array\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:198\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+constexpr FieldVector()\n+Constructor making default-initialized vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\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+const value_type & const_reference\n+The type used for const references to the vector entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:109\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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 fvector.hh:102\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+FieldVector(const DenseVector< C > &x, typename std::enable_if<\n+IsFieldVectorSizeCorrect< C, SIZE >::value >::type *dummy=0)\n+Copy constructor from a second vector of possibly different type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+FieldVector(const FieldVector< T, N > &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+FieldVector(const K &t)\n+Constructor making vector with identical coordinates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+FieldVector(std::initializer_list< K > const &l)\n+Construct from a std::initializer_list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\ba_\bt_\ba\n+const K * data() const noexcept\n+return pointer to underlying array\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:204\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+static constexpr int dimension\n+The size of this vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+FieldVector(const FieldVector< K1, SIZE > &x)\n+Constructor making vector with identical coordinates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr size_type size()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\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+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+value_type & reference\n+The type used for references to the vector entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\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 fvector.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const K & operator[](size_type i) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:192\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+FieldVector & operator=(const FieldVector< T, N > &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br\n+FieldVector(const FieldVector &)=default\n+Copy constructor.\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 densevector.hh:250\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:_\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 densevector.hh:259\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_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b__\bt_\by_\bp_\be\n+std::array< K, SIZE > container_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.hh:46\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 _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\br_\bi_\bv_\be_\bd_\b__\bt_\by_\bp_\be\n+FieldVector< K, SIZE > derived_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:43\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.hh:53\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_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bK_\b,_\b _\bS_\bI_\bZ_\bE_\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 fvector.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt\n+TMP to check the size of a DenseVectors statically, if possible.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be_\bC_\bo_\br_\br_\be_\bc_\bt_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+static constexpr bool value\n+True if C is not of type FieldVector or its dimension is not equal SIZE.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fvector.hh:71\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:_\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:_\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 ===============================================================================\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/a00182.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00182.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: debugallocator.hh File Reference\n+dune-common: indices.hh File Reference\n \n \n \n \n \n \n \n@@ -69,19 +69,115 @@\n \n
    \n \n
    \n
    \n
    \n-
    debugallocator.hh File Reference
    \n+ \n+
    indices.hh File Reference
    \n
    \n
    \n-\n+
    #include <cstddef>
    \n+#include <type_traits>
    \n+#include <utility>
    \n+#include <dune/common/keywords.hh>
    \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::Indices
     Namespace with predefined compile time indices for the range [0,19].
     
    \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+Functions

    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>...
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,10 +1,96 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-debugallocator.hh File Reference\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 <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bk_\be_\by_\bw_\bo_\br_\bd_\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+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_\bn_\bd_\bi_\bc_\be_\bs\n+\u00a0 Namespace with predefined compile time indices for the range\n+ [0,19].\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+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+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+ 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+ 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+ 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+ 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+ 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+ 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+ 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+ 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+ 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+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+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+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+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+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+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+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+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 ===============================================================================\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/a00182_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: debugallocator.hh Source File\n+dune-common: indices.hh Source File\n \n \n \n \n \n \n \n@@ -74,344 +74,119 @@\n \n
    \n \n
    \n
    \n
    \n-
    debugallocator.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 (C) 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_DEBUG_ALLOCATOR_HH
    \n-
    6#define DUNE_DEBUG_ALLOCATOR_HH
    \n-
    7
    \n-
    8#if __has_include(<sys/mman.h>)
    \n-
    9
    \n-
    10#include <sys/mman.h>
    \n-
    11#define HAVE_SYS_MMAN_H 1
    \n-
    12#define HAVE_MPROTECT 1
    \n-
    13
    \n-
    14#include <exception>
    \n-
    15#include <typeinfo>
    \n-
    16#include <vector>
    \n-
    17#include <iostream>
    \n-
    18#include <cstring>
    \n-
    19#include <cstdint>
    \n-
    20#include <cstdlib>
    \n-
    21#include <new>
    \n-
    22
    \n-
    23#include "mallocallocator.hh"
    \n-
    24
    \n-
    25namespace Dune
    \n-
    26{
    \n-
    27
    \n-
    28#ifndef DOXYGEN // hide implementation details from doxygen
    \n-
    29 namespace DebugMemory
    \n-
    30 {
    \n+
    5
    \n+
    6#ifndef DUNE_COMMON_INDICES_HH
    \n+
    7#define DUNE_COMMON_INDICES_HH
    \n+
    8
    \n+
    9#include <cstddef>
    \n+
    10#include <type_traits>
    \n+
    11#include <utility>
    \n+
    12
    \n+\n+
    14
    \n+
    15namespace Dune
    \n+
    16{
    \n+
    29 template<std::size_t i>
    \n+
    30 using index_constant = std::integral_constant<std::size_t, i>;
    \n
    31
    \n-
    32 extern const std::ptrdiff_t page_size;
    \n+
    32
    \n
    33
    \n-
    34 struct AllocationManager
    \n-
    35 {
    \n-
    36 typedef std::size_t size_type;
    \n-
    37 typedef std::ptrdiff_t difference_type;
    \n-
    38 typedef void* pointer;
    \n-
    39
    \n-
    40 protected:
    \n-
    41 static void allocation_error(const char* msg);
    \n-
    42
    \n-
    43 struct AllocationInfo;
    \n-
    44 friend struct AllocationInfo;
    \n-
    45
    \n-
    46#define ALLOCATION_ASSERT(A) { if (!(A)) \\
    \n-
    47 { allocation_error("Assertion " # A " failed");\\
    \n-
    48 }\\
    \n-
    49};
    \n-
    50
    \n-
    51 struct AllocationInfo
    \n-
    52 {
    \n-
    53 AllocationInfo(const std::type_info & t) : type(&t) {}
    \n-
    54 const std::type_info * type;
    \n-
    55
    \n-
    56 pointer page_ptr;
    \n-
    57 pointer ptr;
    \n-
    58 size_type pages;
    \n-
    59 size_type capacity;
    \n-
    60 size_type size;
    \n-
    61 bool not_free;
    \n-
    62 };
    \n+
    \n+
    50 namespace Indices
    \n+
    51 {
    \n+\n+
    54
    \n+\n+
    57
    \n+\n+
    60
    \n+\n
    63
    \n-
    64 typedef MallocAllocator<AllocationInfo> Alloc;
    \n-
    65 typedef std::vector<AllocationInfo, Alloc> AllocationList;
    \n-
    66 AllocationList allocation_list;
    \n-
    67
    \n-
    68 private:
    \n-
    69 void memprotect([[maybe_unused]] void* from,
    \n-
    70 [[maybe_unused]] difference_type len,
    \n-
    71 [[maybe_unused]] int prot)
    \n-
    72 {
    \n-
    73#if HAVE_SYS_MMAN_H && HAVE_MPROTECT
    \n-
    74 int result = mprotect(from, len, prot);
    \n-
    75 if (result == -1)
    \n-
    76 {
    \n-
    77
    \n-
    78 std::cerr << "ERROR: (" << result << ": " << strerror(result) << ")" << std::endl;
    \n-
    79 std::cerr << " Failed to ";
    \n-
    80 if (prot == PROT_NONE)
    \n-
    81 std::cerr << "protect ";
    \n-
    82 else
    \n-
    83 std::cerr << "unprotect ";
    \n-
    84 std::cerr << "memory range: "
    \n-
    85 << from << ", "
    \n-
    86 << static_cast<void*>(
    \n-
    87 static_cast<char*>(from) + len)
    \n-
    88 << std::endl;
    \n-
    89 abort();
    \n-
    90 }
    \n-
    91#else
    \n-
    92 std::cerr << "WARNING: memory protection not available" << std::endl;
    \n-
    93#endif
    \n-
    94 }
    \n-
    95
    \n-
    96 public:
    \n-
    97
    \n-
    98 ~AllocationManager ()
    \n-
    99 {
    \n-
    100 AllocationList::iterator it;
    \n-
    101 bool error = false;
    \n-
    102 for (it=allocation_list.begin(); it!=allocation_list.end(); it++)
    \n-
    103 {
    \n-
    104 if (it->not_free)
    \n-
    105 {
    \n-
    106 std::cerr << "ERROR: found memory chunk still in use: " <<
    \n-
    107 it->capacity << " bytes at " << it->ptr << std::endl;
    \n-
    108 error = true;
    \n-
    109 }
    \n-
    110 munmap(it->page_ptr, it->pages * page_size);
    \n-
    111 }
    \n-
    112 if (error)
    \n-
    113 allocation_error("lost allocations");
    \n-
    114 }
    \n-
    115
    \n-
    116 template<typename T>
    \n-
    117 T* allocate(size_type n)
    \n-
    118 {
    \n-
    119 // setup chunk info
    \n-
    120 AllocationInfo ai(typeid(T));
    \n-
    121 ai.size = n;
    \n-
    122 ai.capacity = n * sizeof(T);
    \n-
    123 ai.pages = (ai.capacity) / page_size + 2;
    \n-
    124 ai.not_free = true;
    \n-
    125 size_type overlap = ai.capacity % page_size;
    \n-
    126 ai.page_ptr = mmap(NULL, ai.pages * page_size,
    \n-
    127 PROT_READ | PROT_WRITE,
    \n-
    128#ifdef __APPLE__
    \n-
    129 MAP_ANON | MAP_PRIVATE,
    \n-
    130#else
    \n-
    131 MAP_ANONYMOUS | MAP_PRIVATE,
    \n-
    132#endif
    \n-
    133 -1, 0);
    \n-
    134 if (MAP_FAILED == ai.page_ptr)
    \n-
    135 {
    \n-
    136 throw std::bad_alloc();
    \n-
    137 }
    \n-
    138 ai.ptr = static_cast<char*>(ai.page_ptr) + page_size - overlap;
    \n-
    139 // write protect memory behind the actual data
    \n-
    140 memprotect(static_cast<char*>(ai.page_ptr) + (ai.pages-1) * page_size,
    \n-
    141 page_size,
    \n-
    142 PROT_NONE);
    \n-
    143 // remember the chunk
    \n-
    144 allocation_list.push_back(ai);
    \n-
    145 // return the ptr
    \n-
    146 return static_cast<T*>(ai.ptr);
    \n-
    147 }
    \n-
    148
    \n-
    149 template<typename T>
    \n-
    150 void deallocate(T* ptr, size_type n = 0) noexcept
    \n-
    151 {
    \n-
    152 // compute page address
    \n-
    153 void* page_ptr =
    \n-
    154 static_cast<void*>(
    \n-
    155 (char*)(ptr) - ((std::uintptr_t)(ptr) % page_size));
    \n-
    156 // search list
    \n-
    157 AllocationList::iterator it;
    \n-
    158 unsigned int i = 0;
    \n-
    159 for (it=allocation_list.begin(); it!=allocation_list.end(); it++, i++)
    \n-
    160 {
    \n-
    161 if (it->page_ptr == page_ptr)
    \n-
    162 {
    \n-
    163 // std::cout << "found memory_block in allocation " << i << std::endl;
    \n-
    164 // sanity checks
    \n-
    165 if (n != 0)
    \n-
    166 ALLOCATION_ASSERT(n == it->size);
    \n-
    167 ALLOCATION_ASSERT(ptr == it->ptr);
    \n-
    168 ALLOCATION_ASSERT(true == it->not_free);
    \n-
    169 ALLOCATION_ASSERT(typeid(T) == *(it->type));
    \n-
    170 // free memory
    \n-
    171 it->not_free = false;
    \n-
    172#if DEBUG_ALLOCATOR_KEEP
    \n-
    173 // write protect old memory
    \n-
    174 memprotect(it->page_ptr,
    \n-
    175 (it->pages) * page_size,
    \n-
    176 PROT_NONE);
    \n-
    177#else
    \n-
    178 // unprotect old memory
    \n-
    179 memprotect(it->page_ptr,
    \n-
    180 (it->pages) * page_size,
    \n-
    181 PROT_READ | PROT_WRITE);
    \n-
    182 munmap(it->page_ptr, it->pages * page_size);
    \n-
    183 // remove chunk info
    \n-
    184 allocation_list.erase(it);
    \n-
    185#endif
    \n-
    186 return;
    \n-
    187 }
    \n-
    188 }
    \n-
    189 allocation_error("memory block not found");
    \n-
    190 }
    \n-
    191 };
    \n-
    192#undef ALLOCATION_ASSERT
    \n-
    193
    \n-
    194 extern AllocationManager alloc_man;
    \n-
    195 } // end namespace DebugMemory
    \n-
    196#endif // DOXYGEN
    \n-
    197
    \n-
    198 template<class T>
    \n-
    199 class DebugAllocator;
    \n-
    200
    \n-
    201 // specialize for void
    \n-
    202 template <>
    \n-
    203 class DebugAllocator<void> {
    \n-
    204 public:
    \n-
    205 typedef void* pointer;
    \n-
    206 typedef const void* const_pointer;
    \n-
    207 // reference to void members are impossible.
    \n-
    208 typedef void value_type;
    \n-
    209 template <class U> struct rebind {
    \n-
    210 typedef DebugAllocator<U> other;
    \n-
    211 };
    \n-
    212 };
    \n-
    213
    \n-
    214 // actual implementation
    \n-
    233 template <class T>
    \n-
    234 class DebugAllocator {
    \n-
    235 public:
    \n-
    236 typedef std::size_t size_type;
    \n-
    237 typedef std::ptrdiff_t difference_type;
    \n-
    238 typedef T* pointer;
    \n-
    239 typedef const T* const_pointer;
    \n-
    240 typedef T& reference;
    \n-
    241 typedef const T& const_reference;
    \n-
    242 typedef T value_type;
    \n-
    243 template <class U> struct rebind {
    \n-
    244 typedef DebugAllocator<U> other;
    \n-
    245 };
    \n-
    246
    \n-
    248 DebugAllocator() noexcept {}
    \n-
    250 template <class U>
    \n-
    251 DebugAllocator(const DebugAllocator<U>&) noexcept {}
    \n-
    253 ~DebugAllocator() noexcept {}
    \n-
    254
    \n-
    255 pointer address(reference x) const
    \n-
    256 {
    \n-
    257 return &x;
    \n-
    258 }
    \n-
    259 const_pointer address(const_reference x) const
    \n-
    260 {
    \n-
    261 return &x;
    \n-
    262 }
    \n-
    263
    \n-
    265 pointer allocate(size_type n,
    \n-
    266 [[maybe_unused]] DebugAllocator<void>::const_pointer hint = 0)
    \n-
    267 {
    \n-
    268 return DebugMemory::alloc_man.allocate<T>(n);
    \n-
    269 }
    \n-
    270
    \n-
    272 void deallocate(pointer p, size_type n)
    \n-
    273 {
    \n-
    274 DebugMemory::alloc_man.deallocate<T>(p,n);
    \n-
    275 }
    \n-
    276
    \n-
    278 size_type max_size() const noexcept
    \n-
    279 {
    \n-
    280 return size_type(-1) / sizeof(T);
    \n-
    281 }
    \n-
    282
    \n-
    284 void construct(pointer p, const T& val)
    \n-
    285 {
    \n-
    286 ::new((void*)p)T(val);
    \n-
    287 }
    \n-
    288
    \n-
    290 template<typename ... Args>
    \n-
    291 void construct(pointer p, Args&&... args)
    \n-
    292 {
    \n-
    293 ::new((void *)p)T(std::forward<Args>(args) ...);
    \n-
    294 }
    \n-
    295
    \n-
    297 void destroy(pointer p)
    \n-
    298 {
    \n-
    299 p->~T();
    \n-
    300 }
    \n-
    301 };
    \n-
    302
    \n-
    304 template<class T>
    \n-
    305 constexpr bool
    \n-
    306 operator==(const DebugAllocator<T> &, const DebugAllocator<T> &)
    \n-
    307 {
    \n-
    308 return true;
    \n-
    309 }
    \n-
    310
    \n-
    312 template<class T>
    \n-
    313 constexpr bool
    \n-
    314 operator!=(const DebugAllocator<T> &, const DebugAllocator<T> &)
    \n-
    315 {
    \n-
    316 return false;
    \n-
    317 }
    \n-
    318}
    \n-
    319
    \n-
    320#ifdef DEBUG_NEW_DELETE
    \n-
    321void * operator new(size_t size)
    \n-
    322{
    \n-
    323 // try to allocate size bytes
    \n-
    324 void *p = Dune::DebugMemory::alloc_man.allocate<char>(size);
    \n-
    325#if DEBUG_NEW_DELETE > 2
    \n-
    326 std::cout << "NEW " << size
    \n-
    327 << " -> " << p
    \n-
    328 << std::endl;
    \n-
    329#endif
    \n-
    330 return p;
    \n-
    331}
    \n-
    332
    \n-
    333void operator delete(void * p) noexcept
    \n-
    334{
    \n-
    335#if DEBUG_NEW_DELETE > 2
    \n-
    336 std::cout << "FREE " << p << std::endl;
    \n-
    337#endif
    \n-
    338 Dune::DebugMemory::alloc_man.deallocate<char>(static_cast<char*>(p));
    \n-
    339}
    \n-
    340
    \n-
    341void operator delete(void * p, size_t size) noexcept
    \n-
    342{
    \n-
    343#if DEBUG_NEW_DELETE > 2
    \n-
    344 std::cout << "FREE " << p << std::endl;
    \n-
    345#endif
    \n-
    346 Dune::DebugMemory::alloc_man.deallocate<char>(static_cast<char*>(p), size);
    \n-
    347}
    \n-
    348
    \n-
    349#endif // DEBUG_NEW_DELETE
    \n-
    350
    \n-
    351#endif // __has_include(<sys/mman.h>)
    \n-
    352
    \n-
    353#endif // DUNE_DEBUG_ALLOCATOR_HH
    \n-
    Allocators that use malloc/free.
    \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:237
    \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:259
    \n+\n+
    66
    \n+\n+
    69
    \n+\n+
    72
    \n+\n+
    75
    \n+\n+
    78
    \n+\n+
    81
    \n+\n+
    84
    \n+\n+
    87
    \n+\n+
    90
    \n+\n+
    93
    \n+\n+
    96
    \n+\n+
    99
    \n+\n+
    102
    \n+\n+
    105
    \n+\n+
    108
    \n+\n+
    111
    \n+
    112 } // namespace Indices
    \n+
    \n+
    113
    \n+
    124 template<class F, class I, I... i>
    \n+
    \n+
    125 decltype(auto) constexpr unpackIntegerSequence(F&& f, std::integer_sequence<I, i...> sequence)
    \n+
    126 {
    \n+
    127 return f(std::integral_constant<I, i>()...);
    \n+
    128 }
    \n+
    \n+
    129
    \n+
    130} //namespace Dune
    \n+
    131
    \n+
    132#endif // DUNE_COMMON_INDICES_HH
    \n+
    Definitions of several macros that conditionally make C++ syntax available.
    \n+
    #define DUNE_INLINE_VARIABLE
    Definition keywords.hh:19
    \n+
    constexpr index_constant< 16 > _16
    Compile time index with value 16.
    Definition indices.hh:101
    \n+
    constexpr index_constant< 15 > _15
    Compile time index with value 15.
    Definition indices.hh:98
    \n+
    constexpr index_constant< 8 > _8
    Compile time index with value 8.
    Definition indices.hh:77
    \n+
    constexpr index_constant< 7 > _7
    Compile time index with value 7.
    Definition indices.hh:74
    \n+
    constexpr index_constant< 0 > _0
    Compile time index with value 0.
    Definition indices.hh:53
    \n+
    constexpr index_constant< 9 > _9
    Compile time index with value 9.
    Definition indices.hh:80
    \n+
    constexpr index_constant< 14 > _14
    Compile time index with value 14.
    Definition indices.hh:95
    \n+
    constexpr index_constant< 1 > _1
    Compile time index with value 1.
    Definition indices.hh:56
    \n+
    constexpr index_constant< 3 > _3
    Compile time index with value 3.
    Definition indices.hh:62
    \n+
    constexpr index_constant< 12 > _12
    Compile time index with value 12.
    Definition indices.hh:89
    \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:125
    \n+
    constexpr index_constant< 11 > _11
    Compile time index with value 11.
    Definition indices.hh:86
    \n+
    constexpr index_constant< 18 > _18
    Compile time index with value 18.
    Definition indices.hh:107
    \n+
    constexpr index_constant< 13 > _13
    Compile time index with value 13.
    Definition indices.hh:92
    \n+
    constexpr index_constant< 5 > _5
    Compile time index with value 5.
    Definition indices.hh:68
    \n+
    constexpr index_constant< 17 > _17
    Compile time index with value 17.
    Definition indices.hh:104
    \n+
    constexpr index_constant< 10 > _10
    Compile time index with value 10.
    Definition indices.hh:83
    \n+
    constexpr index_constant< 2 > _2
    Compile time index with value 2.
    Definition indices.hh:59
    \n+
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:30
    \n+
    constexpr index_constant< 19 > _19
    Compile time index with value 19.
    Definition indices.hh:110
    \n+
    constexpr index_constant< 6 > _6
    Compile time index with value 6.
    Definition indices.hh:71
    \n+
    constexpr index_constant< 4 > _4
    Compile time index with value 4.
    Definition indices.hh:65
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,353 +1,183 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-debugallocator.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 (C) 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_DEBUG_ALLOCATOR_HH\n-6#define DUNE_DEBUG_ALLOCATOR_HH\n-7\n-8#if __has_include()\n-9\n-10#include \n-11#define HAVE_SYS_MMAN_H 1\n-12#define HAVE_MPROTECT 1\n-13\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\n-23#include \"_\bm_\ba_\bl_\bl_\bo_\bc_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n-24\n-25namespace _\bD_\bu_\bn_\be\n-26{\n-27\n-28#ifndef DOXYGEN // hide implementation details from doxygen\n-29 namespace DebugMemory\n-30 {\n+5\n+6#ifndef DUNE_COMMON_INDICES_HH\n+7#define DUNE_COMMON_INDICES_HH\n+8\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/_\bk_\be_\by_\bw_\bo_\br_\bd_\bs_\b._\bh_\bh>\n+14\n+15namespace _\bD_\bu_\bn_\be\n+16{\n+29 template\n+_\b3_\b0 using _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt = std::integral_constant;\n 31\n-32 extern const std::ptrdiff_t page_size;\n+32\n 33\n-34 struct AllocationManager\n-35 {\n-36 typedef std::size_t size_type;\n-37 typedef std::ptrdiff_t difference_type;\n-38 typedef void* pointer;\n-39\n-40 protected:\n-41 static void allocation_error(const char* msg);\n-42\n-43 struct AllocationInfo;\n-44 friend struct AllocationInfo;\n-45\n-46#define ALLOCATION_ASSERT(A) { if (!(A)) \\\n-47 { allocation_error(\"Assertion \" # A \" failed\");\\\n-48 }\\\n-49};\n-50\n-51 struct AllocationInfo\n-52 {\n-53 AllocationInfo(const std::type_info & t) : type(&t) {}\n-54 const std::type_info * type;\n-55\n-56 pointer page_ptr;\n-57 pointer ptr;\n-58 size_type pages;\n-59 size_type capacity;\n-60 size_type size;\n-61 bool not_free;\n-62 };\n+_\b5_\b0 namespace Indices\n+51 {\n+_\b5_\b3 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b0_\b> _\b__\b0 = {};\n+54\n+_\b5_\b6 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b1_\b> _\b__\b1 = {};\n+57\n+_\b5_\b9 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b2_\b> _\b__\b2 = {};\n+60\n+_\b6_\b2 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b3_\b> _\b__\b3 = {};\n 63\n-64 typedef MallocAllocator Alloc;\n-65 typedef std::vector AllocationList;\n-66 AllocationList allocation_list;\n-67\n-68 private:\n-69 void memprotect([[maybe_unused]] void* from,\n-70 [[maybe_unused]] difference_type len,\n-71 [[maybe_unused]] int prot)\n-72 {\n-73#if HAVE_SYS_MMAN_H && HAVE_MPROTECT\n-74 int result = mprotect(from, len, prot);\n-75 if (result == -1)\n-76 {\n-77\n-78 std::cerr << \"ERROR: (\" << result << \": \" << strerror(result) << \")\" <<\n-std::endl;\n-79 std::cerr << \" Failed to \";\n-80 if (prot == PROT_NONE)\n-81 std::cerr << \"protect \";\n-82 else\n-83 std::cerr << \"unprotect \";\n-84 std::cerr << \"memory range: \"\n-85 << from << \", \"\n-86 << static_cast(\n-87 static_cast(from) + len)\n-88 << std::endl;\n-89 abort();\n-90 }\n-91#else\n-92 std::cerr << \"WARNING: memory protection not available\" << std::endl;\n-93#endif\n-94 }\n-95\n-96 public:\n-97\n-98 ~AllocationManager ()\n-99 {\n-100 AllocationList::iterator it;\n-101 bool error = false;\n-102 for (it=allocation_list.begin(); it!=allocation_list.end(); it++)\n-103 {\n-104 if (it->not_free)\n-105 {\n-106 std::cerr << \"ERROR: found memory chunk still in use: \" <<\n-107 it->capacity << \" bytes at \" << it->ptr << std::endl;\n-108 error = true;\n-109 }\n-110 munmap(it->page_ptr, it->pages * page_size);\n-111 }\n-112 if (error)\n-113 allocation_error(\"lost allocations\");\n-114 }\n-115\n-116 template\n-117 T* allocate(size_type n)\n-118 {\n-119 // setup chunk info\n-120 AllocationInfo ai(typeid(T));\n-121 ai.size = n;\n-122 ai.capacity = n * sizeof(T);\n-123 ai.pages = (ai.capacity) / page_size + 2;\n-124 ai.not_free = true;\n-125 size_type overlap = ai.capacity % page_size;\n-126 ai.page_ptr = mmap(NULL, ai.pages * page_size,\n-127 PROT_READ | PROT_WRITE,\n-128#ifdef __APPLE__\n-129 MAP_ANON | MAP_PRIVATE,\n-130#else\n-131 MAP_ANONYMOUS | MAP_PRIVATE,\n-132#endif\n-133 -1, 0);\n-134 if (MAP_FAILED == ai.page_ptr)\n-135 {\n-136 throw std::bad_alloc();\n-137 }\n-138 ai.ptr = static_cast(ai.page_ptr) + page_size - overlap;\n-139 // write protect memory behind the actual data\n-140 memprotect(static_cast(ai.page_ptr) + (ai.pages-1) * page_size,\n-141 page_size,\n-142 PROT_NONE);\n-143 // remember the chunk\n-144 allocation_list.push_back(ai);\n-145 // return the ptr\n-146 return static_cast(ai.ptr);\n-147 }\n-148\n-149 template\n-150 void deallocate(T* ptr, size_type n = 0) noexcept\n-151 {\n-152 // compute page address\n-153 void* page_ptr =\n-154 static_cast(\n-155 (char*)(ptr) - ((std::uintptr_t)(ptr) % page_size));\n-156 // search list\n-157 AllocationList::iterator it;\n-158 unsigned int i = 0;\n-159 for (it=allocation_list.begin(); it!=allocation_list.end(); it++, i++)\n-160 {\n-161 if (it->page_ptr == page_ptr)\n-162 {\n-163 // std::cout << \"found memory_block in allocation \" << i << std::endl;\n-164 // sanity checks\n-165 if (n != 0)\n-166 ALLOCATION_ASSERT(n == it->size);\n-167 ALLOCATION_ASSERT(ptr == it->ptr);\n-168 ALLOCATION_ASSERT(true == it->not_free);\n-169 ALLOCATION_ASSERT(typeid(T) == *(it->type));\n-170 // free memory\n-171 it->not_free = false;\n-172#if DEBUG_ALLOCATOR_KEEP\n-173 // write protect old memory\n-174 memprotect(it->page_ptr,\n-175 (it->pages) * page_size,\n-176 PROT_NONE);\n-177#else\n-178 // unprotect old memory\n-179 memprotect(it->page_ptr,\n-180 (it->pages) * page_size,\n-181 PROT_READ | PROT_WRITE);\n-182 munmap(it->page_ptr, it->pages * page_size);\n-183 // remove chunk info\n-184 allocation_list.erase(it);\n-185#endif\n-186 return;\n-187 }\n-188 }\n-189 allocation_error(\"memory block not found\");\n-190 }\n-191 };\n-192#undef ALLOCATION_ASSERT\n-193\n-194 extern AllocationManager alloc_man;\n-195 } // end namespace DebugMemory\n-196#endif // DOXYGEN\n-197\n-198 template\n-199 class DebugAllocator;\n-200\n-201 // specialize for void\n-202 template <>\n-203 class DebugAllocator {\n-204 public:\n-205 typedef void* pointer;\n-206 typedef const void* const_pointer;\n-207 // reference to void members are impossible.\n-208 typedef void value_type;\n-209 template struct rebind {\n-210 typedef DebugAllocator other;\n-211 };\n-212 };\n-213\n-214 // actual implementation\n-233 template \n-234 class DebugAllocator {\n-235 public:\n-236 typedef std::size_t size_type;\n-237 typedef std::ptrdiff_t difference_type;\n-238 typedef T* pointer;\n-239 typedef const T* const_pointer;\n-240 typedef T& reference;\n-241 typedef const T& const_reference;\n-242 typedef T value_type;\n-243 template struct rebind {\n-244 typedef DebugAllocator other;\n-245 };\n-246\n-248 DebugAllocator() noexcept {}\n-250 template \n-251 DebugAllocator(const DebugAllocator&) noexcept {}\n-253 ~DebugAllocator() noexcept {}\n-254\n-255 pointer address(reference x) const\n-256 {\n-257 return &x;\n-258 }\n-259 const_pointer address(const_reference x) const\n-260 {\n-261 return &x;\n-262 }\n-263\n-265 pointer allocate(size_type n,\n-266 [[maybe_unused]] DebugAllocator::const_pointer hint = 0)\n-267 {\n-268 return DebugMemory::alloc_man.allocate(n);\n-269 }\n-270\n-272 void deallocate(pointer p, size_type n)\n-273 {\n-274 DebugMemory::alloc_man.deallocate(p,n);\n-275 }\n-276\n-278 size_type max_size() const noexcept\n-279 {\n-280 return size_type(-1) / sizeof(T);\n-281 }\n-282\n-284 void construct(pointer p, const T& val)\n-285 {\n-286 ::new((void*)p)T(val);\n-287 }\n-288\n-290 template\n-291 void construct(pointer p, Args&&... args)\n-292 {\n-293 ::new((void *)p)T(std::forward(args) ...);\n-294 }\n-295\n-297 void destroy(pointer p)\n-298 {\n-299 p->~T();\n-300 }\n-301 };\n-302\n-304 template\n-305 constexpr bool\n-306 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const DebugAllocator &, const DebugAllocator &)\n-307 {\n-308 return true;\n-309 }\n-310\n-312 template\n-313 constexpr bool\n-314 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const DebugAllocator &, const DebugAllocator &)\n-315 {\n-316 return false;\n-317 }\n-318}\n-319\n-320#ifdef DEBUG_NEW_DELETE\n-321void * operator new(size_t size)\n-322{\n-323 // try to allocate size bytes\n-324 void *p = Dune::DebugMemory::alloc_man.allocate(size);\n-325#if DEBUG_NEW_DELETE > 2\n-326 std::cout << \"NEW \" << size\n-327 << \" -> \" << p\n-328 << std::endl;\n-329#endif\n-330 return p;\n-331}\n-332\n-333void operator delete(void * p) noexcept\n-334{\n-335#if DEBUG_NEW_DELETE > 2\n-336 std::cout << \"FREE \" << p << std::endl;\n-337#endif\n-338 Dune::DebugMemory::alloc_man.deallocate(static_cast(p));\n-339}\n-340\n-341void operator delete(void * p, size_t size) noexcept\n-342{\n-343#if DEBUG_NEW_DELETE > 2\n-344 std::cout << \"FREE \" << p << std::endl;\n-345#endif\n-346 Dune::DebugMemory::alloc_man.deallocate(static_cast(p), size);\n-347}\n-348\n-349#endif // DEBUG_NEW_DELETE\n-350\n-351#endif // __has_include()\n-352\n-353#endif // DUNE_DEBUG_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_\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:237\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:259\n+_\b6_\b5 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b4_\b> _\b__\b4 = {};\n+66\n+_\b6_\b8 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b5_\b> _\b__\b5 = {};\n+69\n+_\b7_\b1 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b6_\b> _\b__\b6 = {};\n+72\n+_\b7_\b4 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b7_\b> _\b__\b7 = {};\n+75\n+_\b7_\b7 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b8_\b> _\b__\b8 = {};\n+78\n+_\b8_\b0 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b _\b9_\b> _\b__\b9 = {};\n+81\n+_\b8_\b3 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b0_\b> _\b__\b1_\b0 = {};\n+84\n+_\b8_\b6 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b1_\b> _\b__\b1_\b1 = {};\n+87\n+_\b8_\b9 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b2_\b> _\b__\b1_\b2 = {};\n+90\n+_\b9_\b2 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b3_\b> _\b__\b1_\b3 = {};\n+93\n+_\b9_\b5 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b4_\b> _\b__\b1_\b4 = {};\n+96\n+_\b9_\b8 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b5_\b> _\b__\b1_\b5 = {};\n+99\n+_\b1_\b0_\b1 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b6_\b> _\b__\b1_\b6 = {};\n+102\n+_\b1_\b0_\b4 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b7_\b> _\b__\b1_\b7 = {};\n+105\n+_\b1_\b0_\b7 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b8_\b> _\b__\b1_\b8 = {};\n+108\n+_\b1_\b1_\b0 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE constexpr _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt_\b<_\b1_\b9_\b> _\b__\b1_\b9 = {};\n+111\n+112 } // namespace Indices\n+113\n+124 template\n+_\b1_\b2_\b5 decltype(auto) constexpr _\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 sequence)\n+126 {\n+127 return f(std::integral_constant()...);\n+128 }\n+129\n+130} //namespace Dune\n+131\n+132#endif // DUNE_COMMON_INDICES_HH\n+_\bk_\be_\by_\bw_\bo_\br_\bd_\bs_\b._\bh_\bh\n+Definitions of several macros that conditionally make C++ syntax available.\n+_\bD_\bU_\bN_\bE_\b__\bI_\bN_\bL_\bI_\bN_\bE_\b__\bV_\bA_\bR_\bI_\bA_\bB_\bL_\bE\n+#define DUNE_INLINE_VARIABLE\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn keywords.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b6\n+constexpr index_constant< 16 > _16\n+Compile time index with value 16.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b5\n+constexpr index_constant< 15 > _15\n+Compile time index with value 15.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:98\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b8\n+constexpr index_constant< 8 > _8\n+Compile time index with value 8.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b7\n+constexpr index_constant< 7 > _7\n+Compile time index with value 7.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b0\n+constexpr index_constant< 0 > _0\n+Compile time index with value 0.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b9\n+constexpr index_constant< 9 > _9\n+Compile time index with value 9.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b4\n+constexpr index_constant< 14 > _14\n+Compile time index with value 14.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1\n+constexpr index_constant< 1 > _1\n+Compile time index with value 1.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b3\n+constexpr index_constant< 3 > _3\n+Compile time index with value 3.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b2\n+constexpr index_constant< 12 > _12\n+Compile time index with value 12.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:89\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:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b1\n+constexpr index_constant< 11 > _11\n+Compile time index with value 11.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b8\n+constexpr index_constant< 18 > _18\n+Compile time index with value 18.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b3\n+constexpr index_constant< 13 > _13\n+Compile time index with value 13.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b5\n+constexpr index_constant< 5 > _5\n+Compile time index with value 5.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b7\n+constexpr index_constant< 17 > _17\n+Compile time index with value 17.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:104\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b0\n+constexpr index_constant< 10 > _10\n+Compile time index with value 10.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b2\n+constexpr index_constant< 2 > _2\n+Compile time index with value 2.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n+std::integral_constant< std::size_t, i > index_constant\n+An index constant with value i.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b1_\b9\n+constexpr index_constant< 19 > _19\n+Compile time index with value 19.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b6\n+constexpr index_constant< 6 > _6\n+Compile time index with value 6.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\b:_\b:_\b__\b4\n+constexpr index_constant< 4 > _4\n+Compile time index with value 4.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:65\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/a00185.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00185.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: debugalign.hh File Reference\n+dune-common: rangeutilities.hh File Reference\n \n \n \n \n \n \n \n@@ -72,378 +72,119 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    debugalign.hh File Reference
    \n+
    rangeutilities.hh File Reference
    \n
    \n
    \n-
    #include <algorithm>
    \n-#include <cassert>
    \n-#include <cmath>
    \n-#include <complex>
    \n-#include <cstddef>
    \n-#include <cstdint>
    \n-#include <cstdlib>
    \n-#include <functional>
    \n-#include <istream>
    \n-#include <ostream>
    \n-#include <type_traits>
    \n+\n+

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

    \n+
    #include <dune/common/typetraits.hh>
    \n+#include <algorithm>
    \n #include <utility>
    \n-#include <dune/common/classname.hh>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/simd/base.hh>
    \n-#include <dune/common/simd/defaults.hh>
    \n-#include <dune/common/typetraits.hh>
    \n+#include <type_traits>
    \n+#include <bitset>
    \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 Classes

    class  Dune::AlignedBase< align, Impl >
     CRTP base mixin class to check alignment. More...
    class  Dune::IntegralRange< T >
     dynamic integer range for use in range-based for loops More...
     
    struct  Dune::IsNumber< AlignedNumberImpl::AlignedNumber< T, align > >
    class  Dune::StaticIntegralRange< T, to, from >
     static integer range for use in range-based for loops More...
     
    class  Dune::AlignedNumberImpl::AlignedNumber< T, align >
     aligned wrappers for arithmetic types More...
    struct  Dune::ValueTransformationTag
     Tag to enable value based transformations in TransformedRangeView. More...
     
    struct  Dune::Simd::Overloads::ScalarType< AlignedNumber< T, align > >
    struct  Dune::IteratorTransformationTag
     Tag to enable iterator based transformations in TransformedRangeView. More...
     
    struct  Dune::Simd::Overloads::RebindType< U, AlignedNumber< T, align > >
     
    struct  Dune::Simd::Overloads::LaneCount< AlignedNumber< T, align > >
    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-\n-\n-\n-\n-

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    namespace  Dune::AlignedNumberImpl
     
    namespace  Dune::Simd
     Namespace for vectorization interface functions used by library developers.
     
    namespace  Dune::Simd::Overloads
     Namespace for the overloads and specializations that make up a SIMD implementation.
     
    \n-\n-\n-\n-\n-\n-\n-\n-

    \n-Macros

    #define DUNE_ASSIGN_OP(OP)
     
    #define DUNE_BINARY_OP(OP)
     
    #define DUNE_UNARY_FUNC(name)
     
    \n-\n-\n-\n-\n

    \n-Typedefs

    using Dune::ViolatedAlignmentHandler = std::function< void(const char *, std::size_t, const void *)>
     type of the handler called by violatedAlignment()
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\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

    ViolatedAlignmentHandlerDune::violatedAlignmentHandler ()
     access the handler called by violatedAlignment()
     
    void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
     called when an alignment violation is detected
     
    bool Dune::isAligned (const void *p, std::size_t align)
     check whether an address conforms to the given alignment
     
    template<std::size_t align = debugAlignment, class T >
    AlignedNumber< T, align > Dune::aligned (T value)
     align a value to a certain alignment
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (+)
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (-)
     
    DUNE_BINARY_OP * Dune::AlignedNumberImpl::DUNE_BINARY_OP (/);DUNE_BINARY_OP(%
     
    DUNE_BINARY_OP^ Dune::AlignedNumberImpl::DUNE_BINARY_OP (&);DUNE_BINARY_OP(|
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (<<)
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (> >)
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (==)
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (!=)
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (<=)
     
     Dune::AlignedNumberImpl::DUNE_BINARY_OP (>=)
     
    DUNE_BINARY_OP && Dune::AlignedNumberImpl::DUNE_BINARY_OP (||);#define DUNE_UNARY_FUNC(name) DUNE_UNARY_FUNC(abs
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (acos)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (acosh)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (asin)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (asinh)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (atan)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (atanh)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cbrt)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (ceil)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cos)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cosh)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (erf)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (erfc)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (exp)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (exp2)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (expm1)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (fabs)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (floor)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (ilogb)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lgamma)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (llrint)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (llround)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log10)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log1p)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log2)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (logb)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lrint)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lround)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (nearbyint)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (rint)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (round)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sin)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sinh)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sqrt)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tan)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tanh)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tgamma)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (trunc)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isfinite)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isinf)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isnan)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isnormal)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (signbit)
     
     Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (real)
     
    template<class T , std::size_t align>
    auto Dune::AlignedNumberImpl::max (const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
     
    template<class T , std::size_t align>
    auto Dune::AlignedNumberImpl::max (const T &a, const AlignedNumber< T, align > &b)
     
    template<class T , std::size_t align>
    auto Dune::AlignedNumberImpl::max (const AlignedNumber< T, align > &a, const T &b)
     
    template<class T , std::size_t align>
    auto Dune::AlignedNumberImpl::min (const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
     
    template<class T , std::size_t align>
    auto Dune::AlignedNumberImpl::min (const T &a, const AlignedNumber< T, align > &b)
     
    template<class T , std::size_t align>
    auto Dune::AlignedNumberImpl::min (const AlignedNumber< T, align > &a, const T &b)
     
    template<class T , std::size_t align>
    AlignedNumber< T, align > Dune::cond (const AlignedNumber< bool, align > &b, const AlignedNumber< T, align > &v1, const AlignedNumber< T, align > &v2)
     
    template<class T , std::size_t align>
    Dune::max_value (const AlignedNumber< T, align > &val)
     
    template<class T , std::size_t align>
    Dune::min_value (const AlignedNumber< T, align > &val)
     
    template<std::size_t align>
    bool Dune::any_true (const AlignedNumber< bool, align > &val)
     
    template<std::size_t align>
    bool Dune::all_true (const AlignedNumber< bool, align > &val)
     
    template<class T , std::size_t align>
    T & Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
     
    template<class T , std::size_t align>
    Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, const AlignedNumber< T, align > &v)
     
    template<class T , std::size_t align>
    const AlignedNumber< T, align > & Dune::Simd::Overloads::cond (ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
     
    template<std::size_t align>
    bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
     
    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, const F &f)
     Create a TransformedRangeView.
     
    template<class R , class F >
    auto Dune::iteratorTransformedRangeView (R &&range, const 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+\n+\n

    \n Variables

    static constexpr auto Dune::debugAlignment = 2*alignof(std::max_align_t)
     an alignment large enough to trigger alignment errors
     
    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-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_ASSIGN_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_ASSIGN_OP( OP)
    \n-
    \n-Value:
    template<class U, std::size_t uAlign, \\
    \n-
    class = std::enable_if_t< \\
    \n-
    ( uAlign <= align && \\
    \n-
    sizeof(std::declval<T&>() OP std::declval<U>()) ) \\
    \n-
    > > \\
    \n-
    AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \\
    \n-
    { \\
    \n-
    value_ OP U(u); \\
    \n-
    return *this; \\
    \n-
    } \\
    \n-
    \\
    \n-
    template<class U, \\
    \n-
    class = std::void_t<decltype(std::declval<T&>() OP \\
    \n-
    std::declval<U>())> > \\
    \n-
    AlignedNumber &operator OP(const U &u) \\
    \n-
    { \\
    \n-
    value_ OP u; \\
    \n-
    return *this; \\
    \n-
    } \\
    \n-
    \\
    \n-
    static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    STL namespace.
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_BINARY_OP

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_BINARY_OP( OP)
    \n-
    \n-Value:
    template<class T, std::size_t tAlign, class U, std::size_t uAlign, \\
    \n-
    class = std::void_t<decltype(std::declval<T>() \\
    \n-
    OP std::declval<U>())> > \\
    \n-
    decltype(auto) \\
    \n-
    operator OP(const AlignedNumber<T, tAlign> &t, \\
    \n-
    const AlignedNumber<U, uAlign> &u) \\
    \n-
    { \\
    \n-
    /* can't use std::max(); not constexpr */ \\
    \n-
    return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \\
    \n-
    } \\
    \n-
    \\
    \n-
    template<class T, class U, std::size_t uAlign, \\
    \n-
    class = std::void_t<decltype(std::declval<T>() \\
    \n-
    OP std::declval<U>())> > \\
    \n-
    decltype(auto) \\
    \n-
    operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \\
    \n-
    { \\
    \n-
    return aligned<uAlign>(t OP U(u)); \\
    \n-
    } \\
    \n-
    \\
    \n-
    template<class T, std::size_t tAlign, class U, \\
    \n-
    class = std::void_t<decltype(std::declval<T>() \\
    \n-
    OP std::declval<U>())> > \\
    \n-
    decltype(auto) \\
    \n-
    operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \\
    \n-
    { \\
    \n-
    return aligned<tAlign>(T(t) OP u); \\
    \n-
    } \\
    \n-
    \\
    \n-
    static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    \n-
    \n-\n-

    ◆ DUNE_UNARY_FUNC

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_UNARY_FUNC( name)
    \n-
    \n-Value:
    template<class T, std::size_t align> \\
    \n-
    decltype(auto) name(const AlignedNumber<T, align> &u) \\
    \n-
    { \\
    \n-
    using std::name; \\
    \n-
    return aligned<align>(name(T(u))); \\
    \n-
    } \\
    \n-
    static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    \n-
    \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,388 +1,132 @@\n dune-common\u00a02.9.0\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 | _\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-debugalign.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 | _\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 <_\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 \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/_\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/_\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_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\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+#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:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be_\b<_\b _\ba_\bl_\bi_\bg_\bn_\b,_\b _\bI_\bm_\bp_\bl_\b _\b>\n-\u00a0 CRTP base mixin class to check alignment. _\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 _\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_\b<_\b _\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b _\b>\n-\u00a0 aligned wrappers for arithmetic types _\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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\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+ 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:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be_\b<_\b _\bU_\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+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-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt_\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+ 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:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\bI_\bm_\bp_\bl\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd\n-\u00a0 Namespace for vectorization interface functions used by library\n- developers.\n-\u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs\n-\u00a0 Namespace for the overloads and specializations that make up a SIMD\n- implementation.\n-\u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(OP)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(OP)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(name)\n-\u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br = std::function< void(const char *, std::\n- size_t, const void *)>\n-\u00a0 type of the handler called by _\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\b(_\b)\n-\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n- _\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br ()\n-\u00a0 access the handler called by\n- _\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\b(_\b)\n-\u00a0\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt (const char\n- *_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be, std::size_t expectedAlignment,\n- const void *address)\n-\u00a0 called when an alignment violation is\n- detected\n-\u00a0\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bi_\bs_\bA_\bl_\bi_\bg_\bn_\be_\bd (const void *p, std::size_t\n- align)\n-\u00a0 check whether an address conforms to the\n- given alignment\n-\u00a0\n-template\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bi_\bg_\bn_\be_\bd (T value)\n-\u00a0 align a value to a certain alignment\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (+)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (-)\n-\u00a0\n- DUNE_BINARY_OP *\u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (/\n- );DUNE_BINARY_OP(%\n-\u00a0\n- DUNE_BINARY_OP^\u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP\n- (&);DUNE_BINARY_OP(|\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (<<)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (>\n- >)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (==)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (!=)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (<=)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP (>=)\n-\u00a0\n- DUNE_BINARY_OP &&\u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP\n- (||);#define _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(name)\n- _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(abs\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (acos)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (acosh)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (asin)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (asinh)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (atan)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (atanh)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (cbrt)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (ceil)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (cos)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (cosh)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (erf)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (erfc)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (exp)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (exp2)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (expm1)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (fabs)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (floor)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (ilogb)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (lgamma)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (llrint)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (llround)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (log)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (log10)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (log1p)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (log2)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (logb)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (lrint)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (lround)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (nearbyint)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (rint)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (round)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (sin)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (sinh)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (sqrt)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (tan)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (tanh)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (tgamma)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (trunc)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (isfinite)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (isinf)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (isnan)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (isnormal)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (signbit)\n-\u00a0\n- \u00a0 _\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:_\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC\n- (real)\n-\u00a0\n-template\n- auto\u00a0 _\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:_\bm_\ba_\bx (const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &a, const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &b)\n-\u00a0\n-template\n- auto\u00a0 _\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:_\bm_\ba_\bx (const T &a,\n- const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &b)\n-\u00a0\n-template\n- auto\u00a0 _\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:_\bm_\ba_\bx (const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &a, const T &b)\n-\u00a0\n-template\n- auto\u00a0 _\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:_\bm_\bi_\bn (const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &a, const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &b)\n-\u00a0\n-template\n- auto\u00a0 _\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:_\bm_\bi_\bn (const T &a,\n- const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &b)\n-\u00a0\n-template\n- auto\u00a0 _\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:_\bm_\bi_\bn (const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &a, const T &b)\n-\u00a0\n-template\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bn_\bd (const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< bool, align\n- > &b, const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &v1,\n- const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &v2)\n-\u00a0\n-template\n- T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be (const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T,\n- align > &val)\n-\u00a0\n-template\n- T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be (const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T,\n- align > &val)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bn_\by_\b__\bt_\br_\bu_\be (const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< bool,\n- align > &val)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bl_\b__\bt_\br_\bu_\be (const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< bool,\n- align > &val)\n-\u00a0\n-template\n- T &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- std::size_t l, _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &v)\n-\u00a0\n-template\n- T\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- std::size_t l, const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align\n- > &v)\n-\u00a0\n-template\n-const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bc_\bo_\bn_\bd (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< bool, align > _\bm_\ba_\bs_\bk, const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &ifTrue, const\n- _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< T, align > &ifFalse)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be (_\bA_\bD_\bL_\bT_\ba_\bg< 5 >,\n- const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br< bool, align > &_\bm_\ba_\bs_\bk)\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+ const 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, const 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-static constexpr auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bb_\bu_\bg_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt = 2*alignof(std::max_align_t)\n-\u00a0 an alignment large enough to trigger alignment errors\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\bSI\bIG\bGN\bN_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_ASSIGN_OP ( \u00a0 OP )\n-V\bVa\bal\blu\bue\be:\b:\n-template() OP std::declval()) ) \\\n-> > \\\n-AlignedNumber &operator OP(const AlignedNumber &u) \\\n-{ \\\n-value_ OP U(u); \\\n-return *this; \\\n-} \\\n-\\\n-template() OP \\\n-_\bs_\bt_\bd::declval())> > \\\n-AlignedNumber &operator OP(const U &u) \\\n-{ \\\n-value_ OP u; \\\n-return *this; \\\n-} \\\n-\\\n-static_assert(true, \"Require semicolon to unconfuse editors\")\n-_\bs_\bt_\bd\n-STL namespace.\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_B\bBI\bIN\bNA\bAR\bRY\bY_\b_O\bOP\bP *\b**\b**\b**\b**\b*\n-#define DUNE_BINARY_OP ( \u00a0 OP )\n-V\bVa\bal\blu\bue\be:\b:\n-template() \\\n-OP std::declval())> > \\\n-decltype(auto) \\\n-operator OP(const AlignedNumber &t, \\\n-const AlignedNumber &u) \\\n-{ \\\n-/* can't use std::max(); not constexpr */ \\\n-return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \\\n-} \\\n-\\\n-template() \\\n-OP std::declval())> > \\\n-decltype(auto) \\\n-operator OP(const T &t, const AlignedNumber &u) \\\n-{ \\\n-return aligned(t OP U(u)); \\\n-} \\\n-\\\n-template() \\\n-OP std::declval())> > \\\n-decltype(auto) \\\n-operator OP(const AlignedNumber &t, const U &u) \\\n-{ \\\n-return aligned(T(t) OP u); \\\n-} \\\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_U\bUN\bNA\bAR\bRY\bY_\b_F\bFU\bUN\bNC\bC *\b**\b**\b**\b**\b*\n-#define DUNE_UNARY_FUNC ( \u00a0 name )\n-V\bVa\bal\blu\bue\be:\b:\n-template \\\n-decltype(auto) name(const AlignedNumber &u) \\\n-{ \\\n-using std::name; \\\n-return aligned(name(T(u))); \\\n-} \\\n-static_assert(true, \"Require semicolon to unconfuse editors\")\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/a00185_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: debugalign.hh Source File\n+dune-common: rangeutilities.hh Source File\n \n \n \n \n \n \n \n@@ -74,664 +74,707 @@\n \n
    \n \n
    \n
    \n
    \n-
    debugalign.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 (C) 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_DEBUGALIGN_HH
    \n-
    6#define DUNE_DEBUGALIGN_HH
    \n+
    5#ifndef DUNE_COMMON_RANGE_UTILITIES_HH
    \n+
    6#define DUNE_COMMON_RANGE_UTILITIES_HH
    \n
    7
    \n-
    8#include <algorithm>
    \n-
    9#include <cassert>
    \n-
    10#include <cmath>
    \n-
    11#include <complex>
    \n-
    12#include <cstddef>
    \n-
    13#include <cstdint>
    \n-
    14#include <cstdlib> // abs
    \n-
    15#include <functional>
    \n-
    16#include <istream>
    \n-
    17#include <ostream>
    \n-
    18#include <type_traits>
    \n-
    19#include <utility>
    \n-
    20
    \n-\n-\n-\n-\n-\n-
    26
    \n-
    27namespace Dune {
    \n-
    28
    \n-\n-
    31 std::function<void(const char*, std::size_t, const void*)>;
    \n-
    32
    \n-
    34
    \n-\n-
    41
    \n-
    43
    \n-
    52 void violatedAlignment(const char *className, std::size_t expectedAlignment,
    \n-
    53 const void *address);
    \n-
    54
    \n-
    \n-
    56 inline bool isAligned(const void *p, std::size_t align)
    \n-
    57 {
    \n-
    58 // a more portable way to do this would be to abuse std::align(), but that
    \n-
    59 // isn't supported by g++-4.9 yet
    \n-
    60 return std::uintptr_t(p) % align == 0;
    \n-
    61 }
    \n+\n+
    9#include <algorithm>
    \n+
    10#include <utility>
    \n+
    11#include <type_traits>
    \n+
    12#include <bitset>
    \n+
    13
    \n+
    21namespace Dune
    \n+
    22{
    \n+
    23
    \n+
    34 template <typename T,
    \n+
    35 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    36 typename T::value_type
    \n+
    \n+
    37 max_value(const T & v) {
    \n+
    38 using std::max_element;
    \n+
    39 return *max_element(v.begin(), v.end());
    \n+
    40 }
    \n
    \n+
    41
    \n+
    42 template <typename T,
    \n+
    43 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    44 const T & max_value(const T & v) { return v; }
    \n+
    45
    \n+
    51 template <typename T,
    \n+
    52 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    53 typename T::value_type
    \n+
    \n+
    54 min_value(const T & v) {
    \n+
    55 using std::min_element;
    \n+
    56 return *min_element(v.begin(), v.end());
    \n+
    57 }
    \n+
    \n+
    58
    \n+
    59 template <typename T,
    \n+
    60 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    61 const T & min_value(const T & v) { return v; }
    \n
    62
    \n-
    64 template<std::size_t align, class Impl>
    \n-
    \n-
    65 class alignas(align) AlignedBase
    \n-
    66 {
    \n-
    67 void checkAlignment() const
    \n-
    68 {
    \n-
    69 auto pimpl = static_cast<const Impl*>(this);
    \n-
    70 if(!isAligned(pimpl, align))
    \n-
    71 violatedAlignment(className<Impl>().c_str(), align, pimpl);
    \n-
    72 }
    \n-
    73 public:
    \n-
    74 AlignedBase() { checkAlignment(); }
    \n-
    75 AlignedBase(const AlignedBase &) { checkAlignment(); }
    \n-
    76 AlignedBase(AlignedBase &&) { checkAlignment(); }
    \n-
    77 ~AlignedBase() { checkAlignment(); }
    \n-
    78
    \n-
    79 AlignedBase& operator=(const AlignedBase &) = default;
    \n-\n-
    81 };
    \n-
    \n-
    82
    \n-
    84 static constexpr auto debugAlignment = 2*alignof(std::max_align_t);
    \n-
    85
    \n-
    \n-
    86 namespace AlignedNumberImpl {
    \n-
    87
    \n-
    88 template<class T, std::size_t align = debugAlignment>
    \n-
    89 class AlignedNumber;
    \n-
    90
    \n-
    91 } // namespace AlignedNumberImpl
    \n-
    \n-
    92
    \n-\n-
    94
    \n-
    95 template<class T, std::size_t align>
    \n-
    \n-
    96 struct IsNumber<AlignedNumberImpl::AlignedNumber<T,align>>
    \n-
    97 : public std::true_type {};
    \n-
    \n-
    98
    \n-
    100 template<std::size_t align = debugAlignment, class T>
    \n-
    101 AlignedNumber<T, align> aligned(T value) { return { std::move(value) }; }
    \n-
    102
    \n-
    103 // The purpose of this namespace is to move the `<cmath>` function overloads
    \n-
    104 // out of namespace `Dune`. This avoids problems where people called
    \n-
    105 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing `using
    \n-
    106 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find
    \n-
    107 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`,
    \n-
    108 // which does not have an overload for `double`.
    \n-
    109 namespace AlignedNumberImpl {
    \n+
    68 template <typename T,
    \n+
    69 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    \n+
    70 bool any_true(const T & v) {
    \n+
    71 bool b = false;
    \n+
    72 for (const auto & e : v)
    \n+
    73 b = b or bool(e);
    \n+
    74 return b;
    \n+
    75 }
    \n+
    \n+
    76
    \n+
    77 template <typename T,
    \n+
    78 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    79 bool any_true(const T & v) { return v; }
    \n+
    80
    \n+
    81 template<std::size_t N>
    \n+
    \n+
    82 bool any_true(const std::bitset<N> & b)
    \n+
    83 {
    \n+
    84 return b.any();
    \n+
    85 }
    \n+
    \n+
    86
    \n+
    92 template <typename T,
    \n+
    93 typename std::enable_if<IsIterable<T>::value, int>::type = 0>
    \n+
    \n+
    94 bool all_true(const T & v) {
    \n+
    95 bool b = true;
    \n+
    96 for (const auto & e : v)
    \n+
    97 b = b and bool(e);
    \n+
    98 return b;
    \n+
    99 }
    \n+
    \n+
    100
    \n+
    101 template <typename T,
    \n+
    102 typename std::enable_if<!IsIterable<T>::value, int>::type = 0>
    \n+
    103 bool all_true(const T & v) { return v; }
    \n+
    104
    \n+
    105 template<std::size_t N>
    \n+
    \n+
    106 bool all_true(const std::bitset<N> & b)
    \n+
    107 {
    \n+
    108 return b.all();
    \n+
    109 }
    \n+
    \n
    110
    \n-
    112 template<class T, std::size_t align>
    \n-
    \n-\n-
    114 : public AlignedBase<align, AlignedNumber<T, align> >
    \n-
    115 {
    \n-
    116 T value_;
    \n-
    117
    \n-
    118 public:
    \n-
    119 AlignedNumber() = default;
    \n-
    120 AlignedNumber(T value) : value_(std::move(value)) {}
    \n-
    121 template<class U, std::size_t uAlign,
    \n-
    122 class = std::enable_if_t<(align >= uAlign) &&
    \n-
    123 std::is_convertible<U, T>::value> >
    \n-
    124 AlignedNumber(const AlignedNumber<U, uAlign> &o) : value_(U(o)) {}
    \n+
    111
    \n+
    112
    \n+
    113 namespace Impl
    \n+
    114 {
    \n+
    115
    \n+
    116 template <class T>
    \n+
    117 class IntegralRangeIterator
    \n+
    118 {
    \n+
    119 public:
    \n+
    120 typedef std::random_access_iterator_tag iterator_category;
    \n+
    121 typedef T value_type;
    \n+
    122 typedef std::make_signed_t<T> difference_type;
    \n+
    123 typedef const T *pointer;
    \n+
    124 typedef T reference;
    \n
    125
    \n-
    126 // accessors
    \n-
    127 template<class U,
    \n-
    128 class = std::enable_if_t<std::is_convertible<T, U>::value> >
    \n-
    129 explicit operator U() const { return value_; }
    \n-
    130
    \n-
    131 const T &value() const { return value_; }
    \n-
    132 T &value() { return value_; }
    \n+
    126 constexpr IntegralRangeIterator() noexcept : value_(0) {}
    \n+
    127 constexpr explicit IntegralRangeIterator(value_type value) noexcept : value_(value) {}
    \n+
    128
    \n+
    129 pointer operator->() const noexcept { return &value_; }
    \n+
    130 constexpr reference operator*() const noexcept { return value_; }
    \n+
    131
    \n+
    132 constexpr reference operator[]( difference_type n ) const noexcept { return (value_ + n); }
    \n
    133
    \n-
    134 // I/O
    \n-
    135 template<class charT, class Traits>
    \n-
    136 friend std::basic_istream<charT, Traits>&
    \n-
    \n-
    137 operator>>(std::basic_istream<charT, Traits>& str, AlignedNumber &u)
    \n-
    138 {
    \n-
    139 return str >> u.value_;
    \n-
    140 }
    \n-
    \n+
    134 constexpr bool operator==(const IntegralRangeIterator & other) const noexcept { return (value_ == other.value_); }
    \n+
    135 constexpr bool operator!=(const IntegralRangeIterator & other) const noexcept { return (value_ != other.value_); }
    \n+
    136
    \n+
    137 constexpr bool operator<(const IntegralRangeIterator & other) const noexcept { return (value_ <= other.value_); }
    \n+
    138 constexpr bool operator<=(const IntegralRangeIterator & other) const noexcept { return (value_ <= other.value_); }
    \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
    \n-
    142 template<class charT, class Traits>
    \n-
    \n-
    143 friend std::basic_ostream<charT, Traits>&
    \n-
    144 operator<<(std::basic_ostream<charT, Traits>& str,
    \n-
    145 const AlignedNumber &u)
    \n-
    146 {
    \n-
    147 return str << u.value_;
    \n-
    148 }
    \n-
    \n-
    149
    \n-
    150 // The trick with `template<class U = T, class = std::void_t<expr(U)> >` is
    \n-
    151 // needed because at least g++-4.9 seems to evaluates a default argument
    \n-
    152 // in `template<class = std::void_t<expr(T))> >` as soon as possible and will
    \n-
    153 // error out if `expr(T)` is invalid. E.g. for `expr(T)` =
    \n-
    154 // `decltype(--std::declval<T&>())`, instantiating `AlignedNumber<bool>`
    \n-
    155 // will result in an unrecoverable error (`--` cannot be applied to a
    \n-
    156 // `bool`).
    \n-
    157
    \n-
    158 // Increment, decrement
    \n-
    159 template<class U = T, class = std::void_t<decltype(++std::declval<U&>())> >
    \n-
    160 AlignedNumber &operator++() { ++value_; return *this; }
    \n-
    161
    \n-
    162 template<class U = T, class = std::void_t<decltype(--std::declval<U&>())> >
    \n-
    163 AlignedNumber &operator--() { --value_; return *this; }
    \n+
    142 IntegralRangeIterator& operator++() noexcept { ++value_; return *this; }
    \n+
    143 IntegralRangeIterator operator++(int) noexcept { IntegralRangeIterator copy( *this ); ++(*this); return copy; }
    \n+
    144
    \n+
    145 IntegralRangeIterator& operator--() noexcept { --value_; return *this; }
    \n+
    146 IntegralRangeIterator operator--(int) noexcept { IntegralRangeIterator copy( *this ); --(*this); return copy; }
    \n+
    147
    \n+
    148 IntegralRangeIterator& operator+=(difference_type n) noexcept { value_ += n; return *this; }
    \n+
    149 IntegralRangeIterator& operator-=(difference_type n) noexcept { value_ -= n; return *this; }
    \n+
    150
    \n+
    151 friend constexpr IntegralRangeIterator operator+(const IntegralRangeIterator &a, difference_type n) noexcept { return IntegralRangeIterator(a.value_ + n); }
    \n+
    152 friend constexpr IntegralRangeIterator operator+(difference_type n, const IntegralRangeIterator &a) noexcept { return IntegralRangeIterator(a.value_ + n); }
    \n+
    153 friend constexpr IntegralRangeIterator operator-(const IntegralRangeIterator &a, difference_type n) noexcept { return IntegralRangeIterator(a.value_ - n); }
    \n+
    154
    \n+
    155 constexpr difference_type operator-(const IntegralRangeIterator &other) const noexcept { return (static_cast<difference_type>(value_) - static_cast<difference_type>(other.value_)); }
    \n+
    156
    \n+
    157 private:
    \n+
    158 value_type value_;
    \n+
    159 };
    \n+
    160
    \n+
    161 } // namespace Impl
    \n+
    162
    \n+
    163
    \n
    164
    \n-
    165 template<class U = T, class = std::void_t<decltype(std::declval<U&>()++)> >
    \n-
    166 decltype(auto) operator++(int) { return aligned<align>(value_++); }
    \n-
    167
    \n-
    168 template<class U = T, class = std::void_t<decltype(std::declval<U&>()--)> >
    \n-
    169 decltype(auto) operator--(int) { return aligned<align>(value_--); }
    \n-
    170
    \n-
    171 // unary operators
    \n-
    172 template<class U = T,
    \n-
    173 class = std::void_t<decltype(+std::declval<const U&>())> >
    \n-
    174 decltype(auto) operator+() const { return aligned<align>(+value_); }
    \n-
    175
    \n-
    176 template<class U = T,
    \n-
    177 class = std::void_t<decltype(-std::declval<const U&>())> >
    \n-
    178 decltype(auto) operator-() const { return aligned<align>(-value_); }
    \n-
    179
    \n-
    180 /*
    \n-
    181 * silence warnings from GCC about using `~` on a bool
    \n-
    182 * (when instantiated for T=bool)
    \n-
    183 */
    \n-
    184#if __GNUC__ >= 7
    \n-
    185# pragma GCC diagnostic push
    \n-
    186# pragma GCC diagnostic ignored "-Wbool-operation"
    \n-
    187#endif
    \n-
    188#ifdef __clang__
    \n-
    189# pragma clang diagnostic push
    \n-
    190# pragma clang diagnostic ignored "-Wbool-operation"
    \n-
    191#endif
    \n-
    192 template<class U = T,
    \n-
    193 class = std::void_t<decltype(~std::declval<const U&>())> >
    \n-
    194 decltype(auto) operator~() const { return aligned<align>(~value_); }
    \n-
    195#if __GNUC__ >= 7
    \n-
    196# pragma GCC diagnostic pop
    \n-
    197#endif
    \n-
    198#ifdef __clang__
    \n-
    199# pragma clang diagnostic pop
    \n-
    200#endif
    \n-
    201
    \n-
    202 template<class U = T,
    \n-
    203 class = std::void_t<decltype(!std::declval<const U&>())> >
    \n-
    204 decltype(auto) operator!() const { return aligned<align>(!value_); }
    \n-
    205
    \n-
    206 // assignment operators
    \n-
    \n-
    207#define DUNE_ASSIGN_OP(OP) \\
    \n-
    208 template<class U, std::size_t uAlign, \\
    \n-
    209 class = std::enable_if_t< \\
    \n-
    210 ( uAlign <= align && \\
    \n-
    211 sizeof(std::declval<T&>() OP std::declval<U>()) ) \\
    \n-
    212 > > \\
    \n-
    213 AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \\
    \n-
    214 { \\
    \n-
    215 value_ OP U(u); \\
    \n-
    216 return *this; \\
    \n-
    217 } \\
    \n-
    218 \\
    \n-
    219 template<class U, \\
    \n-
    220 class = std::void_t<decltype(std::declval<T&>() OP \\
    \n-
    221 std::declval<U>())> > \\
    \n-
    222 AlignedNumber &operator OP(const U &u) \\
    \n-
    223 { \\
    \n-
    224 value_ OP u; \\
    \n-
    225 return *this; \\
    \n-
    226 } \\
    \n-
    227 \\
    \n-
    228 static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    229
    \n-\n-\n-
    232
    \n-\n-
    234 DUNE_ASSIGN_OP(/=);
    \n-
    235 DUNE_ASSIGN_OP(%=);
    \n+
    173 template <class T>
    \n+
    \n+\n+
    175 {
    \n+
    176 public:
    \n+
    178 typedef T value_type;
    \n+
    180 typedef Impl::IntegralRangeIterator<T> iterator;
    \n+
    182 typedef std::make_unsigned_t<T> size_type;
    \n+
    183
    \n+
    185 constexpr IntegralRange(value_type from, value_type to) noexcept : from_(from), to_(to) {}
    \n+
    187 constexpr explicit IntegralRange(value_type to) noexcept : from_(0), to_(to) {}
    \n+
    189 constexpr IntegralRange(std::pair<value_type, value_type> range) noexcept : from_(range.first), to_(range.second) {}
    \n+
    190
    \n+
    192 constexpr iterator begin() const noexcept { return iterator(from_); }
    \n+
    194 constexpr iterator end() const noexcept { return iterator(to_); }
    \n+
    195
    \n+
    197 constexpr value_type operator[](const value_type &i) const noexcept { return (from_ + i); }
    \n+
    198
    \n+
    200 constexpr bool empty() const noexcept { return (from_ == to_); }
    \n+
    202 constexpr size_type size() const noexcept { return (static_cast<size_type>(to_) - static_cast<size_type>(from_)); }
    \n+
    203
    \n+
    204 private:
    \n+
    205 value_type from_, to_;
    \n+
    206 };
    \n+
    \n+
    207
    \n+
    208
    \n+
    223 template <class T, T to, T from = 0>
    \n+
    \n+\n+
    225 {
    \n+
    226 template <T ofs, T... i>
    \n+
    227 static std::integer_sequence<T, (i+ofs)...> shift_integer_sequence(std::integer_sequence<T, i...>);
    \n+
    228
    \n+
    229 public:
    \n+
    231 typedef T value_type;
    \n+
    233 typedef Impl::IntegralRangeIterator<T> iterator;
    \n+
    235 typedef std::make_unsigned_t<T> size_type;
    \n
    236
    \n-\n-
    238 DUNE_ASSIGN_OP(&=);
    \n-
    239 DUNE_ASSIGN_OP(|=);
    \n-
    240
    \n-\n-\n-
    243
    \n-
    244#undef DUNE_ASSIGN_OP
    \n-
    245 };
    \n-
    \n-
    246
    \n-
    247 // binary operators
    \n-
    \n-
    248#define DUNE_BINARY_OP(OP) \\
    \n-
    249 template<class T, std::size_t tAlign, class U, std::size_t uAlign, \\
    \n-
    250 class = std::void_t<decltype(std::declval<T>() \\
    \n-
    251 OP std::declval<U>())> > \\
    \n-
    252 decltype(auto) \\
    \n-
    253 operator OP(const AlignedNumber<T, tAlign> &t, \\
    \n-
    254 const AlignedNumber<U, uAlign> &u) \\
    \n-
    255 { \\
    \n-
    256 /* can't use std::max(); not constexpr */ \\
    \n-
    257 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \\
    \n-
    258 } \\
    \n-
    259 \\
    \n-
    260 template<class T, class U, std::size_t uAlign, \\
    \n-
    261 class = std::void_t<decltype(std::declval<T>() \\
    \n-
    262 OP std::declval<U>())> > \\
    \n-
    263 decltype(auto) \\
    \n-
    264 operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \\
    \n-
    265 { \\
    \n-
    266 return aligned<uAlign>(t OP U(u)); \\
    \n-
    267 } \\
    \n-
    268 \\
    \n-
    269 template<class T, std::size_t tAlign, class U, \\
    \n-
    270 class = std::void_t<decltype(std::declval<T>() \\
    \n-
    271 OP std::declval<U>())> > \\
    \n-
    272 decltype(auto) \\
    \n-
    273 operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \\
    \n-
    274 { \\
    \n-
    275 return aligned<tAlign>(T(t) OP u); \\
    \n-
    276 } \\
    \n-
    277 \\
    \n-
    278 static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    \n-
    279
    \n-\n-\n-
    282
    \n-\n-\n-\n+
    238 typedef decltype(shift_integer_sequence<from>(std::make_integer_sequence<T, to-from>())) integer_sequence;
    \n+
    239
    \n+
    241 constexpr StaticIntegralRange() noexcept = default;
    \n+
    242
    \n+
    244 constexpr operator IntegralRange<T>() const noexcept { return {from, to}; }
    \n+
    246 constexpr operator integer_sequence() const noexcept { return {}; }
    \n+
    247
    \n+
    249 static constexpr iterator begin() noexcept { return iterator(from); }
    \n+
    251 static constexpr iterator end() noexcept { return iterator(to); }
    \n+
    252
    \n+
    254 template <class U, U i>
    \n+
    \n+
    255 constexpr auto operator[](const std::integral_constant<U, i> &) const noexcept
    \n+
    256 -> std::integral_constant<value_type, from + static_cast<value_type>(i)>
    \n+
    257 {
    \n+
    258 return {};
    \n+
    259 }
    \n+
    \n+
    260
    \n+
    262 constexpr value_type operator[](const size_type &i) const noexcept { return (from + static_cast<value_type>(i)); }
    \n+
    263
    \n+
    265 static constexpr std::integral_constant<bool, from == to> empty() noexcept { return {}; }
    \n+
    267 static constexpr std::integral_constant<size_type, static_cast<size_type>(to) - static_cast<size_type>(from) > size() noexcept { return {}; }
    \n+
    268 };
    \n+
    \n+
    269
    \n+
    279 template<class T, class U,
    \n+
    280 std::enable_if_t<std::is_same<std::decay_t<T>, std::decay_t<U>>::value, int> = 0,
    \n+
    281 std::enable_if_t<std::is_integral<std::decay_t<T>>::value, int> = 0>
    \n+
    \n+
    282 inline static IntegralRange<std::decay_t<T>> range(T &&from, U &&to) noexcept
    \n+
    283 {
    \n+
    284 return IntegralRange<std::decay_t<T>>(std::forward<T>(from), std::forward<U>(to));
    \n+
    285 }
    \n+
    \n
    286
    \n-\n-\n-\n-
    290
    \n-\n-\n-
    293
    \n-\n-\n-\n-\n-\n-\n-
    300
    \n-\n-
    302 DUNE_BINARY_OP(||);
    \n-
    303
    \n-
    304#undef DUNE_BINARY_OP
    \n-
    305
    \n-
    307 //
    \n-
    308 // Overloads for the functions provided by the standard library
    \n-
    309 //
    \n-
    310#define DUNE_UNARY_FUNC(name) \\
    \n-
    311 template<class T, std::size_t align> \\
    \n-
    312 decltype(auto) name(const AlignedNumber<T, align> &u) \\
    \n-
    313 { \\
    \n-
    314 using std::name; \\
    \n-
    315 return aligned<align>(name(T(u))); \\
    \n-
    316 } \\
    \n-
    317 static_assert(true, "Require semicolon to unconfuse editors")
    \n-
    318
    \n-
    319 //
    \n-
    320 // <cmath> functions
    \n-
    321 //
    \n+
    287 template<class T, std::enable_if_t<std::is_integral<std::decay_t<T>>::value, int> = 0>
    \n+
    \n+
    288 inline static IntegralRange<std::decay_t<T>> range(T &&to) noexcept
    \n+
    289 {
    \n+
    290 return IntegralRange<std::decay_t<T>>(std::forward<T>(to));
    \n+
    291 }
    \n+
    \n+
    292
    \n+
    293 template<class T, std::enable_if_t<std::is_enum<std::decay_t<T>>::value, int> = 0>
    \n+
    \n+\n+
    295 {
    \n+
    296 return IntegralRange<std::underlying_type_t<std::decay_t<T>>>(std::forward<T>(to));
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    299 template<class T, T from, T to>
    \n+
    \n+
    300 inline static StaticIntegralRange<T, to, from> range(std::integral_constant<T, from>, std::integral_constant<T, to>) noexcept
    \n+
    301 {
    \n+
    302 return {};
    \n+
    303 }
    \n+
    \n+
    304
    \n+
    305 template<class T, T to>
    \n+
    \n+
    306 inline static StaticIntegralRange<T, to> range(std::integral_constant<T, to>) noexcept
    \n+
    307 {
    \n+
    308 return {};
    \n+
    309 }
    \n+
    \n+
    310
    \n+
    311
    \n+
    312
    \n+\n+
    317
    \n+\n
    322
    \n-
    323 // note: only unary functions are provided at the moment. Getting all the
    \n-
    324 // overloads right for functions with more than one argument is tricky.
    \n-
    325 // All <cmath> functions appear in the list below in the order they are
    \n-
    326 // listed in in the standard, but the unimplemented ones are commented
    \n-
    327 // out.
    \n-
    328
    \n-
    329 // note: abs is provided by both <cstdlib> (for integer) and <cmath> (for
    \n-
    330 // floating point). This overload works for both.
    \n-
    331 DUNE_UNARY_FUNC(abs);
    \n-\n-\n-\n-\n-\n-
    337 // atan2
    \n-\n-\n-\n-
    341 // copysign
    \n-\n-\n-\n-\n-\n-\n-\n-\n-
    350 // fdim
    \n-\n-
    352 // fma
    \n-
    353 // fmax
    \n-
    354 // fmin
    \n-
    355 // fmod
    \n-
    356 // frexp
    \n-
    357 // hypos
    \n-\n-
    359 // ldexp
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-
    370 // modf
    \n-
    371 DUNE_UNARY_FUNC(nearbyint);
    \n-
    372 // nextafter
    \n-
    373 // nexttoward
    \n-
    374 // pow
    \n-
    375 // remainder
    \n-
    376 // remquo
    \n-\n-\n-
    379 // scalbln
    \n-
    380 // scalbn
    \n-\n-\n-\n-\n-\n-\n-\n-
    388
    \n-\n-\n-\n-\n-\n-
    394
    \n-
    395 // isgreater
    \n-
    396 // isgreaterequal
    \n-
    397 // isless
    \n-
    398 // islessequal
    \n-
    399 // islessgreater
    \n-
    400 // isunordered
    \n+
    323 namespace Impl
    \n+
    324 {
    \n+
    325
    \n+
    326 // Helper class to mimic a pointer for proxy objects.
    \n+
    327 // This is needed to implement operator-> on an iterator
    \n+
    328 // using proxy-values. It stores the proxy value but
    \n+
    329 // provides operator-> like a pointer.
    \n+
    330 template<class ProxyType>
    \n+
    331 class PointerProxy
    \n+
    332 {
    \n+
    333 public:
    \n+
    334 PointerProxy(ProxyType&& p) : p_(p)
    \n+
    335 {}
    \n+
    336
    \n+
    337 ProxyType* operator->()
    \n+
    338 {
    \n+
    339 return &p_;
    \n+
    340 }
    \n+
    341
    \n+
    342 ProxyType p_;
    \n+
    343 };
    \n+
    344
    \n+
    345 // An iterator transforming a wrapped iterator using
    \n+
    346 // an unary function. It inherits the iterator-category
    \n+
    347 // of the underlying iterator.
    \n+
    348 template <class I, class F, class TransformationType, class C = typename std::iterator_traits<I>::iterator_category>
    \n+
    349 class TransformedRangeIterator;
    \n+
    350
    \n+
    351 template <class I, class F, class TransformationType>
    \n+
    352 class TransformedRangeIterator<I,F,TransformationType,std::forward_iterator_tag>
    \n+
    353 {
    \n+
    354 protected:
    \n+
    355
    \n+
    356 static decltype(auto) transform(const F& f, const I& it) {
    \n+
    357 if constexpr (std::is_same_v<TransformationType,IteratorTransformationTag>)
    \n+
    358 return f(it);
    \n+
    359 else
    \n+
    360 return f(*it);
    \n+
    361 }
    \n+
    362
    \n+
    363 public:
    \n+
    364 using iterator_category = std::forward_iterator_tag;
    \n+
    365 using reference = decltype(transform(std::declval<F>(), std::declval<I>()));
    \n+
    366 using value_type = std::decay_t<reference>;
    \n+
    367 using pointer = PointerProxy<value_type>;
    \n+
    368
    \n+
    369 // If we later want to allow standalone TransformedRangeIterators,
    \n+
    370 // we could customize the FunctionPointer to be a default-constructible,
    \n+
    371 // copy-assignable type storing a function but acting like a pointer
    \n+
    372 // to function.
    \n+
    373 using FunctionPointer = const F*;
    \n+
    374
    \n+
    375 constexpr TransformedRangeIterator(const I& it, FunctionPointer f) noexcept :
    \n+
    376 it_(it),
    \n+
    377 f_(f)
    \n+
    378 {}
    \n+
    379
    \n+
    380 // Explicitly initialize members. Using a plain
    \n+
    381 //
    \n+
    382 // constexpr TransformedRangeIterator() noexcept {}
    \n+
    383 //
    \n+
    384 // would default-initialize the members while
    \n+
    385 //
    \n+
    386 // constexpr TransformedRangeIterator() noexcept : it_(), f_() {}
    \n+
    387 //
    \n+
    388 // leads to value-initialization. This is a case where
    \n+
    389 // both are really different. If it_ is a raw pointer (i.e. POD)
    \n+
    390 // then default-initialization leaves it uninitialized while
    \n+
    391 // value-initialization zero-initializes it.
    \n+
    392 constexpr TransformedRangeIterator() noexcept :
    \n+
    393 it_(),
    \n+
    394 f_()
    \n+
    395 {}
    \n+
    396
    \n+
    397 // Dereferencing returns a value created by the function
    \n+
    398 constexpr reference operator*() const noexcept {
    \n+
    399 return transform(*f_, it_);
    \n+
    400 }
    \n
    401
    \n-
    402 //
    \n-
    403 // <complex> functions
    \n-
    404 //
    \n-
    405
    \n-
    406 // not all functions are implemented, and unlike for <cmath>, no
    \n-
    407 // comprehensive list is provided
    \n-\n-
    409
    \n-
    410#undef DUNE_UNARY_FUNC
    \n-
    411
    \n-
    412 // We need to overload min() and max() since they require types to be
    \n-
    413 // LessThanComparable, which requires `a<b` to be "convertible to bool".
    \n-
    414 // That wording seems to be a leftover from C++03, and today is probably
    \n-
    415 // equivalent to "implicitly convertible". There is also issue 2114
    \n-
    416 // <https://cplusplus.github.io/LWG/issue2114> in the standard (still open
    \n-
    417 // as of 2018-07-06), which strives to require both "implicitly" and
    \n-
    418 // "contextually" convertible -- plus a few other things.
    \n-
    419 //
    \n-
    420 // We do not want our debug type to automatically decay to the underlying
    \n-
    421 // type, so we do not want to make the conversion non-explicit. So the
    \n-
    422 // only option left is to overload min() and max().
    \n-
    423
    \n-
    424 template<class T, std::size_t align>
    \n-
    \n-\n-\n-
    427 {
    \n-
    428 using std::max;
    \n-
    429 return aligned<align>(max(T(a), T(b)));
    \n-
    430 }
    \n-
    \n-
    431
    \n-
    432 template<class T, std::size_t align>
    \n-
    \n-
    433 auto max(const T &a, const AlignedNumber<T, align> &b)
    \n-
    434 {
    \n-
    435 using std::max;
    \n-
    436 return aligned<align>(max(a, T(b)));
    \n-
    437 }
    \n-
    \n-
    438
    \n-
    439 template<class T, std::size_t align>
    \n-
    \n-
    440 auto max(const AlignedNumber<T, align> &a, const T &b)
    \n-
    441 {
    \n-
    442 using std::max;
    \n-
    443 return aligned<align>(max(T(a), b));
    \n-
    444 }
    \n-
    \n-
    445
    \n-
    446 template<class T, std::size_t align>
    \n-
    \n-\n-\n-
    449 {
    \n-
    450 using std::min;
    \n-
    451 return aligned<align>(min(T(a), T(b)));
    \n-
    452 }
    \n-
    \n-
    453
    \n-
    454 template<class T, std::size_t align>
    \n-
    \n-
    455 auto min(const T &a, const AlignedNumber<T, align> &b)
    \n-
    456 {
    \n-
    457 using std::min;
    \n-
    458 return aligned<align>(min(a, T(b)));
    \n-
    459 }
    \n-
    \n-
    460
    \n-
    461 template<class T, std::size_t align>
    \n-
    \n-
    462 auto min(const AlignedNumber<T, align> &a, const T &b)
    \n-
    463 {
    \n-
    464 using std::min;
    \n-
    465 return aligned<align>(min(T(a), b));
    \n-
    466 }
    \n-
    \n-
    467
    \n-
    468 } // namespace AlignedNumberImpl
    \n-
    469
    \n-
    470 // SIMD-like functions from "conditional.hh"
    \n-
    471 template<class T, std::size_t align>
    \n-
    472 AlignedNumber<T, align>
    \n-
    \n-\n-\n-
    475 {
    \n-
    476 return b ? v1 : v2;
    \n-
    477 }
    \n-
    \n-
    478
    \n-
    479 // SIMD-like functions from "rangeutilities.hh"
    \n-
    480 template<class T, std::size_t align>
    \n-
    \n-\n-
    482 {
    \n-
    483 return T(val);
    \n-
    484 }
    \n-
    \n-
    485
    \n-
    486 template<class T, std::size_t align>
    \n-
    \n-\n-
    488 {
    \n-
    489 return T(val);
    \n-
    490 }
    \n-
    \n-
    491
    \n-
    492 template<std::size_t align>
    \n-
    \n-\n-
    494 {
    \n-
    495 return bool(val);
    \n-
    496 }
    \n-
    \n-
    497
    \n-
    498 template<std::size_t align>
    \n-
    \n-\n-
    500 {
    \n-
    501 return bool(val);
    \n-
    502 }
    \n-
    \n-
    503
    \n-
    504 // SIMD-like functionality from "simd/interface.hh"
    \n-
    \n-
    505 namespace Simd {
    \n-
    \n-
    506 namespace Overloads {
    \n+
    402 // Dereferencing returns a value created by the function
    \n+
    403 pointer operator->() const noexcept {
    \n+
    404 return transform(*f_, it_);
    \n+
    405 }
    \n+
    406
    \n+
    407 constexpr TransformedRangeIterator& operator=(const TransformedRangeIterator& other) = default;
    \n+
    408
    \n+
    409 constexpr bool operator==(const TransformedRangeIterator& other) const noexcept {
    \n+
    410 return (it_ == other.it_);
    \n+
    411 }
    \n+
    412
    \n+
    413 constexpr bool operator!=(const TransformedRangeIterator& other) const noexcept {
    \n+
    414 return (it_ != other.it_);
    \n+
    415 }
    \n+
    416
    \n+
    417 TransformedRangeIterator& operator++() noexcept {
    \n+
    418 ++it_;
    \n+
    419 return *this;
    \n+
    420 }
    \n+
    421
    \n+
    422 TransformedRangeIterator operator++(int) noexcept {
    \n+
    423 TransformedRangeIterator copy(*this);
    \n+
    424 ++(*this);
    \n+
    425 return copy;
    \n+
    426 }
    \n+
    427
    \n+
    428 protected:
    \n+
    429 I it_;
    \n+
    430 FunctionPointer f_;
    \n+
    431 };
    \n+
    432
    \n+
    433
    \n+
    434
    \n+
    435 template <class I, class F, class T>
    \n+
    436 class TransformedRangeIterator<I,F,T,std::bidirectional_iterator_tag> :
    \n+
    437 public TransformedRangeIterator<I,F,T,std::forward_iterator_tag>
    \n+
    438 {
    \n+
    439 protected:
    \n+
    440 using Base = TransformedRangeIterator<I,F,T,std::forward_iterator_tag>;
    \n+
    441 using Base::it_;
    \n+
    442 using Base::f_;
    \n+
    443 public:
    \n+
    444 using iterator_category = std::bidirectional_iterator_tag;
    \n+
    445 using reference = typename Base::reference;
    \n+
    446 using value_type = typename Base::value_type;
    \n+
    447 using pointer = typename Base::pointer;
    \n+
    448
    \n+
    449 using FunctionPointer = typename Base::FunctionPointer;
    \n+
    450
    \n+
    451 using Base::Base;
    \n+
    452
    \n+
    453 // Member functions of the forward_iterator that need
    \n+
    454 // to be redefined because the base class methods return a
    \n+
    455 // forward_iterator.
    \n+
    456 constexpr TransformedRangeIterator& operator=(const TransformedRangeIterator& other) = default;
    \n+
    457
    \n+
    458 TransformedRangeIterator& operator++() noexcept {
    \n+
    459 ++it_;
    \n+
    460 return *this;
    \n+
    461 }
    \n+
    462
    \n+
    463 TransformedRangeIterator operator++(int) noexcept {
    \n+
    464 TransformedRangeIterator copy(*this);
    \n+
    465 ++(*this);
    \n+
    466 return copy;
    \n+
    467 }
    \n+
    468
    \n+
    469 // Additional member functions of bidirectional_iterator
    \n+
    470 TransformedRangeIterator& operator--() noexcept {
    \n+
    471 --(this->it_);
    \n+
    472 return *this;
    \n+
    473 }
    \n+
    474
    \n+
    475 TransformedRangeIterator operator--(int) noexcept {
    \n+
    476 TransformedRangeIterator copy(*this);
    \n+
    477 --(*this);
    \n+
    478 return copy;
    \n+
    479 }
    \n+
    480 };
    \n+
    481
    \n+
    482
    \n+
    483
    \n+
    484 template <class I, class F, class T>
    \n+
    485 class TransformedRangeIterator<I,F,T,std::random_access_iterator_tag> :
    \n+
    486 public TransformedRangeIterator<I,F,T,std::bidirectional_iterator_tag>
    \n+
    487 {
    \n+
    488 protected:
    \n+
    489 using Base = TransformedRangeIterator<I,F,T,std::bidirectional_iterator_tag>;
    \n+
    490 using Base::it_;
    \n+
    491 using Base::f_;
    \n+
    492 public:
    \n+
    493 using iterator_category = std::random_access_iterator_tag;
    \n+
    494 using reference = typename Base::reference;
    \n+
    495 using value_type = typename Base::value_type;
    \n+
    496 using pointer = typename Base::pointer;
    \n+
    497 using difference_type = typename std::iterator_traits<I>::difference_type;
    \n+
    498
    \n+
    499 using FunctionPointer = typename Base::FunctionPointer;
    \n+
    500
    \n+
    501 using Base::Base;
    \n+
    502
    \n+
    503 // Member functions of the forward_iterator that need
    \n+
    504 // to be redefined because the base class methods return a
    \n+
    505 // forward_iterator.
    \n+
    506 constexpr TransformedRangeIterator& operator=(const TransformedRangeIterator& other) = default;
    \n
    507
    \n-
    508 template<class T, std::size_t align>
    \n-\n-
    510
    \n-
    511 template<class U, class T, std::size_t align>
    \n-
    \n-
    512 struct RebindType<U, AlignedNumber<T, align> > {
    \n-\n-
    514 };
    \n-
    \n-
    515
    \n-
    516 template<class T, std::size_t align>
    \n-
    517 struct LaneCount<AlignedNumber<T, align> > : index_constant<1> {};
    \n+
    508 TransformedRangeIterator& operator++() noexcept {
    \n+
    509 ++it_;
    \n+
    510 return *this;
    \n+
    511 }
    \n+
    512
    \n+
    513 TransformedRangeIterator operator++(int) noexcept {
    \n+
    514 TransformedRangeIterator copy(*this);
    \n+
    515 ++(*this);
    \n+
    516 return copy;
    \n+
    517 }
    \n
    518
    \n-
    519 template<class T, std::size_t align>
    \n-
    \n-\n-
    521 {
    \n-
    522 assert(l == 0);
    \n-
    523 return v.value();
    \n-
    524 }
    \n-
    \n-
    525
    \n-
    526 template<class T, std::size_t align>
    \n-
    \n-
    527 T lane(ADLTag<5>, std::size_t l, const AlignedNumber<T, align> &v)
    \n-
    528 {
    \n-
    529 assert(l == 0);
    \n-
    530 return v.value();
    \n+
    519 // Member functions of the bidirectional_iterator that need
    \n+
    520 // to be redefined because the base class methods return a
    \n+
    521 // bidirectional_iterator.
    \n+
    522 TransformedRangeIterator& operator--() noexcept {
    \n+
    523 --(this->it_);
    \n+
    524 return *this;
    \n+
    525 }
    \n+
    526
    \n+
    527 TransformedRangeIterator operator--(int) noexcept {
    \n+
    528 TransformedRangeIterator copy(*this);
    \n+
    529 --(*this);
    \n+
    530 return copy;
    \n
    531 }
    \n-
    \n
    532
    \n-
    533 template<class T, std::size_t align>
    \n-\n-
    \n-\n-
    536 const AlignedNumber<T, align> &ifTrue,
    \n-
    537 const AlignedNumber<T, align> &ifFalse)
    \n-
    538 {
    \n-
    539 return mask ? ifTrue : ifFalse;
    \n-
    540 }
    \n-
    \n-
    541
    \n-
    542 template<std::size_t align>
    \n-
    \n-\n-
    544 {
    \n-
    545 return bool(mask);
    \n+
    533 // Additional member functions of random_access_iterator
    \n+
    534 TransformedRangeIterator& operator+=(difference_type n) noexcept {
    \n+
    535 it_ += n;
    \n+
    536 return *this;
    \n+
    537 }
    \n+
    538
    \n+
    539 TransformedRangeIterator& operator-=(difference_type n) noexcept {
    \n+
    540 it_ -= n;
    \n+
    541 return *this;
    \n+
    542 }
    \n+
    543
    \n+
    544 bool operator<(const TransformedRangeIterator& other) noexcept {
    \n+
    545 return it_<other.it_;
    \n
    546 }
    \n-
    \n
    547
    \n-
    548 } // namespace Overloads
    \n-
    \n-
    549
    \n-
    550 } // namespace Simd
    \n-
    \n+
    548 bool operator<=(const TransformedRangeIterator& other) noexcept {
    \n+
    549 return it_<=other.it_;
    \n+
    550 }
    \n
    551
    \n-
    552} // namespace Dune
    \n-
    553
    \n-
    554#endif // DUNE_DEBUGALIGN_HH
    \n-
    A free function to provide the demangled class name of a given object or type as a string.
    \n-\n-
    Basic definitions for SIMD Implementations.
    \n-
    Default implementations for SIMD Implementations.
    \n-
    #define DUNE_BINARY_OP(OP)
    Definition debugalign.hh:248
    \n-
    #define DUNE_UNARY_FUNC(name)
    \n-
    #define DUNE_ASSIGN_OP(OP)
    Definition debugalign.hh:207
    \n-
    Traits for type conversions and type information.
    \n-
    std::integral_constant< std::size_t, i > index_constant
    An index constant with value i.
    Definition indices.hh:30
    \n-
    std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
    Definition bigunsignedint.hh:278
    \n-
    Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
    implements Simd::mask()
    Definition defaults.hh:153
    \n+
    552 bool operator>(const TransformedRangeIterator& other) noexcept {
    \n+
    553 return it_>other.it_;
    \n+
    554 }
    \n+
    555
    \n+
    556 bool operator>=(const TransformedRangeIterator& other) noexcept {
    \n+
    557 return it_>=other.it_;
    \n+
    558 }
    \n+
    559
    \n+
    560 reference operator[](difference_type n) noexcept {
    \n+
    561 return Base::transform(*f_, it_+n);
    \n+
    562 }
    \n+
    563
    \n+
    564 friend
    \n+
    565 TransformedRangeIterator operator+(const TransformedRangeIterator& it, difference_type n) noexcept {
    \n+
    566 return TransformedRangeIterator(it.it_+n, it.f_);
    \n+
    567 }
    \n+
    568
    \n+
    569 friend
    \n+
    570 TransformedRangeIterator operator+(difference_type n, const TransformedRangeIterator& it) noexcept {
    \n+
    571 return TransformedRangeIterator(n+it.it_, it.f_);
    \n+
    572 }
    \n+
    573
    \n+
    574 friend
    \n+
    575 TransformedRangeIterator operator-(const TransformedRangeIterator& it, difference_type n) noexcept {
    \n+
    576 return TransformedRangeIterator(it.it_-n, it.f_);
    \n+
    577 }
    \n+
    578
    \n+
    579 friend
    \n+
    580 difference_type operator-(const TransformedRangeIterator& first, const TransformedRangeIterator& second) noexcept {
    \n+
    581 return first.it_-second.it_;
    \n+
    582 }
    \n+
    583 };
    \n+
    584
    \n+
    585
    \n+
    586 } // namespace Impl
    \n+
    587
    \n+
    588
    \n+
    589
    \n+
    626 template <class R, class F, class T=ValueTransformationTag>
    \n+
    \n+\n+
    628 {
    \n+
    629 using RawConstIterator = std::decay_t<decltype(std::declval<const R>().begin())>;
    \n+
    630 using RawIterator = std::decay_t<decltype(std::declval<R>().begin())>;
    \n+
    631
    \n+
    632 public:
    \n+
    633
    \n+
    640 using const_iterator = Impl::TransformedRangeIterator<RawConstIterator, F, T>;
    \n+
    641
    \n+
    648 using iterator = Impl::TransformedRangeIterator<RawIterator, F, T>;
    \n+
    649
    \n+
    656 using RawRange = std::remove_reference_t<R>;
    \n+
    657
    \n+
    661 template<class RR>
    \n+
    \n+
    662 constexpr TransformedRangeView(RR&& rawRange, const F& f) noexcept :
    \n+
    663 rawRange_(std::forward<RR>(rawRange)),
    \n+
    664 f_(f)
    \n+
    665 {
    \n+
    666 static_assert(std::is_same_v<T, ValueTransformationTag> or std::is_same_v<T, IteratorTransformationTag>,
    \n+
    667 "The TransformationType passed to TransformedRangeView has to be either ValueTransformationTag or IteratorTransformationTag.");
    \n+
    668 }
    \n+
    \n+
    669
    \n+
    \n+
    678 constexpr const_iterator begin() const noexcept {
    \n+
    679 return const_iterator(rawRange_.begin(), &f_);
    \n+
    680 }
    \n+
    \n+
    681
    \n+
    \n+
    682 constexpr iterator begin() noexcept {
    \n+
    683 return iterator(rawRange_.begin(), &f_);
    \n+
    684 }
    \n+
    \n+
    685
    \n+
    \n+
    694 constexpr const_iterator end() const noexcept {
    \n+
    695 return const_iterator(rawRange_.end(), &f_);
    \n+
    696 }
    \n+
    \n+
    697
    \n+
    \n+
    698 constexpr iterator end() noexcept {
    \n+
    699 return iterator(rawRange_.end(), &f_);
    \n+
    700 }
    \n+
    \n+
    701
    \n+
    712 template<class Dummy=R,
    \n+
    713 class = std::void_t<decltype(std::declval<Dummy>().size())>>
    \n+
    \n+
    714 auto size() const
    \n+
    715 {
    \n+
    716 return rawRange_.size();
    \n+
    717 }
    \n+
    \n+
    718
    \n+
    \n+
    722 const RawRange& rawRange() const
    \n+
    723 {
    \n+
    724 return rawRange_;
    \n+
    725 }
    \n+
    \n+
    726
    \n+
    \n+\n+
    731 {
    \n+
    732 return rawRange_;
    \n+
    733 }
    \n+
    \n+
    734
    \n+
    735 private:
    \n+
    736 R rawRange_;
    \n+
    737 F f_;
    \n+
    738 };
    \n+
    \n+
    739
    \n+
    768 template <class R, class F>
    \n+
    \n+
    769 auto transformedRangeView(R&& range, const F& f)
    \n+
    770 {
    \n+\n+
    772 }
    \n+
    \n+
    773
    \n+
    801 template <class R, class F>
    \n+
    \n+\n+
    803 {
    \n+\n+
    805 }
    \n+
    \n+
    806
    \n+
    807
    \n+
    820 template<class Range>
    \n+
    \n+
    821 auto sparseRange(Range&& range) {
    \n+
    822 return Dune::iteratorTransformedRangeView(std::forward<Range>(range), [](auto&& it) {
    \n+
    823 return std::tuple<decltype(*it), decltype(it.index())>(*it, it.index());
    \n+
    824 });
    \n+
    825 }
    \n+
    \n+
    826
    \n+
    831}
    \n+
    832
    \n+
    833#endif // DUNE_COMMON_RANGE_UTILITIES_HH
    \n+
    Traits for type conversions and type information.
    \n+
    auto sparseRange(Range &&range)
    Allow structured-binding for-loops for sparse iterators.
    Definition rangeutilities.hh:821
    \n+
    auto iteratorTransformedRangeView(R &&range, const F &f)
    Create a TransformedRangeView using an iterator transformation.
    Definition rangeutilities.hh:802
    \n+
    auto transformedRangeView(R &&range, const F &f)
    Create a TransformedRangeView.
    Definition rangeutilities.hh:769
    \n+
    static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
    Definition rangeutilities.hh:300
    \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:637
    \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:683
    \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:660
    \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:237
    \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:705
    \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:259
    \n
    STL namespace.
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n-
    void violatedAlignment(const char *className, std::size_t expectedAlignment, const void *address)
    called when an alignment violation is detected
    Definition debugalign.cc:39
    \n
    bool any_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:493
    \n
    bool all_true(const AlignedNumber< bool, align > &val)
    Definition debugalign.hh:499
    \n-
    std::string className()
    Provide the demangled class name of a type T as a string.
    Definition classname.hh:47
    \n-
    static constexpr auto debugAlignment
    an alignment large enough to trigger alignment errors
    Definition debugalign.hh:84
    \n-
    const T1 cond(bool b, const T1 &v1, const T2 &v2)
    conditional evaluate
    Definition conditional.hh:28
    \n-
    AlignedNumber< T, align > aligned(T value)
    align a value to a certain alignment
    Definition debugalign.hh:101
    \n-
    ViolatedAlignmentHandler & violatedAlignmentHandler()
    access the handler called by violatedAlignment()
    Definition debugalign.cc:33
    \n-
    bool isAligned(const void *p, std::size_t align)
    check whether an address conforms to the given alignment
    Definition debugalign.hh:56
    \n
    T max_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:481
    \n-
    std::function< void(const char *, std::size_t, const void *)> ViolatedAlignmentHandler
    type of the handler called by violatedAlignment()
    Definition debugalign.hh:31
    \n
    T min_value(const AlignedNumber< T, align > &val)
    Definition debugalign.hh:487
    \n-
    auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:447
    \n-
    auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
    Definition debugalign.hh:425
    \n-
    bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
    Definition debugalign.hh:543
    \n-
    T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
    Definition debugalign.hh:520
    \n-
    Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
    Definition typetraits.hh:194
    \n-
    CRTP base mixin class to check alignment.
    Definition debugalign.hh:66
    \n-
    ~AlignedBase()
    Definition debugalign.hh:77
    \n-
    AlignedBase & operator=(AlignedBase &&)=default
    \n-
    AlignedBase(AlignedBase &&)
    Definition debugalign.hh:76
    \n-
    AlignedBase & operator=(const AlignedBase &)=default
    \n-
    AlignedBase(const AlignedBase &)
    Definition debugalign.hh:75
    \n-
    AlignedBase()
    Definition debugalign.hh:74
    \n-
    aligned wrappers for arithmetic types
    Definition debugalign.hh:115
    \n-\n-\n-
    decltype(auto) operator+() const
    Definition debugalign.hh:174
    \n-\n-
    decltype(auto) operator--(int)
    Definition debugalign.hh:169
    \n-
    DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%=
    \n-
    decltype(auto) operator++(int)
    Definition debugalign.hh:166
    \n-
    decltype(auto) operator!() const
    Definition debugalign.hh:204
    \n-
    T & value()
    Definition debugalign.hh:132
    \n-
    const T & value() const
    Definition debugalign.hh:131
    \n-
    DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|=
    \n-
    friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream< charT, Traits > &str, AlignedNumber &u)
    Definition debugalign.hh:137
    \n-\n-\n-
    decltype(auto) operator~() const
    Definition debugalign.hh:194
    \n-
    AlignedNumber(T value)
    Definition debugalign.hh:120
    \n-
    AlignedNumber(const AlignedNumber< U, uAlign > &o)
    Definition debugalign.hh:124
    \n-
    decltype(auto) operator-() const
    Definition debugalign.hh:178
    \n-\n-
    Tag used to force late-binding lookup in Dune::Simd::Overloads.
    Definition base.hh:182
    \n-
    should have a member type type
    Definition standard.hh:60
    \n-
    should have a member type type
    Definition standard.hh:67
    \n-
    should be derived from a Dune::index_constant
    Definition standard.hh:74
    \n+
    dynamic integer range for use in range-based for loops
    Definition rangeutilities.hh:175
    \n+
    constexpr iterator begin() const noexcept
    obtain a random-access iterator to the first element
    Definition rangeutilities.hh:192
    \n+
    constexpr iterator end() const noexcept
    obtain a random-access iterator past the last element
    Definition rangeutilities.hh:194
    \n+
    std::make_unsigned_t< T > size_type
    unsigned integer type corresponding to value_type
    Definition rangeutilities.hh:182
    \n+
    Impl::IntegralRangeIterator< T > iterator
    type of iterator
    Definition rangeutilities.hh:180
    \n+
    constexpr value_type operator[](const value_type &i) const noexcept
    access specified element
    Definition rangeutilities.hh:197
    \n+
    constexpr bool empty() const noexcept
    check whether the range is empty
    Definition rangeutilities.hh:200
    \n+
    constexpr IntegralRange(std::pair< value_type, value_type > range) noexcept
    construct integer range std::pair
    Definition rangeutilities.hh:189
    \n+
    constexpr IntegralRange(value_type from, value_type to) noexcept
    construct integer range [from, to)
    Definition rangeutilities.hh:185
    \n+
    constexpr size_type size() const noexcept
    obtain number of elements in the range
    Definition rangeutilities.hh:202
    \n+
    constexpr IntegralRange(value_type to) noexcept
    construct integer range [0, to)
    Definition rangeutilities.hh:187
    \n+
    T value_type
    type of integers contained in the range
    Definition rangeutilities.hh:178
    \n+
    static integer range for use in range-based for loops
    Definition rangeutilities.hh:225
    \n+
    static constexpr iterator end() noexcept
    obtain a random-access iterator past the last element
    Definition rangeutilities.hh:251
    \n+
    decltype(shift_integer_sequence< from >(std::make_integer_sequence< T, to-from >())) integer_sequence
    type of corresponding std::integer_sequence
    Definition rangeutilities.hh:238
    \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:235
    \n+
    T value_type
    type of integers contained in the range
    Definition rangeutilities.hh:231
    \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:255
    \n+
    static constexpr std::integral_constant< bool, from==to > empty() noexcept
    check whether the range is empty
    Definition rangeutilities.hh:265
    \n+
    static constexpr iterator begin() noexcept
    obtain a random-access iterator to the first element
    Definition rangeutilities.hh:249
    \n+
    constexpr value_type operator[](const size_type &i) const noexcept
    access specified element (dynamic version)
    Definition rangeutilities.hh:262
    \n+
    Impl::IntegralRangeIterator< T > iterator
    type of iterator
    Definition rangeutilities.hh:233
    \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:267
    \n+
    Tag to enable value based transformations in TransformedRangeView.
    Definition rangeutilities.hh:316
    \n+
    Tag to enable iterator based transformations in TransformedRangeView.
    Definition rangeutilities.hh:321
    \n+
    A range transforming the values of another range on-the-fly.
    Definition rangeutilities.hh:628
    \n+
    auto size() const
    Obtain the size of the range.
    Definition rangeutilities.hh:714
    \n+
    constexpr iterator end() noexcept
    Definition rangeutilities.hh:698
    \n+
    std::remove_reference_t< R > RawRange
    Export type of the wrapped untransformed range.
    Definition rangeutilities.hh:656
    \n+
    Impl::TransformedRangeIterator< RawConstIterator, F, T > const_iterator
    Const iterator type.
    Definition rangeutilities.hh:640
    \n+
    constexpr iterator begin() noexcept
    Definition rangeutilities.hh:682
    \n+
    constexpr TransformedRangeView(RR &&rawRange, const F &f) noexcept
    Construct from range and function.
    Definition rangeutilities.hh:662
    \n+
    const RawRange & rawRange() const
    Export the wrapped untransformed range.
    Definition rangeutilities.hh:722
    \n+
    Impl::TransformedRangeIterator< RawIterator, F, T > iterator
    Iterator type.
    Definition rangeutilities.hh:648
    \n+
    constexpr const_iterator begin() const noexcept
    Obtain a iterator to the first element.
    Definition rangeutilities.hh:678
    \n+
    constexpr const_iterator end() const noexcept
    Obtain a iterator past the last element.
    Definition rangeutilities.hh:694
    \n+
    RawRange & rawRange()
    Export the wrapped untransformed range.
    Definition rangeutilities.hh:730
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,728 +1,880 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-debugalign.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 (C) 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_DEBUGALIGN_HH\n-6#define DUNE_DEBUGALIGN_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#include \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#include \n-20\n-21#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-22#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bb_\ba_\bs_\be_\b._\bh_\bh>\n-24#include <_\bd_\bu_\bn_\be_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\bs_\bi_\bm_\bd_\b/_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs_\b._\bh_\bh>\n-25#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-26\n-27namespace _\bD_\bu_\bn_\be {\n-28\n-_\b3_\b0 using _\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br =\n-31 std::function;\n-32\n-34\n-40 _\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br &_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br();\n+8#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+9#include \n+10#include \n+11#include \n+12#include \n+13\n+21namespace _\bD_\bu_\bn_\be\n+22{\n+23\n+34 template ::value, int>::type = 0>\n+36 typename T::value_type\n+_\b3_\b7 _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const T & v) {\n+38 using std::max_element;\n+39 return *max_element(v.begin(), v.end());\n+40 }\n 41\n-43\n-52 void _\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt(const char *_\bc_\bl_\ba_\bs_\bs_\bN_\ba_\bm_\be, std::size_t expectedAlignment,\n-53 const void *address);\n-54\n-_\b5_\b6 inline bool _\bi_\bs_\bA_\bl_\bi_\bg_\bn_\be_\bd(const void *p, std::size_t align)\n-57 {\n-58 // a more portable way to do this would be to abuse std::align(), but that\n-59 // isn't supported by g++-4.9 yet\n-60 return std::uintptr_t(p) % align == 0;\n-61 }\n+42 template ::value, int>::type = 0>\n+_\b4_\b4 const T & _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const T & v) { return v; }\n+45\n+51 template ::value, int>::type = 0>\n+53 typename T::value_type\n+_\b5_\b4 _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const T & v) {\n+55 using std::min_element;\n+56 return *min_element(v.begin(), v.end());\n+57 }\n+58\n+59 template ::value, int>::type = 0>\n+_\b6_\b1 const T & _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const T & v) { return v; }\n 62\n-64 template\n-_\b6_\b5 class alignas(align) _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be\n-66 {\n-67 void checkAlignment() const\n-68 {\n-69 auto pimpl = static_cast(this);\n-70 if(!_\bi_\bs_\bA_\bl_\bi_\bg_\bn_\be_\bd(pimpl, align))\n-71 _\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt(className().c_str(), align, pimpl);\n-72 }\n-73 public:\n-_\b7_\b4 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be() { checkAlignment(); }\n-_\b7_\b5 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be &) { checkAlignment(); }\n-_\b7_\b6 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be(_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be &&) { checkAlignment(); }\n-_\b7_\b7 _\b~_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be() { checkAlignment(); }\n-78\n-_\b7_\b9 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be &) = default;\n-_\b8_\b0 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be &&) = default;\n-81 };\n-82\n-_\b8_\b4 static constexpr auto _\bd_\be_\bb_\bu_\bg_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt = 2*alignof(std::max_align_t);\n-85\n-_\b8_\b6 namespace AlignedNumberImpl {\n-87\n-88 template\n-89 class _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br;\n-90\n-91 } // namespace AlignedNumberImpl\n-92\n-93 using _\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-94\n-95 template\n-_\b9_\b6 struct _\bI_\bs_\bN_\bu_\bm_\bb_\be_\br>\n-97 : public std::true_type {};\n-98\n-100 template\n-_\b1_\b0_\b1 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> _\ba_\bl_\bi_\bg_\bn_\be_\bd(T value) { return { std::move(value) }; }\n-102\n-103 // The purpose of this namespace is to move the `` function\n-overloads\n-104 // out of namespace `Dune`. This avoids problems where people called\n-105 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing `using\n-106 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find\n-107 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`,\n-108 // which does not have an overload for `double`.\n-109 namespace AlignedNumberImpl {\n+68 template ::value, int>::type = 0>\n+_\b7_\b0 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const T & v) {\n+71 bool b = false;\n+72 for (const auto & e : v)\n+73 b = b or bool(e);\n+74 return b;\n+75 }\n+76\n+77 template ::value, int>::type = 0>\n+79 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const T & v) { return v; }\n+80\n+81 template\n+_\b8_\b2 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const std::bitset & b)\n+83 {\n+84 return b.any();\n+85 }\n+86\n+92 template ::value, int>::type = 0>\n+_\b9_\b4 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const T & v) {\n+95 bool b = true;\n+96 for (const auto & e : v)\n+97 b = b and bool(e);\n+98 return b;\n+99 }\n+100\n+101 template ::value, int>::type = 0>\n+103 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const T & v) { return v; }\n+104\n+105 template\n+_\b1_\b0_\b6 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const std::bitset & b)\n+107 {\n+108 return b.all();\n+109 }\n 110\n-112 template\n-_\b1_\b1_\b3 class _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br\n-114 : public _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be >\n-115 {\n-116 T value_;\n-117\n-118 public:\n-_\b1_\b1_\b9 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br() = default;\n-_\b1_\b2_\b0 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br(T value) : value_(_\bs_\bt_\bd::move(value)) {}\n-121 template= uAlign) &&\n-123 std::is_convertible::value> >\n-_\b1_\b2_\b4 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bU_\b,_\b _\bu_\bA_\bl_\bi_\bg_\bn_\b> &o) : value_(U(o)) {}\n+111\n+112\n+113 namespace Impl\n+114 {\n+115\n+116 template \n+117 class IntegralRangeIterator\n+118 {\n+119 public:\n+120 typedef std::random_access_iterator_tag iterator_category;\n+121 typedef T value_type;\n+122 typedef std::make_signed_t difference_type;\n+123 typedef const T *pointer;\n+124 typedef T reference;\n 125\n-126 // accessors\n-127 template::value> >\n-_\b1_\b2_\b9 explicit operator U() const { return value_; }\n-130\n-_\b1_\b3_\b1 const T &_\bv_\ba_\bl_\bu_\be() const { return value_; }\n-_\b1_\b3_\b2 T &_\bv_\ba_\bl_\bu_\be() { return value_; }\n+126 constexpr IntegralRangeIterator() noexcept : value_(0) {}\n+127 constexpr explicit IntegralRangeIterator(value_type value) noexcept :\n+value_(value) {}\n+128\n+129 pointer operator->() const noexcept { return &value_; }\n+130 constexpr reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const noexcept { return value_; }\n+131\n+132 constexpr reference operator[]( difference_type n ) const noexcept { return\n+(value_ + n); }\n 133\n-134 // I/O\n-135 template\n-136 friend std::basic_istream&\n-_\b1_\b3_\b7 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::basic_istream& str, _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br &u)\n-138 {\n-139 return str >> u.value_;\n-140 }\n+134 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const IntegralRangeIterator & other) const\n+noexcept { return (value_ == other.value_); }\n+135 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const IntegralRangeIterator & other) const\n+noexcept { return (value_ != other.value_); }\n+136\n+137 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const IntegralRangeIterator & other) const\n+noexcept { return (value_ <= other.value_); }\n+138 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b=(const IntegralRangeIterator & other) const\n+noexcept { return (value_ <= other.value_); }\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\n-142 template\n-_\b1_\b4_\b3 friend std::basic_ostream&\n-144 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::basic_ostream& str,\n-145 const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br &u)\n-146 {\n-147 return str << u.value_;\n-148 }\n-149\n-150 // The trick with `template >` is\n-151 // needed because at least g++-4.9 seems to evaluates a default argument\n-152 // in `template >` as soon as possible and\n-will\n-153 // error out if `expr(T)` is invalid. E.g. for `expr(T)` =\n-154 // `decltype(--std::declval())`, instantiating `AlignedNumber`\n-155 // will result in an unrecoverable error (`--` cannot be applied to a\n-156 // `bool`).\n-157\n-158 // Increment, decrement\n-159 template())> >\n-_\b1_\b6_\b0 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br &operator++() { ++value_; return *this; }\n-161\n-162 template())> >\n-_\b1_\b6_\b3 _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br &operator--() { --value_; return *this; }\n+142 IntegralRangeIterator& operator++() noexcept { ++value_; return *this; }\n+143 IntegralRangeIterator operator++(int) noexcept { IntegralRangeIterator copy\n+( *this ); ++(*this); return copy; }\n+144\n+145 IntegralRangeIterator& operator--() noexcept { --value_; return *this; }\n+146 IntegralRangeIterator operator--(int) noexcept { IntegralRangeIterator copy\n+( *this ); --(*this); return copy; }\n+147\n+148 IntegralRangeIterator& operator+=(difference_type n) noexcept { value_ +=\n+n; return *this; }\n+149 IntegralRangeIterator& operator-=(difference_type n) noexcept { value_ -\n+= n; return *this; }\n+150\n+151 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+152 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+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\n+155 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+156\n+157 private:\n+158 value_type value_;\n+159 };\n+160\n+161 } // namespace Impl\n+162\n+163\n 164\n-165 template()++)> >\n-_\b1_\b6_\b6 decltype(auto) _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+(int) { return aligned(value_++); }\n-167\n-168 template()--)> >\n-_\b1_\b6_\b9 decltype(auto) _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-(int) { return aligned(value_--); }\n-170\n-171 // unary operators\n-172 template())> >\n-_\b1_\b7_\b4 decltype(auto) _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+() const { return aligned(+value_); }\n-175\n-176 template())> >\n-_\b1_\b7_\b8 decltype(auto) _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-() const { return aligned(-value_); }\n-179\n-180 /*\n-181 * silence warnings from GCC about using `~` on a bool\n-182 * (when instantiated for T=bool)\n-183 */\n-184#if __GNUC__ >= 7\n-185# pragma GCC diagnostic push\n-186# pragma GCC diagnostic ignored \"-Wbool-operation\"\n-187#endif\n-188#ifdef __clang__\n-189# pragma clang diagnostic push\n-190# pragma clang diagnostic ignored \"-Wbool-operation\"\n-191#endif\n-192 template())> >\n-_\b1_\b9_\b4 decltype(auto) _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~() const { return aligned(~value_); }\n-195#if __GNUC__ >= 7\n-196# pragma GCC diagnostic pop\n-197#endif\n-198#ifdef __clang__\n-199# pragma clang diagnostic pop\n-200#endif\n-201\n-202 template())> >\n-_\b2_\b0_\b4 decltype(auto) _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!() const { return aligned(!value_); }\n-205\n-206 // assignment operators\n-_\b2_\b0_\b7#define DUNE_ASSIGN_OP(OP) \\\n-208 template() OP std::declval()) ) \\\n-212 > > \\\n-213 AlignedNumber &operator OP(const AlignedNumber &u) \\\n-214 { \\\n-215 value_ OP U(u); \\\n-216 return *this; \\\n-217 } \\\n-218 \\\n-219 template() OP \\\n-221 std::declval())> > \\\n-222 AlignedNumber &operator OP(const U &u) \\\n-223 { \\\n-224 value_ OP u; \\\n-225 return *this; \\\n-226 } \\\n-227 \\\n-228 static_assert(true, \"Require semicolon to unconfuse editors\")\n-229\n-_\b2_\b3_\b0 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(+=);\n-_\b2_\b3_\b1 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(-=);\n-232\n-_\b2_\b3_\b3 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(*=);\n-234 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(/=);\n-235 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(%=);\n+173 template \n+_\b1_\b7_\b4 class _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+175 {\n+176 public:\n+_\b1_\b7_\b8 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b0 typedef Impl::IntegralRangeIterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b2 typedef std::make_unsigned_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+183\n+_\b1_\b8_\b5 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_\b7 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_\b8_\b9 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+190\n+_\b1_\b9_\b2 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_\b4 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+195\n+_\b1_\b9_\b7 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+198\n+_\b2_\b0_\b0 constexpr bool _\be_\bm_\bp_\bt_\by() const noexcept { return (from_ == to_); }\n+_\b2_\b0_\b2 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+203\n+204 private:\n+205 _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be from_, to_;\n+206 };\n+207\n+208\n+223 template \n+_\b2_\b2_\b4 class _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be\n+225 {\n+226 template \n+227 static std::integer_sequence shift_integer_sequence(std::\n+integer_sequence);\n+228\n+229 public:\n+_\b2_\b3_\b1 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b3_\b3 typedef Impl::IntegralRangeIterator _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b3_\b5 typedef std::make_unsigned_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n 236\n-_\b2_\b3_\b7 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(^=);\n-238 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(&=);\n-239 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(|=);\n-240\n-_\b2_\b4_\b1 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(<<=);\n-_\b2_\b4_\b2 _\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP(>>=);\n-243\n-244#undef DUNE_ASSIGN_OP\n-245 };\n-246\n-247 // binary operators\n-_\b2_\b4_\b8#define DUNE_BINARY_OP(OP) \\\n-249 template() \\\n-251 OP std::declval())> > \\\n-252 decltype(auto) \\\n-253 operator OP(const AlignedNumber &t, \\\n-254 const AlignedNumber &u) \\\n-255 { \\\n-256 /* can't use std::max(); not constexpr */ \\\n-257 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \\\n-258 } \\\n-259 \\\n-260 template() \\\n-262 OP std::declval())> > \\\n-263 decltype(auto) \\\n-264 operator OP(const T &t, const AlignedNumber &u) \\\n-265 { \\\n-266 return aligned(t OP U(u)); \\\n-267 } \\\n-268 \\\n-269 template() \\\n-271 OP std::declval())> > \\\n-272 decltype(auto) \\\n-273 operator OP(const AlignedNumber &t, const U &u) \\\n-274 { \\\n-275 return aligned(T(t) OP u); \\\n-276 } \\\n-277 \\\n-278 static_assert(true, \"Require semicolon to unconfuse editors\")\n-279\n-_\b2_\b8_\b0 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(+);\n-_\b2_\b8_\b1 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(-);\n-282\n-_\b2_\b8_\b3 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(*);\n-284 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(/);\n-285 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(%);\n+_\b2_\b3_\b8 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+239\n+_\b2_\b4_\b1 constexpr _\bS_\bt_\ba_\bt_\bi_\bc_\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be() noexcept = default;\n+242\n+_\b2_\b4_\b4 constexpr operator _\bI_\bn_\bt_\be_\bg_\br_\ba_\bl_\bR_\ba_\bn_\bg_\be() const noexcept { return {from, to}; }\n+_\b2_\b4_\b6 constexpr operator _\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bs_\be_\bq_\bu_\be_\bn_\bc_\be() const noexcept { return {}; }\n+247\n+_\b2_\b4_\b9 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_\b1 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+252\n+254 template \n+_\b2_\b5_\b5 constexpr auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const std::integral_constant &) const\n+noexcept\n+256 -> std::integral_constant(i)>\n+257 {\n+258 return {};\n+259 }\n+260\n+_\b2_\b6_\b2 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+263\n+_\b2_\b6_\b5 static constexpr std::integral_constant _\be_\bm_\bp_\bt_\by() noexcept\n+{ return {}; }\n+_\b2_\b6_\b7 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+268 };\n+269\n+279 template, std::decay_t>::value,\n+int> = 0,\n+281 std::enable_if_t>::value, int> = 0>\n+_\b2_\b8_\b2 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+283 {\n+284 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+285 }\n 286\n-_\b2_\b8_\b7 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(^);\n-288 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(&);\n-289 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(|);\n-290\n-_\b2_\b9_\b1 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(<<);\n-_\b2_\b9_\b2 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(>>);\n-293\n-_\b2_\b9_\b4 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(==);\n-_\b2_\b9_\b5 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(!=);\n-296 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(<);\n-297 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(>);\n-_\b2_\b9_\b8 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(<=);\n-_\b2_\b9_\b9 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(>=);\n-300\n-_\b3_\b0_\b1 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(&&);\n-302 _\bD_\bU_\bN_\bE_\b__\bB_\bI_\bN_\bA_\bR_\bY_\b__\bO_\bP(||);\n-303\n-304#undef DUNE_BINARY_OP\n-305\n-307 //\n-308 // Overloads for the functions provided by the standard library\n-309 //\n-310#define DUNE_UNARY_FUNC(name) \\\n-311 template \\\n-312 decltype(auto) name(const AlignedNumber &u) \\\n-313 { \\\n-314 using std::name; \\\n-315 return aligned(name(T(u))); \\\n-316 } \\\n-317 static_assert(true, \"Require semicolon to unconfuse editors\")\n-318\n-319 //\n-320 // functions\n-321 //\n+287 template>::\n+value, int> = 0>\n+_\b2_\b8_\b8 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+289 {\n+290 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+291 }\n+292\n+293 template>::value,\n+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:_\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+295 {\n+296 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+297 }\n+298\n+299 template\n+_\b3_\b0_\b0 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+301 {\n+302 return {};\n+303 }\n+304\n+305 template\n+_\b3_\b0_\b6 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+307 {\n+308 return {};\n+309 }\n+310\n+311\n+312\n+_\b3_\b1_\b6 struct _\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg {};\n+317\n+_\b3_\b2_\b1 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 322\n-323 // note: only unary functions are provided at the moment. Getting all the\n-324 // overloads right for functions with more than one argument is tricky.\n-325 // All functions appear in the list below in the order they are\n-326 // listed in in the standard, but the unimplemented ones are commented\n-327 // out.\n-328\n-329 // note: abs is provided by both (for integer) and (for\n-330 // floating point). This overload works for both.\n-331 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(abs);\n-_\b3_\b3_\b2 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(acos);\n-_\b3_\b3_\b3 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(acosh);\n-_\b3_\b3_\b4 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(asin);\n-_\b3_\b3_\b5 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(asinh);\n-_\b3_\b3_\b6 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(atan);\n-337 // atan2\n-_\b3_\b3_\b8 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(atanh);\n-_\b3_\b3_\b9 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(cbrt);\n-_\b3_\b4_\b0 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(ceil);\n-341 // copysign\n-_\b3_\b4_\b2 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(cos);\n-_\b3_\b4_\b3 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(cosh);\n-_\b3_\b4_\b4 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(erf);\n-_\b3_\b4_\b5 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(erfc);\n-_\b3_\b4_\b6 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(exp);\n-_\b3_\b4_\b7 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(exp2);\n-_\b3_\b4_\b8 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(expm1);\n-_\b3_\b4_\b9 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(fabs);\n-350 // fdim\n-_\b3_\b5_\b1 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(floor);\n-352 // fma\n-353 // fmax\n-354 // fmin\n-355 // fmod\n-356 // frexp\n-357 // hypos\n-_\b3_\b5_\b8 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(ilogb);\n-359 // ldexp\n-_\b3_\b6_\b0 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(lgamma);\n-_\b3_\b6_\b1 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(llrint);\n-_\b3_\b6_\b2 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(llround);\n-_\b3_\b6_\b3 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log);\n-_\b3_\b6_\b4 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log10);\n-_\b3_\b6_\b5 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log1p);\n-_\b3_\b6_\b6 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(log2);\n-_\b3_\b6_\b7 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(logb);\n-_\b3_\b6_\b8 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(lrint);\n-_\b3_\b6_\b9 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(lround);\n-370 // modf\n-_\b3_\b7_\b1 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(nearbyint);\n-372 // nextafter\n-373 // nexttoward\n-374 // pow\n-375 // remainder\n-376 // remquo\n-_\b3_\b7_\b7 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(rint);\n-_\b3_\b7_\b8 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(round);\n-379 // scalbln\n-380 // scalbn\n-_\b3_\b8_\b1 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(sin);\n-_\b3_\b8_\b2 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(sinh);\n-_\b3_\b8_\b3 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(sqrt);\n-_\b3_\b8_\b4 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(tan);\n-_\b3_\b8_\b5 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(tanh);\n-_\b3_\b8_\b6 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(tgamma);\n-_\b3_\b8_\b7 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(trunc);\n-388\n-_\b3_\b8_\b9 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(isfinite);\n-_\b3_\b9_\b0 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(isinf);\n-_\b3_\b9_\b1 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(isnan);\n-_\b3_\b9_\b2 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(isnormal);\n-_\b3_\b9_\b3 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(signbit);\n-394\n-395 // isgreater\n-396 // isgreaterequal\n-397 // isless\n-398 // islessequal\n-399 // islessgreater\n-400 // isunordered\n+323 namespace Impl\n+324 {\n+325\n+326 // Helper class to mimic a pointer for proxy objects.\n+327 // This is needed to implement operator-> on an iterator\n+328 // using proxy-values. It stores the proxy value but\n+329 // provides operator-> like a pointer.\n+330 template\n+331 class PointerProxy\n+332 {\n+333 public:\n+334 PointerProxy(ProxyType&& p) : p_(p)\n+335 {}\n+336\n+337 ProxyType* operator->()\n+338 {\n+339 return &p_;\n+340 }\n+341\n+342 ProxyType p_;\n+343 };\n+344\n+345 // An iterator transforming a wrapped iterator using\n+346 // an unary function. It inherits the iterator-category\n+347 // of the underlying iterator.\n+348 template ::iterator_category>\n+349 class TransformedRangeIterator;\n+350\n+351 template \n+352 class TransformedRangeIterator\n+353 {\n+354 protected:\n+355\n+356 static decltype(auto) transform(const F& f, const I& it) {\n+357 if constexpr (std::is_same_v)\n+358 return f(it);\n+359 else\n+360 return f(*it);\n+361 }\n+362\n+363 public:\n+364 using iterator_category = std::forward_iterator_tag;\n+365 using reference = decltype(transform(std::declval(), std::declval\n+()));\n+366 using value_type = std::decay_t;\n+367 using pointer = PointerProxy;\n+368\n+369 // If we later want to allow standalone TransformedRangeIterators,\n+370 // we could customize the FunctionPointer to be a default-constructible,\n+371 // copy-assignable type storing a function but acting like a pointer\n+372 // to function.\n+373 using FunctionPointer = const F*;\n+374\n+375 constexpr TransformedRangeIterator(const I& it, FunctionPointer f) noexcept\n+:\n+376 it_(it),\n+377 f_(f)\n+378 {}\n+379\n+380 // Explicitly initialize members. Using a plain\n+381 //\n+382 // constexpr TransformedRangeIterator() noexcept {}\n+383 //\n+384 // would default-initialize the members while\n+385 //\n+386 // constexpr TransformedRangeIterator() noexcept : it_(), f_() {}\n+387 //\n+388 // leads to value-initialization. This is a case where\n+389 // both are really different. If it_ is a raw pointer (i.e. POD)\n+390 // then default-initialization leaves it uninitialized while\n+391 // value-initialization zero-initializes it.\n+392 constexpr TransformedRangeIterator() noexcept :\n+393 it_(),\n+394 f_()\n+395 {}\n+396\n+397 // Dereferencing returns a value created by the function\n+398 constexpr reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const noexcept {\n+399 return transform(*f_, it_);\n+400 }\n 401\n-402 //\n-403 // functions\n-404 //\n-405\n-406 // not all functions are implemented, and unlike for , no\n-407 // comprehensive list is provided\n-_\b4_\b0_\b8 _\bD_\bU_\bN_\bE_\b__\bU_\bN_\bA_\bR_\bY_\b__\bF_\bU_\bN_\bC(real);\n-409\n-410#undef DUNE_UNARY_FUNC\n-411\n-412 // We need to overload min() and max() since they require types to be\n-413 // LessThanComparable, which requires `a in the standard (still open\n-417 // as of 2018-07-06), which strives to require both \"implicitly\" and\n-418 // \"contextually\" convertible -- plus a few other things.\n-419 //\n-420 // We do not want our debug type to automatically decay to the underlying\n-421 // type, so we do not want to make the conversion non-explicit. So the\n-422 // only option left is to overload min() and max().\n-423\n-424 template\n-_\b4_\b2_\b5 auto _\bm_\ba_\bx(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &a,\n-426 const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &b)\n-427 {\n-428 using std::max;\n-429 return aligned(_\bm_\ba_\bx(T(a), T(b)));\n-430 }\n-431\n-432 template\n-_\b4_\b3_\b3 auto _\bm_\ba_\bx(const T &a, const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &b)\n-434 {\n-435 using std::max;\n-436 return aligned(_\bm_\ba_\bx(a, T(b)));\n-437 }\n-438\n-439 template\n-_\b4_\b4_\b0 auto _\bm_\ba_\bx(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &a, const T &b)\n-441 {\n-442 using std::max;\n-443 return aligned(_\bm_\ba_\bx(T(a), b));\n-444 }\n-445\n-446 template\n-_\b4_\b4_\b7 auto _\bm_\bi_\bn(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &a,\n-448 const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &b)\n-449 {\n-450 using std::min;\n-451 return aligned(_\bm_\bi_\bn(T(a), T(b)));\n-452 }\n-453\n-454 template\n-_\b4_\b5_\b5 auto _\bm_\bi_\bn(const T &a, const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &b)\n-456 {\n-457 using std::min;\n-458 return aligned(_\bm_\bi_\bn(a, T(b)));\n-459 }\n-460\n-461 template\n-_\b4_\b6_\b2 auto _\bm_\bi_\bn(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &a, const T &b)\n-463 {\n-464 using std::min;\n-465 return aligned(_\bm_\bi_\bn(T(a), b));\n-466 }\n-467\n-468 } // namespace AlignedNumberImpl\n-469\n-470 // SIMD-like functions from \"conditional.hh\"\n-471 template\n-472 AlignedNumber\n-_\b4_\b7_\b3 _\bc_\bo_\bn_\bd(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bb_\bo_\bo_\bl_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &b,\n-474 const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &v1, const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &v2)\n-475 {\n-476 return b ? v1 : v2;\n-477 }\n-478\n-479 // SIMD-like functions from \"rangeutilities.hh\"\n-480 template\n-_\b4_\b8_\b1 T _\bm_\ba_\bx_\b__\bv_\ba_\bl_\bu_\be(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b>& val)\n-482 {\n-483 return T(val);\n-484 }\n-485\n-486 template\n-_\b4_\b8_\b7 T _\bm_\bi_\bn_\b__\bv_\ba_\bl_\bu_\be(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b>& val)\n-488 {\n-489 return T(val);\n-490 }\n-491\n-492 template\n-_\b4_\b9_\b3 bool _\ba_\bn_\by_\b__\bt_\br_\bu_\be(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bb_\bo_\bo_\bl_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b>& val)\n-494 {\n-495 return bool(val);\n-496 }\n-497\n-498 template\n-_\b4_\b9_\b9 bool _\ba_\bl_\bl_\b__\bt_\br_\bu_\be(const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bb_\bo_\bo_\bl_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b>& val)\n-500 {\n-501 return bool(val);\n-502 }\n-503\n-504 // SIMD-like functionality from \"simd/interface.hh\"\n-_\b5_\b0_\b5 namespace Simd {\n-_\b5_\b0_\b6 namespace Overloads {\n+402 // Dereferencing returns a value created by the function\n+403 pointer operator->() const noexcept {\n+404 return transform(*f_, it_);\n+405 }\n+406\n+407 constexpr TransformedRangeIterator& operator=(const\n+TransformedRangeIterator& other) = default;\n+408\n+409 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const TransformedRangeIterator& other) const\n+noexcept {\n+410 return (it_ == other.it_);\n+411 }\n+412\n+413 constexpr bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const TransformedRangeIterator& other) const\n+noexcept {\n+414 return (it_ != other.it_);\n+415 }\n+416\n+417 TransformedRangeIterator& operator++() noexcept {\n+418 ++it_;\n+419 return *this;\n+420 }\n+421\n+422 TransformedRangeIterator operator++(int) noexcept {\n+423 TransformedRangeIterator copy(*this);\n+424 ++(*this);\n+425 return copy;\n+426 }\n+427\n+428 protected:\n+429 I it_;\n+430 FunctionPointer f_;\n+431 };\n+432\n+433\n+434\n+435 template \n+436 class TransformedRangeIterator :\n+437 public TransformedRangeIterator\n+438 {\n+439 protected:\n+440 using Base = TransformedRangeIterator;\n+441 using Base::it_;\n+442 using Base::f_;\n+443 public:\n+444 using iterator_category = std::bidirectional_iterator_tag;\n+445 using reference = typename Base::reference;\n+446 using value_type = typename Base::value_type;\n+447 using pointer = typename Base::pointer;\n+448\n+449 using FunctionPointer = typename Base::FunctionPointer;\n+450\n+451 using Base::Base;\n+452\n+453 // Member functions of the forward_iterator that need\n+454 // to be redefined because the base class methods return a\n+455 // forward_iterator.\n+456 constexpr TransformedRangeIterator& operator=(const\n+TransformedRangeIterator& other) = default;\n+457\n+458 TransformedRangeIterator& operator++() noexcept {\n+459 ++it_;\n+460 return *this;\n+461 }\n+462\n+463 TransformedRangeIterator operator++(int) noexcept {\n+464 TransformedRangeIterator copy(*this);\n+465 ++(*this);\n+466 return copy;\n+467 }\n+468\n+469 // Additional member functions of bidirectional_iterator\n+470 TransformedRangeIterator& operator--() noexcept {\n+471 --(this->it_);\n+472 return *this;\n+473 }\n+474\n+475 TransformedRangeIterator operator--(int) noexcept {\n+476 TransformedRangeIterator copy(*this);\n+477 --(*this);\n+478 return copy;\n+479 }\n+480 };\n+481\n+482\n+483\n+484 template \n+485 class TransformedRangeIterator :\n+486 public TransformedRangeIterator\n+487 {\n+488 protected:\n+489 using Base = TransformedRangeIterator;\n+490 using Base::it_;\n+491 using Base::f_;\n+492 public:\n+493 using iterator_category = std::random_access_iterator_tag;\n+494 using reference = typename Base::reference;\n+495 using value_type = typename Base::value_type;\n+496 using pointer = typename Base::pointer;\n+497 using difference_type = typename std::iterator_traits::difference_type;\n+498\n+499 using FunctionPointer = typename Base::FunctionPointer;\n+500\n+501 using Base::Base;\n+502\n+503 // Member functions of the forward_iterator that need\n+504 // to be redefined because the base class methods return a\n+505 // forward_iterator.\n+506 constexpr TransformedRangeIterator& operator=(const\n+TransformedRangeIterator& other) = default;\n 507\n-508 template\n-_\b5_\b0_\b9 struct _\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\b<_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> > { using _\bt_\by_\bp_\be = T; };\n-510\n-511 template\n-_\b5_\b1_\b2 struct _\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be > {\n-_\b5_\b1_\b3 using _\bt_\by_\bp_\be = _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bU_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b>;\n-514 };\n-515\n-516 template\n-_\b5_\b1_\b7 struct _\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt<_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br > : _\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt<1> {};\n+508 TransformedRangeIterator& operator++() noexcept {\n+509 ++it_;\n+510 return *this;\n+511 }\n+512\n+513 TransformedRangeIterator operator++(int) noexcept {\n+514 TransformedRangeIterator copy(*this);\n+515 ++(*this);\n+516 return copy;\n+517 }\n 518\n-519 template\n-_\b5_\b2_\b0 T& _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, std::size_t l, _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &v)\n-521 {\n-522 assert(l == 0);\n-523 return v._\bv_\ba_\bl_\bu_\be();\n-524 }\n-525\n-526 template\n-_\b5_\b2_\b7 T _\bl_\ba_\bn_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, std::size_t l, const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &v)\n-528 {\n-529 assert(l == 0);\n-530 return v._\bv_\ba_\bl_\bu_\be();\n+519 // Member functions of the bidirectional_iterator that need\n+520 // to be redefined because the base class methods return a\n+521 // bidirectional_iterator.\n+522 TransformedRangeIterator& operator--() noexcept {\n+523 --(this->it_);\n+524 return *this;\n+525 }\n+526\n+527 TransformedRangeIterator operator--(int) noexcept {\n+528 TransformedRangeIterator copy(*this);\n+529 --(*this);\n+530 return copy;\n 531 }\n 532\n-533 template\n-534 const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &\n-_\b5_\b3_\b5 _\bc_\bo_\bn_\bd(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bb_\bo_\bo_\bl_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> mask,\n-536 const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &ifTrue,\n-537 const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bT_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &ifFalse)\n-538 {\n-539 return _\bm_\ba_\bs_\bk ? ifTrue : ifFalse;\n-540 }\n-541\n-542 template\n-_\b5_\b4_\b3 bool _\ba_\bn_\by_\bT_\br_\bu_\be(_\bA_\bD_\bL_\bT_\ba_\bg_\b<_\b5_\b>, const _\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br_\b<_\bb_\bo_\bo_\bl_\b,_\b _\ba_\bl_\bi_\bg_\bn_\b> &mask)\n-544 {\n-545 return bool(_\bm_\ba_\bs_\bk);\n+533 // Additional member functions of random_access_iterator\n+534 TransformedRangeIterator& operator+=(difference_type n) noexcept {\n+535 it_ += n;\n+536 return *this;\n+537 }\n+538\n+539 TransformedRangeIterator& operator-=(difference_type n) noexcept {\n+540 it_ -= n;\n+541 return *this;\n+542 }\n+543\n+544 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const TransformedRangeIterator& other) noexcept {\n+545 return it_(const TransformedRangeIterator& other) noexcept {\n+553 return it_>other.it_;\n+554 }\n+555\n+556 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b=(const TransformedRangeIterator& other) noexcept {\n+557 return it_>=other.it_;\n+558 }\n+559\n+560 reference operator[](difference_type n) noexcept {\n+561 return Base::transform(*f_, it_+n);\n+562 }\n+563\n+564 friend\n+565 TransformedRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(const TransformedRangeIterator& it,\n+difference_type n) noexcept {\n+566 return TransformedRangeIterator(it.it_+n, it.f_);\n+567 }\n+568\n+569 friend\n+570 TransformedRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+(difference_type n, const\n+TransformedRangeIterator& it) noexcept {\n+571 return TransformedRangeIterator(n+it.it_, it.f_);\n+572 }\n+573\n+574 friend\n+575 TransformedRangeIterator _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(const TransformedRangeIterator& it,\n+difference_type n) noexcept {\n+576 return TransformedRangeIterator(it.it_-n, it.f_);\n+577 }\n+578\n+579 friend\n+580 difference_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-(const TransformedRangeIterator& first, const\n+TransformedRangeIterator& second) noexcept {\n+581 return first.it_-second.it_;\n+582 }\n+583 };\n+584\n+585\n+586 } // namespace Impl\n+587\n+588\n+589\n+626 template \n+_\b6_\b2_\b7 class _\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\be_\bd_\bR_\ba_\bn_\bg_\be_\bV_\bi_\be_\bw\n+628 {\n+629 using RawConstIterator = std::decay_t\n+()._\bb_\be_\bg_\bi_\bn())>;\n+630 using RawIterator = std::decay_t().begin())>;\n+631\n+632 public:\n+633\n+_\b6_\b4_\b0 using _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br = Impl::TransformedRangeIterator;\n+641\n+_\b6_\b4_\b8 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br = Impl::TransformedRangeIterator;\n+649\n+_\b6_\b5_\b6 using _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be = std::remove_reference_t;\n+657\n+661 template\n+_\b6_\b6_\b2 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, const F& f) noexcept :\n+663 rawRange_(std::forward(_\br_\ba_\bw_\bR_\ba_\bn_\bg_\be)),\n+664 f_(f)\n+665 {\n+666 static_assert(std::is_same_v or std::\n+is_same_v,\n+667 \"The TransformationType passed to TransformedRangeView has to be either\n+ValueTransformationTag or IteratorTransformationTag.\");\n+668 }\n+669\n+_\b6_\b7_\b8 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const noexcept {\n+679 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.begin(), &f_);\n+680 }\n+681\n+_\b6_\b8_\b2 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() noexcept {\n+683 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.begin(), &f_);\n+684 }\n+685\n+_\b6_\b9_\b4 constexpr _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const noexcept {\n+695 return _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.end(), &f_);\n+696 }\n+697\n+_\b6_\b9_\b8 constexpr _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() noexcept {\n+699 return _\bi_\bt_\be_\br_\ba_\bt_\bo_\br(rawRange_.end(), &f_);\n+700 }\n+701\n+712 template().size())>>\n+_\b7_\b1_\b4 auto _\bs_\bi_\bz_\be() const\n+715 {\n+716 return rawRange_.size();\n+717 }\n+718\n+_\b7_\b2_\b2 const _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be& _\br_\ba_\bw_\bR_\ba_\bn_\bg_\be() const\n+723 {\n+724 return rawRange_;\n+725 }\n+726\n+_\b7_\b3_\b0 _\bR_\ba_\bw_\bR_\ba_\bn_\bg_\be& _\br_\ba_\bw_\bR_\ba_\bn_\bg_\be()\n+731 {\n+732 return rawRange_;\n+733 }\n+734\n+735 private:\n+736 R rawRange_;\n+737 F f_;\n+738 };\n+739\n+768 template \n+_\b7_\b6_\b9 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, const F& f)\n+770 {\n+771 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 _\bF_\b,_\b _\bV_\ba_\bl_\bu_\be_\bT_\br_\ba_\bn_\bs_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bT_\ba_\bg_\b>(std::forward\n+(_\br_\ba_\bn_\bg_\be), f);\n+772 }\n+773\n+801 template \n+_\b8_\b0_\b2 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, const F& f)\n+803 {\n+804 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 _\bF_\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_\b>(std::\n+forward(_\br_\ba_\bn_\bg_\be), f);\n+805 }\n+806\n+807\n+820 template\n+_\b8_\b2_\b1 auto _\bs_\bp_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be(Range&& _\br_\ba_\bn_\bg_\be) {\n+822 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+823 return std::tuple(*it, it.index());\n+824 });\n+825 }\n+826\n+831}\n+832\n+833#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-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bn_\bd_\be_\bx_\b__\bc_\bo_\bn_\bs_\bt_\ba_\bn_\bt\n-std::integral_constant< std::size_t, i > index_constant\n-An index constant with value i.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indices.hh:30\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:_\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+_\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:821\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, const F &f)\n+Create a TransformedRangeView using an iterator transformation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:802\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, const F &f)\n+Create a TransformedRangeView.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:769\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:300\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:637\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:683\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:660\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:237\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:705\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:259\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:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt\n-void violatedAlignment(const char *className, std::size_t expectedAlignment,\n-const void *address)\n-called when an alignment violation is detected\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.cc:39\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:493\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:499\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-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bb_\bu_\bg_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt\n-static constexpr auto debugAlignment\n-an alignment large enough to trigger alignment errors\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:84\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:_\ba_\bl_\bi_\bg_\bn_\be_\bd\n-AlignedNumber< T, align > aligned(T value)\n-align a value to a certain alignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bv_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br\n-ViolatedAlignmentHandler & violatedAlignmentHandler()\n-access the handler called by violatedAlignment()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.cc:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bs_\bA_\bl_\bi_\bg_\bn_\be_\bd\n-bool isAligned(const void *p, std::size_t align)\n-check whether an address conforms to the given alignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:56\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:481\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\bi_\bo_\bl_\ba_\bt_\be_\bd_\bA_\bl_\bi_\bg_\bn_\bm_\be_\bn_\bt_\bH_\ba_\bn_\bd_\bl_\be_\br\n-std::function< void(const char *, std::size_t, const void *)>\n-ViolatedAlignmentHandler\n-type of the handler called by violatedAlignment()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:31\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:487\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:_\bm_\bi_\bn\n-auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n-&b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:447\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:_\bm_\ba_\bx\n-auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align >\n-&b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:425\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\ba_\bn_\by_\bT_\br_\bu_\be\n-bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:543\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bl_\ba_\bn_\be\n-T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:520\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:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be\n-CRTP base mixin class to check alignment.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be_\b:_\b:_\b~_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be\n-~AlignedBase()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-AlignedBase & operator=(AlignedBase &&)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be\n-AlignedBase(AlignedBase &&)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-AlignedBase & operator=(const AlignedBase &)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be\n-AlignedBase(const AlignedBase &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bB_\ba_\bs_\be\n-AlignedBase()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:74\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:115\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_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n-DUNE_ASSIGN_OP(<<=)\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_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n-DUNE_ASSIGN_OP(-=)\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+\n-decltype(auto) operator+() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:174\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_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n-DUNE_ASSIGN_OP(+=)\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n-decltype(auto) operator--(int)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:169\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_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n-DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%=\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-decltype(auto) operator++(int)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:166\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!\n-decltype(auto) operator!() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:204\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_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-T & value()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:132\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_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-const T & value() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:131\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_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n-DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|=\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n-friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream<\n-charT, Traits > &str, AlignedNumber &u)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:137\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_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bA_\bS_\bS_\bI_\bG_\bN_\b__\bO_\bP\n-DUNE_ASSIGN_OP(> >=)\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_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br\n-AlignedNumber()=default\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b~\n-decltype(auto) operator~() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:194\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_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br\n-AlignedNumber(T value)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:120\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_\b:_\b:_\bA_\bl_\bi_\bg_\bn_\be_\bd_\bN_\bu_\bm_\bb_\be_\br\n-AlignedNumber(const AlignedNumber< U, uAlign > &o)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:124\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_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-\n-decltype(auto) operator-() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn debugalign.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be_\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 debugalign.hh:509\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bA_\bD_\bL_\bT_\ba_\bg\n-Tag used to force late-binding lookup in Dune::Simd::Overloads.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn base.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bR_\be_\bb_\bi_\bn_\bd_\bT_\by_\bp_\be\n-should have a member type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bi_\bm_\bd_\b:_\b:_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd_\bs_\b:_\b:_\bL_\ba_\bn_\be_\bC_\bo_\bu_\bn_\bt\n-should be derived from a Dune::index_constant\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn standard.hh:74\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:175\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:192\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:194\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:182\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:180\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:197\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:200\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:189\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:185\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: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(value_type to) noexcept\n+construct integer range [0, 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:_\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:178\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:225\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:251\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: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_\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:235\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:231\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:255\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:265\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:249\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:262\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:233\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:267\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:316\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:321\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:628\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\n+Obtain the size of the range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:714\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:698\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:656\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, F, T > const_iterator\n+Const iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:640\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:682\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, const F &f) noexcept\n+Construct from range and function.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:662\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\n+Export the wrapped untransformed range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:722\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:648\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:678\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:694\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()\n+Export the wrapped untransformed range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn rangeutilities.hh:730\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/a00188.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00188.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: scalarmatrixview.hh File Reference\n+dune-common: fmatrixev.cc File Reference\n \n \n \n \n \n \n \n@@ -70,41 +70,43 @@\n
    \n \n
    \n
    \n
    \n \n-
    scalarmatrixview.hh File Reference
    \n+Macros
    \n+
    fmatrixev.cc File Reference
    \n
    \n
    \n-\n-

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

    \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+
    #include <iostream>
    \n+#include <cmath>
    \n+#include <cassert>
    \n+#include <dune/common/exceptions.hh>
    \n+

    \n-Namespaces

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

    \n+Macros

    #define DUNE_FMATRIXEIGENVALUES_CC
     
    \n-

    Detailed Description

    \n-

    Implements a scalar matrix view wrapper around an existing scalar.

    \n-
    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_FMATRIXEIGENVALUES_CC

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define DUNE_FMATRIXEIGENVALUES_CC
    \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,28 +1,20 @@\n dune-common\u00a02.9.0\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\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-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+_\bM_\ba_\bc_\br_\bo_\bs\n+fmatrixev.cc File Reference\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+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bF_\bM_\bA_\bT_\bR_\bI_\bX_\bE_\bI_\bG_\bE_\bN_\bV_\bA_\bL_\bU_\bE_\bS_\b__\bC_\bC\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 scalar matrix view wrapper around an existing scalar.\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_F\bFM\bMA\bAT\bTR\bRI\bIX\bXE\bEI\bIG\bGE\bEN\bNV\bVA\bAL\bLU\bUE\bES\bS_\b_C\bCC\bC *\b**\b**\b**\b**\b*\n+#define DUNE_FMATRIXEIGENVALUES_CC\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/a00191.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00191.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: dynmatrix.hh File Reference\n+dune-common: arraylist.hh File Reference\n \n \n \n \n \n \n \n@@ -72,50 +72,49 @@\n
  • dune
  • common
  • \n
    \n
    \n
    \n \n-
    dynmatrix.hh File Reference
    \n+
    arraylist.hh File Reference
    \n
    \n
    \n \n-

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

    Implements a random-access container that can efficiently change size (similar to std::deque) \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+
    #include <array>
    \n+#include <cassert>
    \n+#include <memory>
    \n+#include <vector>
    \n+#include "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 Classes

    struct  Dune::DenseMatVecTraits< DynamicMatrix< K > >
    class  Dune::ArrayList< T, N, A >
     A dynamically growing random access list. More...
     
    struct  Dune::FieldTraits< DynamicMatrix< K > >
    class  Dune::ArrayListIterator< T, N, A >
     A random access iterator for the Dune::ArrayList class. More...
     
    class  Dune::DynamicMatrix< K >
     Construct a matrix with a dynamic size. More...
    class  Dune::ConstArrayListIterator< T, N, A >
     A constant random access iterator for the Dune::ArrayList class. More...
     
    \n \n \n \n \n

    \n Namespaces

    namespace  Dune
     Dune namespace.
     
    \n

    Detailed Description

    \n-

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

    \n+

    Implements a random-access container that can efficiently change size (similar to std::deque)

    \n+

    This file implements the class ArrayList which behaves like dynamically growing array together with the class ArrayListIterator which is random access iterator as needed by the stl for sorting and other algorithms.

    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,37 +1,41 @@\n dune-common\u00a02.9.0\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+arraylist.hh File Reference\n+Implements a random-access container that can efficiently change size (similar\n+to std::deque) _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \"_\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-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+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\b _\bT_\b,_\b _\bN_\b,_\b _\bA_\b _\b>\n+\u00a0 A dynamically growing random access list. _\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_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\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>\n+\u00a0 A random access iterator for the _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt class. _\bM_\bo_\br_\be_\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+class \u00a0 _\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_\b<_\b _\bT_\b,_\b _\bN_\b,_\b _\bA_\b _\b>\n+\u00a0 A constant random access iterator for the _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt class.\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-This file implements a dense matrix with dynamic numbers of rows and columns.\n+Implements a random-access container that can efficiently change size (similar\n+to std::deque)\n+This file implements the class ArrayList which behaves like dynamically growing\n+array together with the class ArrayListIterator which is random access iterator\n+as needed by the stl for sorting and other algorithms.\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/a00191_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00191_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: arraylist.hh Source File\n \n \n \n \n \n \n \n@@ -74,215 +74,623 @@\n \n
    \n \n
    \n
    \n
    \n-
    dynmatrix.hh
    \n+
    arraylist.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 (C) 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+
    5
    \n+
    6#ifndef DUNE_COMMON_ARRAYLIST_HH
    \n+
    7#define DUNE_COMMON_ARRAYLIST_HH
    \n+
    8
    \n+
    9#include <array>
    \n+
    10#include <cassert>
    \n+
    11#include <memory>
    \n+
    12#include <vector>
    \n+
    13#include "iteratorfacades.hh"
    \n+
    14
    \n+
    15namespace Dune
    \n+
    16{
    \n+
    17 // forward declaration
    \n+
    18 template<class T, int N, class A>
    \n+
    19 class ArrayListIterator;
    \n+
    20
    \n+
    21 template<class T, int N, class A>
    \n+
    22 class ConstArrayListIterator;
    \n+
    23
    \n+
    60 template<class T, int N=100, class A=std::allocator<T> >
    \n+
    \n+\n+
    62 {
    \n+
    63 public:
    \n+
    69 typedef T MemberType;
    \n+
    70
    \n+
    74 typedef T value_type;
    \n+
    75
    \n+
    79 typedef T& reference;
    \n+
    80
    \n+
    84 typedef const T& const_reference;
    \n+
    85
    \n+
    89 typedef T* pointer;
    \n+
    90
    \n+
    94 typedef const T* const_pointer;
    \n+
    95
    \n+
    100 constexpr static int chunkSize_ = (N > 0) ? N : 1;
    \n+
    101
    \n+\n+
    106
    \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+
    115 typedef std::size_t size_type;
    \n+
    116
    \n+
    120 typedef std::ptrdiff_t difference_type;
    \n+
    121
    \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+\n+
    127
    \n+
    \n+\n+
    134
    \n+
    \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+\n+
    146
    \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-
    Macro for wrapping boundary checks.
    \n-
    Traits for type conversions and type information.
    \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+
    151 inline void push_back(const_reference entry);
    \n+
    152
    \n+
    \n+\n+
    159
    \n+
    \n+\n+
    166
    \n+
    \n+
    171 inline size_type size() const;
    \n+
    172
    \n+
    \n+
    180 inline void purge();
    \n+
    181
    \n+
    \n+
    185 inline void clear();
    \n+
    \n+\n+
    190
    \n+
    191 private:
    \n+
    192
    \n+
    196 using SmartPointerAllocator = typename std::allocator_traits<A>::template rebind_alloc< std::shared_ptr< std::array<MemberType,chunkSize_> > >;
    \n+
    197
    \n+
    201 using ArrayAllocator = typename std::allocator_traits<A>::template rebind_alloc< std::array<MemberType,chunkSize_> >;
    \n+
    202
    \n+
    206 friend class ArrayListIterator<T,N,A>;
    \n+
    207 friend class ConstArrayListIterator<T,N,A>;
    \n+
    208
    \n+
    210 std::vector<std::shared_ptr<std::array<MemberType,chunkSize_> >,
    \n+
    211 SmartPointerAllocator> chunks_;
    \n+
    220 size_type capacity_;
    \n+
    222 size_type size_;
    \n+
    224 size_type start_;
    \n+
    233 inline reference elementAt(size_type i);
    \n+
    234
    \n+
    243 inline const_reference elementAt(size_type i) const;
    \n+
    244 };
    \n+
    245
    \n+
    246
    \n+
    250 template<class T, int N, class A>
    \n+
    \n+
    251 class ArrayListIterator : public RandomAccessIteratorFacade<ArrayListIterator<T,N,A>,
    \n+
    252 typename A::value_type,
    \n+
    253 typename A::value_type &,
    \n+
    254 typename A::difference_type>
    \n+
    255 {
    \n+
    256
    \n+
    257 friend class ArrayList<T,N,A>;
    \n+
    258 friend class ConstArrayListIterator<T,N,A>;
    \n+
    259 public:
    \n+
    263 typedef typename A::value_type MemberType;
    \n+
    264
    \n+
    265 typedef typename A::difference_type difference_type;
    \n+
    266
    \n+
    267 typedef typename A::size_type size_type;
    \n+
    268
    \n+
    269 using reference = typename A::value_type &;
    \n+
    270
    \n+
    271 using const_reference = typename A::value_type const&;
    \n+
    272
    \n+
    278 constexpr static int chunkSize_ = (N > 0) ? N : 1;
    \n+
    279
    \n+
    280
    \n+
    286 inline bool equals(const ArrayListIterator<MemberType,N,A>& other) const;
    \n+
    287
    \n+
    293 inline bool equals(const ConstArrayListIterator<MemberType,N,A>& other) const;
    \n+
    294
    \n+
    298 inline void increment();
    \n+
    299
    \n+
    303 inline void decrement();
    \n+
    304
    \n+
    309 inline reference elementAt(size_type i) const;
    \n+
    310
    \n+
    315 inline reference dereference() const;
    \n+
    316
    \n+
    328 inline void eraseToHere();
    \n+
    329
    \n+
    331 inline size_type position(){return position_;}
    \n+
    332
    \n+
    334 inline void advance(difference_type n);
    \n+
    335
    \n+
    337 inline difference_type distanceTo(const ArrayListIterator<T,N,A>& other) const;
    \n+
    338
    \n+
    \n+
    340 inline ArrayListIterator() : position_(0), list_(nullptr)
    \n+
    341 {}
    \n+
    \n+
    342
    \n+
    343 private:
    \n+\n+
    350
    \n+
    354 size_type position_;
    \n+\n+
    359 };
    \n+
    \n+
    360
    \n+
    364 template<class T, int N, class A>
    \n+
    \n+\n+
    366 : public RandomAccessIteratorFacade<ConstArrayListIterator<T,N,A>,
    \n+
    367 const typename A::value_type,
    \n+
    368 typename A::value_type const&,
    \n+
    369 typename A::difference_type>
    \n+
    370 {
    \n+
    371
    \n+
    372 friend class ArrayList<T,N,A>;
    \n+
    373 friend class ArrayListIterator<T,N,A>;
    \n+
    374
    \n+
    375 public:
    \n+
    379 typedef typename A::value_type MemberType;
    \n+
    380
    \n+
    381 typedef typename A::difference_type difference_type;
    \n+
    382
    \n+
    383 typedef typename A::size_type size_type;
    \n+
    384
    \n+
    385 using reference = typename A::value_type &;
    \n+
    386
    \n+
    387 using const_reference = typename A::value_type const&;
    \n+
    388
    \n+
    394 constexpr static int chunkSize_ = (N > 0) ? N : 1;
    \n+
    395
    \n+
    \n+
    401 inline bool equals(const ConstArrayListIterator<MemberType,N,A>& other) const;
    \n+
    402
    \n+
    \n+
    406 inline void increment();
    \n+
    407
    \n+
    \n+
    411 inline void decrement();
    \n+
    412
    \n+
    \n+
    414 inline void advance(difference_type n);
    \n+
    415
    \n+
    \n+\n+
    418
    \n+
    \n+\n+
    424
    \n+
    \n+\n+
    430
    \n+
    \n+
    431 inline ConstArrayListIterator() : position_(0), list_(nullptr)
    \n+
    432 {}
    \n+
    \n+
    433
    \n+
    \n+\n+
    435
    \n+
    436 private:
    \n+
    437
    \n+
    443 inline ConstArrayListIterator(const ArrayList<T,N,A>& arrayList, size_type position);
    \n+
    444
    \n+
    448 size_type position_;
    \n+
    452 const ArrayList<T,N,A>* list_;
    \n+
    453 };
    \n+
    454
    \n+
    455
    \n+
    456 template<class T, int N, class A>
    \n+
    \n+\n+
    458 : capacity_(0), size_(0), start_(0)
    \n+
    459 {
    \n+
    460 chunks_.reserve(100);
    \n+
    461 }
    \n+
    \n+
    462
    \n+
    463 template<class T, int N, class A>
    \n+
    \n+\n+
    465 capacity_=0;
    \n+
    466 size_=0;
    \n+
    467 start_=0;
    \n+
    468 chunks_.clear();
    \n+
    469 }
    \n+
    \n+
    470
    \n+
    471 template<class T, int N, class A>
    \n+
    \n+\n+
    473 {
    \n+
    474 return size_;
    \n+
    475 }
    \n+
    \n+
    476
    \n+
    477 template<class T, int N, class A>
    \n+
    \n+\n+
    479 {
    \n+
    480 size_t index=start_+size_;
    \n+
    481 if(index==capacity_)
    \n+
    482 {
    \n+
    483 chunks_.push_back(std::make_shared<std::array<MemberType,chunkSize_> >());
    \n+
    484 capacity_ += chunkSize_;
    \n+
    485 }
    \n+
    486 elementAt(index)=entry;
    \n+
    487 ++size_;
    \n+
    488 }
    \n+
    \n+
    489
    \n+
    490 template<class T, int N, class A>
    \n+
    \n+\n+
    492 {
    \n+
    493 return elementAt(start_+i);
    \n+
    494 }
    \n+
    \n+
    495
    \n+
    496
    \n+
    497 template<class T, int N, class A>
    \n+
    \n+\n+
    499 {
    \n+
    500 return elementAt(start_+i);
    \n+
    501 }
    \n+
    \n+
    502
    \n+
    503 template<class T, int N, class A>
    \n+\n+
    505 {
    \n+
    506 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
    \n+
    507 }
    \n+
    508
    \n+
    509
    \n+
    510 template<class T, int N, class A>
    \n+
    511 typename ArrayList<T,N,A>::const_reference ArrayList<T,N,A>::elementAt(size_type i) const
    \n+
    512 {
    \n+
    513 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);
    \n+
    514 }
    \n+
    515
    \n+
    516 template<class T, int N, class A>
    \n+
    \n+\n+
    518 {
    \n+
    519 return ArrayListIterator<T,N,A>(*this, start_);
    \n+
    520 }
    \n+
    \n+
    521
    \n+
    522 template<class T, int N, class A>
    \n+
    \n+\n+
    524 {
    \n+
    525 return ConstArrayListIterator<T,N,A>(*this, start_);
    \n+
    526 }
    \n+
    \n+
    527
    \n+
    528 template<class T, int N, class A>
    \n+
    \n+\n+
    530 {
    \n+
    531 return ArrayListIterator<T,N,A>(*this, start_+size_);
    \n+
    532 }
    \n+
    \n+
    533
    \n+
    534 template<class T, int N, class A>
    \n+
    \n+\n+
    536 {
    \n+
    537 return ConstArrayListIterator<T,N,A>(*this, start_+size_);
    \n+
    538 }
    \n+
    \n+
    539
    \n+
    540 template<class T, int N, class A>
    \n+
    \n+\n+
    542 {
    \n+
    543 // Distance to copy to the left.
    \n+
    544 size_t distance = start_/chunkSize_;
    \n+
    545 if(distance>0) {
    \n+
    546 // Number of chunks with entries in it;
    \n+
    547 size_t chunks = ((start_%chunkSize_ + size_)/chunkSize_ );
    \n+
    548
    \n+
    549 // Copy chunks to the left.
    \n+
    550 std::copy(chunks_.begin()+distance,
    \n+
    551 chunks_.begin()+(distance+chunks), chunks_.begin());
    \n+
    552
    \n+
    553 // Calculate new parameters
    \n+
    554 start_ = start_ % chunkSize_;
    \n+
    555 //capacity += distance * chunkSize_;
    \n+
    556 }
    \n+
    557 }
    \n+
    \n+
    558
    \n+
    559 template<class T, int N, class A>
    \n+
    \n+\n+
    561 {
    \n+
    562 position_+=i;
    \n+
    563 }
    \n+
    \n+
    564
    \n+
    565 template<class T, int N, class A>
    \n+
    \n+\n+
    567 {
    \n+
    568 position_+=i;
    \n+
    569 }
    \n+
    \n+
    570
    \n+
    571
    \n+
    572 template<class T, int N, class A>
    \n+
    \n+\n+
    574 {
    \n+
    575 // Makes only sense if we reference a common list
    \n+
    576 assert(list_==(other.list_));
    \n+
    577 return position_==other.position_ ;
    \n+
    578 }
    \n+
    \n+
    579
    \n+
    580
    \n+
    581 template<class T, int N, class A>
    \n+
    \n+\n+
    583 {
    \n+
    584 // Makes only sense if we reference a common list
    \n+
    585 assert(list_==(other.list_));
    \n+
    586 return position_==other.position_ ;
    \n+
    587 }
    \n+
    \n+
    588
    \n+
    589
    \n+
    590 template<class T, int N, class A>
    \n+
    \n+\n+
    592 {
    \n+
    593 // Makes only sense if we reference a common list
    \n+
    594 assert(list_==(other.list_));
    \n+
    595 return position_==other.position_ ;
    \n+
    596 }
    \n+
    \n+
    597
    \n+
    598 template<class T, int N, class A>
    \n+
    \n+\n+
    600 {
    \n+
    601 ++position_;
    \n+
    602 }
    \n+
    \n+
    603
    \n+
    604 template<class T, int N, class A>
    \n+
    \n+\n+
    606 {
    \n+
    607 ++position_;
    \n+
    608 }
    \n+
    \n+
    609
    \n+
    610 template<class T, int N, class A>
    \n+
    \n+\n+
    612 {
    \n+
    613 --position_;
    \n+
    614 }
    \n+
    \n+
    615
    \n+
    616 template<class T, int N, class A>
    \n+
    \n+\n+
    618 {
    \n+
    619 --position_;
    \n+
    620 }
    \n+
    \n+
    621
    \n+
    622 template<class T, int N, class A>
    \n+
    \n+\n+
    624 {
    \n+
    625 return list_->elementAt(i+position_);
    \n+
    626 }
    \n+
    \n+
    627
    \n+
    628 template<class T, int N, class A>
    \n+
    \n+\n+
    630 {
    \n+
    631 return list_->elementAt(i+position_);
    \n+
    632 }
    \n+
    \n+
    633
    \n+
    634 template<class T, int N, class A>
    \n+
    \n+\n+
    636 {
    \n+
    637 return list_->elementAt(position_);
    \n+
    638 }
    \n+
    \n+
    639
    \n+
    640 template<class T, int N, class A>
    \n+
    \n+\n+
    642 {
    \n+
    643 return list_->elementAt(position_);
    \n+
    644 }
    \n+
    \n+
    645
    \n+
    646 template<class T, int N, class A>
    \n+
    \n+\n+
    648 {
    \n+
    649 // Makes only sense if we reference a common list
    \n+
    650 assert(list_==(other.list_));
    \n+
    651 return other.position_ - position_;
    \n+
    652 }
    \n+
    \n+
    653
    \n+
    654 template<class T, int N, class A>
    \n+
    \n+\n+
    656 {
    \n+
    657 // Makes only sense if we reference a common list
    \n+
    658 assert(list_==(other.list_));
    \n+
    659 return other.position_ - position_;
    \n+
    660 }
    \n+
    \n+
    661
    \n+
    662 template<class T, int N, class A>
    \n+
    \n+\n+
    664 {
    \n+
    665 list_->size_ -= ++position_ - list_->start_;
    \n+
    666 // chunk number of the new position.
    \n+
    667 size_t posChunkStart = position_ / chunkSize_;
    \n+
    668 // number of chunks to deallocate
    \n+
    669 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_)
    \n+
    670 / chunkSize_;
    \n+
    671 list_->start_ = position_;
    \n+
    672
    \n+
    673 // Deallocate memory not needed any more.
    \n+
    674 for(size_t chunk=0; chunk<chunks; chunk++) {
    \n+
    675 --posChunkStart;
    \n+
    676 list_->chunks_[posChunkStart].reset();
    \n+
    677 }
    \n+
    678
    \n+
    679 // Capacity stays the same as the chunks before us
    \n+
    680 // are still there. They null pointers.
    \n+
    681 assert(list_->start_+list_->size_<=list_->capacity_);
    \n+
    682 }
    \n+
    \n+
    683
    \n+
    684 template<class T, int N, class A>
    \n+\n+
    686 : position_(position), list_(&arrayList)
    \n+
    687 {}
    \n+
    688
    \n+
    689
    \n+
    690 template<class T, int N, class A>
    \n+
    691 ConstArrayListIterator<T,N,A>::ConstArrayListIterator(const ArrayList<T,N,A>& arrayList,
    \n+
    692 size_type position)
    \n+
    693 : position_(position), list_(&arrayList)
    \n+
    694 {}
    \n+
    695
    \n+
    696 template<class T, int N, class A>
    \n+
    \n+\n+
    698 : position_(other.position_), list_(other.list_)
    \n+
    699 {}
    \n+
    \n+
    \n+
    700
    \n+
    701
    \n+
    703}
    \n+
    704#endif
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    This file implements iterator facade classes for writing stl conformant iterators.
    \n+
    reference operator[](size_type i)
    Get the element at specific position.
    Definition arraylist.hh:491
    \n+
    iterator begin()
    Get an iterator that is positioned at the first element.
    Definition arraylist.hh:517
    \n+
    bool equals(const ArrayListIterator< MemberType, N, A > &other) const
    Comares two iterators.
    Definition arraylist.hh:573
    \n+
    void increment()
    Increment the iterator.
    Definition arraylist.hh:599
    \n+
    size_type size() const
    Get the number of elements in the list.
    Definition arraylist.hh:472
    \n+
    ConstArrayListIterator(const ArrayListIterator< T, N, A > &other)
    Definition arraylist.hh:697
    \n+
    void purge()
    Purge the list.
    Definition arraylist.hh:541
    \n+
    void decrement()
    decrement the iterator.
    Definition arraylist.hh:611
    \n+
    void eraseToHere()
    Erase all entries before the current position and the one at the current position.
    Definition arraylist.hh:663
    \n+
    ArrayList()
    Constructs an Array list with one chunk.
    Definition arraylist.hh:457
    \n+
    const_iterator begin() const
    Get a random access iterator that is positioned at the first element.
    Definition arraylist.hh:523
    \n+
    void increment()
    Increment the iterator.
    Definition arraylist.hh:605
    \n+
    iterator end()
    Get a random access iterator positioned after the last element.
    Definition arraylist.hh:529
    \n+
    const_reference elementAt(size_type i) const
    Get the value of the list at an arbitrary position.
    Definition arraylist.hh:629
    \n+
    const_reference operator[](size_type i) const
    Get the element at specific position.
    Definition arraylist.hh:498
    \n+
    void decrement()
    decrement the iterator.
    Definition arraylist.hh:617
    \n+
    void advance(difference_type n)
    Definition arraylist.hh:566
    \n+
    const_iterator end() const
    Get a random access iterator positioned after the last element.
    Definition arraylist.hh:535
    \n+
    const_reference dereference() const
    Access the element at the current position.
    Definition arraylist.hh:641
    \n+
    void clear()
    Delete all entries from the list.
    Definition arraylist.hh:464
    \n+
    reference elementAt(size_type i) const
    Get the value of the list at an arbitrary position.
    Definition arraylist.hh:623
    \n+
    bool equals(const ConstArrayListIterator< MemberType, N, A > &other) const
    Comares to iterators.
    Definition arraylist.hh:591
    \n+
    void advance(difference_type n)
    Definition arraylist.hh:560
    \n+
    difference_type distanceTo(const ConstArrayListIterator< T, N, A > &other) const
    Definition arraylist.hh:655
    \n+
    reference dereference() const
    Access the element at the current position.
    Definition arraylist.hh:635
    \n+
    void push_back(const_reference entry)
    Append an entry to the list.
    Definition arraylist.hh:478
    \n+
    difference_type distanceTo(const ArrayListIterator< T, N, A > &other) const
    Definition arraylist.hh:647
    \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+
    A random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:255
    \n+
    size_type position()
    Definition arraylist.hh:331
    \n+
    A::value_type MemberType
    The member type.
    Definition arraylist.hh:263
    \n+
    ArrayListIterator()
    Standard constructor.
    Definition arraylist.hh:340
    \n+
    A::difference_type difference_type
    Definition arraylist.hh:265
    \n+
    static constexpr int chunkSize_
    The number of elements in one chunk of the list.
    Definition arraylist.hh:278
    \n+
    A::size_type size_type
    Definition arraylist.hh:267
    \n+
    typename A::value_type const & const_reference
    Definition arraylist.hh:271
    \n+
    typename A::value_type & reference
    Definition arraylist.hh:269
    \n+
    A constant random access iterator for the Dune::ArrayList class.
    Definition arraylist.hh:370
    \n+
    static constexpr int chunkSize_
    The number of elements in one chunk of the list.
    Definition arraylist.hh:394
    \n+
    typename A::value_type & reference
    Definition arraylist.hh:385
    \n+
    ConstArrayListIterator()
    Definition arraylist.hh:431
    \n+
    A::value_type MemberType
    The member type.
    Definition arraylist.hh:379
    \n+
    A::difference_type difference_type
    Definition arraylist.hh:381
    \n+
    typename A::value_type const & const_reference
    Definition arraylist.hh:387
    \n+
    A::size_type size_type
    Definition arraylist.hh:383
    \n+
    A dynamically growing random access list.
    Definition arraylist.hh:62
    \n+
    T value_type
    Value type for stl compliance.
    Definition arraylist.hh:74
    \n+
    static constexpr int chunkSize_
    The number of elements in one chunk of the list. This has to be at least one. The default is 100.
    Definition arraylist.hh:100
    \n+
    const T * const_pointer
    The type of a const pointer to the type we store.
    Definition arraylist.hh:94
    \n+
    ArrayListIterator< MemberType, N, A > iterator
    A random access iterator.
    Definition arraylist.hh:105
    \n+
    const T & const_reference
    The type of a const reference to the type we store.
    Definition arraylist.hh:84
    \n+
    T & reference
    The type of a reference to the type we store.
    Definition arraylist.hh:79
    \n+
    std::size_t size_type
    The size type.
    Definition arraylist.hh:115
    \n+
    T MemberType
    The member type that is stored.
    Definition arraylist.hh:69
    \n+
    T * pointer
    The type of a pointer to the type we store.
    Definition arraylist.hh:89
    \n+
    ConstArrayListIterator< MemberType, N, A > const_iterator
    A constant random access iterator.
    Definition arraylist.hh:110
    \n+
    std::ptrdiff_t difference_type
    The difference type.
    Definition arraylist.hh:120
    \n+
    Base class for stl conformant forward iterators.
    Definition iteratorfacades.hh:434
    \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,280 +1,698 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-dynmatrix.hh\n+arraylist.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 (C) 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-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+5\n+6#ifndef DUNE_COMMON_ARRAYLIST_HH\n+7#define DUNE_COMMON_ARRAYLIST_HH\n+8\n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \"_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\bf_\ba_\bc_\ba_\bd_\be_\bs_\b._\bh_\bh\"\n+14\n+15namespace _\bD_\bu_\bn_\be\n+16{\n+17 // forward declaration\n+18 template\n+19 class ArrayListIterator;\n+20\n+21 template\n+22 class ConstArrayListIterator;\n+23\n+60 template >\n+_\b6_\b1 class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt\n+62 {\n+63 public:\n+_\b6_\b9 typedef T _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n+70\n+_\b7_\b4 typedef T _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+75\n+_\b7_\b9 typedef T& _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+80\n+_\b8_\b4 typedef const T& _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+85\n+_\b8_\b9 typedef T* _\bp_\bo_\bi_\bn_\bt_\be_\br;\n+90\n+_\b9_\b4 typedef const T* _\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br;\n+95\n+_\b1_\b0_\b0 constexpr static int _\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_ = (N > 0) ? N : 1;\n+101\n+_\b1_\b0_\b5 typedef _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+106\n+_\b1_\b1_\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<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b> _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\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+_\b1_\b1_\b5 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+116\n+_\b1_\b2_\b0 typedef std::ptrdiff_t _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n+121\n+_\b1_\b2_\b6 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn();\n+127\n+_\b1_\b3_\b3 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+134\n+_\b1_\b3_\b9 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd();\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-_\bb_\bo_\bu_\bn_\bd_\bs_\bc_\bh_\be_\bc_\bk_\bi_\bn_\bg_\b._\bh_\bh\n-Macro for wrapping boundary checks.\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-_\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+_\b1_\b4_\b5 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+146\n+_\b1_\b5_\b1 inline void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be entry);\n+152\n+_\b1_\b5_\b8 inline _\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);\n+159\n+_\b1_\b6_\b5 inline _\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+166\n+_\b1_\b7_\b1 inline _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const;\n+172\n+_\b1_\b8_\b0 inline void _\bp_\bu_\br_\bg_\be();\n+181\n+_\b1_\b8_\b5 inline void _\bc_\bl_\be_\ba_\br();\n+_\b1_\b8_\b9 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt();\n+190\n+191 private:\n+192\n+196 using SmartPointerAllocator = typename std::allocator_traits::template\n+rebind_alloc< std::shared_ptr< std::array > >;\n+197\n+201 using ArrayAllocator = typename std::allocator_traits::template\n+rebind_alloc< std::array >;\n+202\n+206 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+207 friend class _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+208\n+210 std::vector >,\n+211 SmartPointerAllocator> chunks_;\n+220 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be capacity_;\n+222 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_;\n+224 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be start_;\n+233 inline _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be elementAt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i);\n+234\n+_\b2_\b4_\b3 inline _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be elementAt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const;\n+244 };\n+245\n+246\n+250 template\n+_\b2_\b5_\b1 class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public\n+_\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+252 typename A::value_type,\n+253 typename A::value_type &,\n+254 typename A::difference_type>\n+255 {\n+256\n+257 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt;\n+258 friend class _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+259 public:\n+_\b2_\b6_\b3 typedef typename A::value_type _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n+264\n+_\b2_\b6_\b5 typedef typename A::difference_type _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n+266\n+_\b2_\b6_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+268\n+_\b2_\b6_\b9 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type &;\n+270\n+_\b2_\b7_\b1 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type const&;\n+272\n+_\b2_\b7_\b8 constexpr static int _\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_ = (N > 0) ? N : 1;\n+279\n+280\n+286 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const;\n+287\n+293 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other)\n+const;\n+294\n+298 inline void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+299\n+303 inline void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n+304\n+309 inline _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const;\n+310\n+315 inline _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n+316\n+328 inline void _\be_\br_\ba_\bs_\be_\bT_\bo_\bH_\be_\br_\be();\n+329\n+_\b3_\b3_\b1 inline _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(){return position_;}\n+332\n+334 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be n);\n+335\n+337 inline _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other)\n+const;\n+338\n+_\b3_\b4_\b0 inline _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br() : position_(0), list_(nullptr)\n+341 {}\n+342\n+343 private:\n+349 inline _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>& arrayList, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn);\n+350\n+354 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be position_;\n+_\b3_\b5_\b8 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>* list_;\n+359 };\n+360\n+364 template\n+_\b3_\b6_\b5 class _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+366 : public _\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+367 const typename A::value_type,\n+368 typename A::value_type const&,\n+369 typename A::difference_type>\n+370 {\n+371\n+372 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt;\n+373 friend class _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+374\n+375 public:\n+_\b3_\b7_\b9 typedef typename A::value_type _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n+380\n+_\b3_\b8_\b1 typedef typename A::difference_type _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be;\n+382\n+_\b3_\b8_\b3 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+384\n+_\b3_\b8_\b5 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type &;\n+386\n+_\b3_\b8_\b7 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = typename A::value_type const&;\n+388\n+_\b3_\b9_\b4 constexpr static int _\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_ = (N > 0) ? N : 1;\n+395\n+_\b4_\b0_\b1 inline bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other)\n+const;\n+402\n+_\b4_\b0_\b6 inline void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+407\n+_\b4_\b1_\b1 inline void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n+412\n+_\b4_\b1_\b4 inline void _\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be n);\n+415\n+_\b4_\b1_\b7 inline _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>&\n+other) const;\n+418\n+_\b4_\b2_\b3 inline _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const;\n+424\n+_\b4_\b2_\b9 inline _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n+430\n+_\b4_\b3_\b1 inline _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br() : position_(0), list_(nullptr)\n+432 {}\n+433\n+_\b4_\b3_\b4 inline _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other);\n+435\n+436 private:\n+437\n+443 inline _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>& arrayList, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+position);\n+444\n+448 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be position_;\n+452 const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>* list_;\n+453 };\n+454\n+455\n+456 template\n+_\b4_\b5_\b7 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt()\n+458 : capacity_(0), size_(0), start_(0)\n+459 {\n+460 chunks_.reserve(100);\n+461 }\n+462\n+463 template\n+_\b4_\b6_\b4 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bl_\be_\ba_\br(){\n+465 capacity_=0;\n+466 size_=0;\n+467 start_=0;\n+468 chunks_.clear();\n+469 }\n+470\n+471 template\n+_\b4_\b7_\b2 size_t _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bs_\bi_\bz_\be() const\n+473 {\n+474 return size_;\n+475 }\n+476\n+477 template\n+_\b4_\b7_\b8 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk(_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be entry)\n+479 {\n+480 size_t index=start_+size_;\n+481 if(index==capacity_)\n+482 {\n+483 chunks_.push_back(std::make_shared >());\n+484 capacity_ += chunkSize_;\n+485 }\n+486 elementAt(index)=entry;\n+487 ++size_;\n+488 }\n+489\n+490 template\n+_\b4_\b9_\b1 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+i)\n+492 {\n+493 return elementAt(start_+i);\n+494 }\n+495\n+496\n+497 template\n+_\b4_\b9_\b8 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+499 {\n+500 return elementAt(start_+i);\n+501 }\n+502\n+503 template\n+504 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(size_type\n+i)\n+505 {\n+506 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);\n+507 }\n+508\n+509\n+510 template\n+511 typename ArrayList::const_reference ArrayList::elementAt\n+(size_type i) const\n+512 {\n+513 return chunks_[i/chunkSize_]->operator[](i%chunkSize_);\n+514 }\n+515\n+516 template\n+_\b5_\b1_\b7 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n+518 {\n+519 return _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_);\n+520 }\n+521\n+522 template\n+_\b5_\b2_\b3 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n+524 {\n+525 return _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_);\n+526 }\n+527\n+528 template\n+_\b5_\b2_\b9 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd()\n+530 {\n+531 return _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_+size_);\n+532 }\n+533\n+534 template\n+_\b5_\b3_\b5 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b> _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd() const\n+536 {\n+537 return _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>(*this, start_+size_);\n+538 }\n+539\n+540 template\n+_\b5_\b4_\b1 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bp_\bu_\br_\bg_\be()\n+542 {\n+543 // Distance to copy to the left.\n+544 size_t distance = start_/chunkSize_;\n+545 if(distance>0) {\n+546 // Number of chunks with entries in it;\n+547 size_t chunks = ((start_%chunkSize_ + size_)/chunkSize_ );\n+548\n+549 // Copy chunks to the left.\n+550 std::copy(chunks_.begin()+distance,\n+551 chunks_.begin()+(distance+chunks), chunks_.begin());\n+552\n+553 // Calculate new parameters\n+554 start_ = start_ % chunkSize_;\n+555 //capacity += distance * chunkSize_;\n+556 }\n+557 }\n+558\n+559 template\n+_\b5_\b6_\b0 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be i)\n+561 {\n+562 position_+=i;\n+563 }\n+564\n+565 template\n+_\b5_\b6_\b6 void _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be(_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be i)\n+567 {\n+568 position_+=i;\n+569 }\n+570\n+571\n+572 template\n+_\b5_\b7_\b3 bool _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(const\n+_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const\n+574 {\n+575 // Makes only sense if we reference a common list\n+576 assert(list_==(other.list_));\n+577 return position_==other.position_ ;\n+578 }\n+579\n+580\n+581 template\n+_\b5_\b8_\b2 bool _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(const\n+_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const\n+583 {\n+584 // Makes only sense if we reference a common list\n+585 assert(list_==(other.list_));\n+586 return position_==other.position_ ;\n+587 }\n+588\n+589\n+590 template\n+_\b5_\b9_\b1 bool _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs(const\n+_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b,_\bN_\b,_\bA_\b>& other) const\n+592 {\n+593 // Makes only sense if we reference a common list\n+594 assert(list_==(other.list_));\n+595 return position_==other.position_ ;\n+596 }\n+597\n+598 template\n+_\b5_\b9_\b9 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n+600 {\n+601 ++position_;\n+602 }\n+603\n+604 template\n+_\b6_\b0_\b5 void _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n+606 {\n+607 ++position_;\n+608 }\n+609\n+610 template\n+_\b6_\b1_\b1 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n+612 {\n+613 --position_;\n+614 }\n+615\n+616 template\n+_\b6_\b1_\b7 void _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n+618 {\n+619 --position_;\n+620 }\n+621\n+622 template\n+_\b6_\b2_\b3 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:\n+_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+624 {\n+625 return list_->elementAt(i+position_);\n+626 }\n+627\n+628 template\n+_\b6_\b2_\b9 typename _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+630 {\n+631 return list_->elementAt(i+position_);\n+632 }\n+633\n+634 template\n+_\b6_\b3_\b5 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:\n+_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n+636 {\n+637 return list_->elementAt(position_);\n+638 }\n+639\n+640 template\n+_\b6_\b4_\b1 typename _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n+642 {\n+643 return list_->elementAt(position_);\n+644 }\n+645\n+646 template\n+_\b6_\b4_\b7 typename _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other)\n+const\n+648 {\n+649 // Makes only sense if we reference a common list\n+650 assert(list_==(other.list_));\n+651 return other.position_ - position_;\n+652 }\n+653\n+654 template\n+_\b6_\b5_\b5 typename _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>&\n+other) const\n+656 {\n+657 // Makes only sense if we reference a common list\n+658 assert(list_==(other.list_));\n+659 return other.position_ - position_;\n+660 }\n+661\n+662 template\n+_\b6_\b6_\b3 void _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\be_\br_\ba_\bs_\be_\bT_\bo_\bH_\be_\br_\be()\n+664 {\n+665 list_->size_ -= ++position_ - list_->start_;\n+666 // chunk number of the new position.\n+667 size_t posChunkStart = position_ / chunkSize_;\n+668 // number of chunks to deallocate\n+669 size_t chunks = (position_ - list_->start_ + list_->start_ % chunkSize_)\n+670 / chunkSize_;\n+671 list_->start_ = position_;\n+672\n+673 // Deallocate memory not needed any more.\n+674 for(size_t chunk=0; chunkchunks_[posChunkStart].reset();\n+677 }\n+678\n+679 // Capacity stays the same as the chunks before us\n+680 // are still there. They null pointers.\n+681 assert(list_->start_+list_->size_<=list_->capacity_);\n+682 }\n+683\n+684 template\n+685 _\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b<_\bT_\b,_\bN_\b,_\bA_\b>& arrayList,\n+size_type position)\n+686 : position_(position), list_(&arrayList)\n+687 {}\n+688\n+689\n+690 template\n+691 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const\n+ArrayList& arrayList,\n+692 size_type position)\n+693 : position_(position), list_(&arrayList)\n+694 {}\n+695\n+696 template\n+_\b6_\b9_\b7 _\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const\n+_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bT_\b,_\bN_\b,_\bA_\b>& other)\n+698 : position_(other.position_), list_(other.list_)\n+699 {}\n+700\n+701\n+703}\n+704#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+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+reference operator[](size_type i)\n+Get the element at specific position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:491\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+Get an iterator that is positioned at the first element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:517\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const ArrayListIterator< MemberType, N, A > &other) const\n+Comares two iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:573\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n+void increment()\n+Increment the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:599\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bs_\bi_\bz_\be\n+size_type size() const\n+Get the number of elements in the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:472\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_\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+ConstArrayListIterator(const ArrayListIterator< T, N, A > &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:697\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bu_\br_\bg_\be\n+void purge()\n+Purge the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:541\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n+void decrement()\n+decrement the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:611\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\br_\ba_\bs_\be_\bT_\bo_\bH_\be_\br_\be\n+void eraseToHere()\n+Erase all entries before the current position and the one at the current\n+position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:663\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt\n+ArrayList()\n+Constructs an Array list with one chunk.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:457\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+Get a random access iterator that is positioned at the first element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:523\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_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n+void increment()\n+Increment the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:605\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\be_\bn_\bd\n+iterator end()\n+Get a random access iterator positioned after the last element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:529\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_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n+const_reference elementAt(size_type i) const\n+Get the value of the list at an arbitrary position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:629\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const_reference operator[](size_type i) const\n+Get the element at specific position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:498\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_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n+void decrement()\n+decrement the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:617\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_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n+void advance(difference_type n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:566\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+Get a random access iterator positioned after the last element.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:535\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_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const_reference dereference() const\n+Access the element at the current position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:641\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bl_\be_\ba_\br\n+void clear()\n+Delete all entries from the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:464\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bl_\be_\bm_\be_\bn_\bt_\bA_\bt\n+reference elementAt(size_type i) const\n+Get the value of the list at an arbitrary position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:623\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_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const ConstArrayListIterator< MemberType, N, A > &other) const\n+Comares to iterators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:591\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n+void advance(difference_type n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:560\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_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n+difference_type distanceTo(const ConstArrayListIterator< T, N, A > &other)\n+const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:655\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\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+Access the element at the current position.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:635\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+void push_back(const_reference entry)\n+Append an entry to the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:478\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n+difference_type distanceTo(const ArrayListIterator< T, N, A > &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:647\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_\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:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+size_type position()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:331\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n+A::value_type MemberType\n+The member type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ArrayListIterator()\n+Standard constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:340\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+A::difference_type difference_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_\n+static constexpr int chunkSize_\n+The number of elements in one chunk of the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+typename A::value_type const & const_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+typename A::value_type & reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:269\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:370\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_\b:_\b:_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_\n+static constexpr int chunkSize_\n+The number of elements in one chunk of the list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:394\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_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+typename A::value_type & reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:385\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_\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+ConstArrayListIterator()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:431\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_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n+A::value_type MemberType\n+The member type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:379\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_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+A::difference_type difference_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:381\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_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+typename A::value_type const & const_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:387\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_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:383\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:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+T value_type\n+Value type for stl compliance.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bh_\bu_\bn_\bk_\bS_\bi_\bz_\be_\b_\n+static constexpr int chunkSize_\n+The number of elements in one chunk of the list. This has to be at least one.\n+The default is 100.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bp_\bo_\bi_\bn_\bt_\be_\br\n+const T * const_pointer\n+The type of a const pointer to the type we store.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ArrayListIterator< MemberType, N, A > iterator\n+A random access iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const T & const_reference\n+The type of a const reference to the type we store.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+T & reference\n+The type of a reference to the type we store.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\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 arraylist.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n+T MemberType\n+The member type that is stored.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+T * pointer\n+The type of a pointer to the type we store.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arraylist.hh:89\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:_\bA_\br_\br_\ba_\by_\bL_\bi_\bs_\bt_\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 arraylist.hh:120\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:434\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/a00194.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00194.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: densematrix.hh File Reference\n+dune-common: binaryfunctions.hh File Reference\n \n \n \n \n \n \n \n@@ -71,72 +71,40 @@\n \n
    \n
    \n
    \n \n-
    densematrix.hh File Reference
    \n+Namespaces
    \n+
    binaryfunctions.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+

    helper classes to provide unique types for standard functions \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+
    #include <algorithm>
    \n
    \n

    Go to the source code of this file.

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

    \n Classes

    struct  Dune::FieldTraits< DenseMatrix< M > >
    struct  Dune::Min< Type >
     
    class  Dune::FMatrixError
     Error thrown if operations of a FieldMatrix fail. More...
     
    class  Dune::DenseMatrix< MAT >
     A dense n x m matrix. More...
    struct  Dune::Max< Type >
     
    \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+

    helper classes to provide unique types for standard functions

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,57 +1,24 @@\n dune-common\u00a02.9.0\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+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+binaryfunctions.hh File Reference\n+helper classes to provide unique types for standard functions _\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:_\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn_\b<_\b _\bT_\by_\bp_\be_\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+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx_\b<_\b _\bT_\by_\bp_\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:_\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+helper classes to provide unique types for standard functions\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/a00194_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00194_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: binaryfunctions.hh Source File\n \n \n \n \n \n \n \n@@ -74,1304 +74,81 @@\n \n
    \n \n
    \n
    \n
    \n-
    densematrix.hh
    \n+
    binaryfunctions.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 (C) 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_BINARYFUNCTIONS_HH
    \n+
    6#define DUNE_BINARYFUNCTIONS_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+
    12#include <algorithm>
    \n+
    13
    \n+
    14namespace Dune
    \n+
    15{
    \n+
    16 template<typename Type>
    \n+
    \n+
    17 struct Min
    \n+
    18 {
    \n+
    19 using first_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n+
    20
    \n+
    21 using second_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n+
    22
    \n+
    23 using result_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \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+
    \n+
    25 Type operator()(const Type& t1, const Type& t2) const
    \n+
    26 {
    \n+
    27 using std::min;
    \n+
    28 return min(t1,t2);
    \n+
    29 }
    \n+
    \n+
    30 };
    \n+
    \n+
    31
    \n+
    32 template<typename Type>
    \n+
    \n+
    33 struct Max
    \n+
    34 {
    \n+
    35 using first_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \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-
    Implements a scalar vector view wrapper around an existing scalar.
    \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-
    Macro for wrapping boundary checks.
    \n-
    Implements a vector constructed from a given type representing a field and a compile-time given size.
    \n-
    Traits for type conversions and type information.
    \n-
    Various precision settings for calculations with FieldMatrix and FieldVector.
    \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:558
    \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+
    37 using second_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n+
    38
    \n+
    39 using result_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
    \n+
    40
    \n+
    \n+
    41 Type operator()(const Type& t1, const Type& t2) const
    \n+
    42 {
    \n+
    43 using std::max;
    \n+
    44 return max(t1,t2);
    \n+
    45 }
    \n+
    \n+
    46 };
    \n+
    \n+
    47}
    \n+
    48
    \n+
    49#endif
    \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:95
    \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+
    Definition binaryfunctions.hh:18
    \n+
    Type result_type
    Definition binaryfunctions.hh:23
    \n+
    Type operator()(const Type &t1, const Type &t2) const
    Definition binaryfunctions.hh:25
    \n+
    Type first_argument_type
    Definition binaryfunctions.hh:19
    \n+
    Type second_argument_type
    Definition binaryfunctions.hh:21
    \n+
    Definition binaryfunctions.hh:34
    \n+
    Type operator()(const Type &t1, const Type &t2) const
    Definition binaryfunctions.hh:41
    \n+
    Type result_type
    Definition binaryfunctions.hh:39
    \n+
    Type first_argument_type
    Definition binaryfunctions.hh:35
    \n+
    Type second_argument_type
    Definition binaryfunctions.hh:37
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1521 +1,93 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-densematrix.hh\n+binaryfunctions.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 (C) 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_BINARYFUNCTIONS_HH\n+6#define DUNE_BINARYFUNCTIONS_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+12#include \n+13\n+14namespace _\bD_\bu_\bn_\be\n+15{\n+16 template\n+_\b1_\b7 struct _\bM_\bi_\bn\n+18 {\n+_\b1_\b9 using _\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n+following similar deprecations in C++17\")]] = Type;\n+20\n+_\b2_\b1 using _\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n+following similar deprecations in C++17\")]] = Type;\n+22\n+_\b2_\b3 using _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated following\n+similar deprecations in C++17\")]] = Type;\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+_\b2_\b5 Type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Type& t1, const Type& t2) const\n+26 {\n+27 using std::min;\n+28 return min(t1,t2);\n+29 }\n+30 };\n+31\n+32 template\n+_\b3_\b3 struct _\bM_\ba_\bx\n+34 {\n+_\b3_\b5 using _\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n+following similar deprecations in C++17\")]] = Type;\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:558\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+_\b3_\b7 using _\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated\n+following similar deprecations in C++17\")]] = Type;\n+38\n+_\b3_\b9 using _\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be [[deprecated(\"This type alias is deprecated following\n+similar deprecations in C++17\")]] = Type;\n+40\n+_\b4_\b1 Type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const Type& t1, const Type& t2) const\n+42 {\n+43 using std::max;\n+44 return max(t1,t2);\n+45 }\n+46 };\n+47}\n+48\n+49#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:_\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:95\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_\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_\bi_\bn_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be\n+Type result_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+Type operator()(const Type &t1, const Type &t2) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n+Type first_argument_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bi_\bn_\b:_\b:_\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n+Type second_argument_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:21\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:_\bM_\ba_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+Type operator()(const Type &t1, const Type &t2) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx_\b:_\b:_\br_\be_\bs_\bu_\bl_\bt_\b__\bt_\by_\bp_\be\n+Type result_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx_\b:_\b:_\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n+Type first_argument_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bx_\b:_\b:_\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt_\b__\bt_\by_\bp_\be\n+Type second_argument_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn binaryfunctions.hh:37\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/a00197.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00197.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: poolallocator.hh File Reference\n \n \n \n \n \n \n \n@@ -71,40 +71,85 @@\n \n
    \n
    \n
    \n \n-
    ios_state.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    poolallocator.hh File Reference
    \n
    \n
    \n \n-

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

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

    \n-
    #include <ios>
    \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

    class  Dune::ios_base_all_saver
     Utility class for storing and resetting stream attributes. 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+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-

    Utility class for storing and resetting stream attributes.

    \n-
    Author
    Markus Blatt
    \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,26 +1,77 @@\n dune-common\u00a02.9.0\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-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+_\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-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+ 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+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-Utility class for storing and resetting stream attributes.\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/a00197_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00197_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: poolallocator.hh Source File\n \n \n \n \n \n \n \n@@ -74,55 +74,519 @@\n \n
    \n \n
    \n
    \n
    \n-
    ios_state.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 (C) 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_POOLALLOCATOR_HH
    \n+
    6#define DUNE_COMMON_POOLALLOCATOR_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+
    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-
    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#endif // DUNE_COMMON_IOS_STATE_HH
    \n-
    ~ios_base_all_saver()
    Destructor that restores the flags stored by the constructor.
    Definition ios_state.cc:24
    \n-
    void restore()
    Restore flags now.
    Definition ios_state.cc:29
    \n-
    std::ios_base state_type
    Export type of object we save the state for.
    Definition ios_state.hh:37
    \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:237
    \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:259
    \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+
    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,60 +1,597 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-ios_state.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 (C) 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_POOLALLOCATOR_HH\n+6#define DUNE_COMMON_POOLALLOCATOR_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+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:237\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:259\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:_\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/a00200.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00200.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: overloadset.hh File Reference\n+dune-common: mpicommunication.hh File Reference\n \n \n \n \n \n \n \n@@ -65,47 +65,114 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n-
    overloadset.hh File Reference
    \n+
    mpicommunication.hh File Reference
    \n
    \n
    \n-
    #include <utility>
    \n-#include <type_traits>
    \n-#include <dune/common/typetraits.hh>
    \n+\n+

    Implements an utility class that provides MPI's collective communication methods. \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
    \n

    Go to the source code of this file.

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

    \n+Classes

    class  Dune::Generic_MPI_Op< Type, BinaryFunction, Enable >
     
    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 Functions

    template<class... F>
    auto Dune::overload (F &&... f)
     Create an overload set.
     
    template<class... F>
    auto Dune::orderedOverload (F &&... f)
     Create an ordered overload set.
     
     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+

    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,27 +1,69 @@\n dune-common\u00a02.9.0\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-overloadset.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+ * _\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_\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 <_\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 _\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+\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+\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-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bv_\be_\br_\bl_\bo_\ba_\bd (F &&... f)\n-\u00a0 Create an overload set.\n-\u00a0\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\br_\bd_\be_\br_\be_\bd_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd (F &&... f)\n-\u00a0 Create an ordered overload set.\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+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/a00200_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: overloadset.hh Source File\n+dune-common: mpicommunication.hh Source File\n \n \n \n \n \n \n \n@@ -70,143 +70,579 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n-
    overloadset.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 (C) 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_OVERLOADSET_HH
    \n-
    6#define DUNE_COMMON_OVERLOADSET_HH
    \n+
    5#ifndef DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH
    \n+
    6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH
    \n
    7
    \n-
    8#include <utility>
    \n-
    9#include <type_traits>
    \n-\n-
    11
    \n-
    12namespace Dune {
    \n-
    13
    \n-
    14namespace Impl {
    \n-
    15
    \n-
    16 template<typename... F>
    \n-
    17 class OverloadSet
    \n-
    18 : public F...
    \n-
    19 {
    \n-
    20
    \n-
    21 public:
    \n-
    22
    \n-
    23 template<typename... FF>
    \n-
    24 OverloadSet(FF&&... ff)
    \n-
    25 : F(std::forward<FF>(ff))...
    \n-
    26 {}
    \n-
    27
    \n-
    28 using F::operator()...;
    \n-
    29
    \n-
    30 };
    \n-
    31
    \n-
    32} // end namespace Impl
    \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
    \n-
    60template<class... F>
    \n-
    \n-
    61auto overload(F&&... f)
    \n-
    62{
    \n-
    63 return Impl::OverloadSet<std::decay_t<F>...>(std::forward<F>(f)...);
    \n-
    64}
    \n-
    \n-
    65
    \n-
    66
    \n-
    67
    \n-
    68namespace Impl {
    \n-
    69
    \n-
    70 template<class F0, class... F>
    \n-
    71 class OrderedOverloadSet: public OrderedOverloadSet<F...>, F0
    \n-
    72 {
    \n-
    73 using Base = OrderedOverloadSet<F...>;
    \n-
    74 public:
    \n-
    75
    \n-
    76 template<class FF0, class... FF>
    \n-
    77 OrderedOverloadSet(FF0&& f0, FF&&... ff) :
    \n-
    78 Base(std::forward<FF>(ff)...),
    \n-
    79 F0(std::forward<FF0>(f0))
    \n-
    80 {}
    \n-
    81
    \n-
    82 // Forward to operator() of F0 if it can be called with the given arguments.
    \n-
    83 template<class... Args,
    \n-
    84 std::enable_if_t<IsCallable<F0(Args&&...)>::value, int> = 0>
    \n-
    85 decltype(auto) operator()(Args&&... args)
    \n-
    86 {
    \n-
    87 return F0::operator()(std::forward<Args>(args)...);
    \n-
    88 }
    \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 // Forward to operator() of base class if F0 cannot be called with the given
    \n-
    91 // arguments. In this case the base class will successively try operator()
    \n-
    92 // of all F... .
    \n-
    93 template<class... Args,
    \n-
    94 std::enable_if_t<not IsCallable<F0(Args&&...)>::value, int> = 0>
    \n-
    95 decltype(auto) operator()(Args&&... args)
    \n-
    96 {
    \n-
    97 return Base::operator()(std::forward<Args>(args)...);
    \n-
    98 }
    \n-
    99
    \n-
    100 };
    \n-
    101
    \n-
    102 template<class F0>
    \n-
    103 class OrderedOverloadSet<F0>: public F0
    \n-
    104 {
    \n-
    105 public:
    \n-
    106
    \n-
    107 template<class FF0>
    \n-
    108 OrderedOverloadSet(FF0&& f0) :
    \n-
    109 F0(std::forward<FF0>(f0))
    \n-
    110 {}
    \n-
    111
    \n-
    112 // Forward to operator() of F0. If it cannot be called with
    \n-
    113 // the given arguments a static assertion will fail.
    \n-
    114 template<class... Args>
    \n-
    115 decltype(auto) operator()(Args&&... args)
    \n-
    116 {
    \n-
    117 static_assert(IsCallable<F0(Args&&...)>::value,
    \n-
    118 "No matching overload found in OrderedOverloadSet");
    \n-
    119 return F0::operator()(std::forward<Args>(args)...);
    \n-
    120 }
    \n-
    121 };
    \n-
    122
    \n-
    123} // end namespace Impl
    \n-
    124
    \n-
    125
    \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-
    149template<class... F>
    \n+
    \n+
    128 int rank () const
    \n+
    129 {
    \n+
    130 return me;
    \n+
    131 }
    \n+
    \n+
    132
    \n+
    \n+
    134 int size () const
    \n+
    135 {
    \n+
    136 return procs;
    \n+
    137 }
    \n+
    \n+
    138
    \n+
    140 template<class T>
    \n+
    \n+
    141 int send(const T& data, int dest_rank, int tag) const
    \n+
    142 {
    \n+
    143 auto mpi_data = getMPIData(data);
    \n+
    144 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n+
    145 dest_rank, tag, communicator);
    \n+
    146 }
    \n+
    \n+
    147
    \n+
    149 template<class T>
    \n
    \n-
    150auto orderedOverload(F&&... f)
    \n-
    151{
    \n-
    152 return Impl::OrderedOverloadSet<std::decay_t<F>...>(std::forward<F>(f)...);
    \n-
    153}
    \n-
    \n-
    154
    \n-
    155
    \n-
    156
    \n-
    157} // end namespace Dune
    \n+
    150 MPIFuture<const T> isend(const T&& data, int dest_rank, int tag) const
    \n+
    151 {
    \n+
    152 MPIFuture<const T> future(std::forward<const T>(data));
    \n+
    153 auto mpidata = future.get_mpidata();
    \n+
    154 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n+
    155 dest_rank, tag, communicator, &future.req_);
    \n+
    156 return future;
    \n+
    157 }
    \n+
    \n
    158
    \n-
    159#endif // DUNE_COMMON_OVERLOADSET_HH
    \n-
    Traits for type conversions and type information.
    \n-
    auto orderedOverload(F &&... f)
    Create an ordered overload set.
    Definition overloadset.hh:150
    \n-
    auto overload(F &&... f)
    Create an overload set.
    Definition overloadset.hh:61
    \n-
    STL namespace.
    \n+
    160 template<class T>
    \n+
    \n+
    161 T recv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n+
    162 {
    \n+
    163 T lvalue_data(std::forward<T>(data));
    \n+
    164 auto mpi_data = getMPIData(lvalue_data);
    \n+
    165 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
    \n+
    166 source_rank, tag, communicator, status);
    \n+
    167 return lvalue_data;
    \n+
    168 }
    \n+
    \n+
    169
    \n+
    171 template<class T>
    \n+
    \n+
    172 MPIFuture<T> irecv(T&& data, int source_rank, int tag) const
    \n+
    173 {
    \n+
    174 MPIFuture<T> future(std::forward<T>(data));
    \n+
    175 auto mpidata = future.get_mpidata();
    \n+
    176 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),
    \n+
    177 source_rank, tag, communicator, &future.req_);
    \n+
    178 return future;
    \n+
    179 }
    \n+
    \n+
    180
    \n+
    181 template<class T>
    \n+
    \n+
    182 T rrecv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
    \n+
    183 {
    \n+
    184 MPI_Status _status;
    \n+
    185 MPI_Message _message;
    \n+
    186 T lvalue_data(std::forward<T>(data));
    \n+
    187 auto mpi_data = getMPIData(lvalue_data);
    \n+
    188 static_assert(!mpi_data.static_size, "rrecv work only for non-static-sized types.");
    \n+
    189 if(status == MPI_STATUS_IGNORE)
    \n+
    190 status = &_status;
    \n+
    191 MPI_Mprobe(source_rank, tag, communicator, &_message, status);
    \n+
    192 int size;
    \n+
    193 MPI_Get_count(status, mpi_data.type(), &size);
    \n+
    194 mpi_data.resize(size);
    \n+
    195 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message, status);
    \n+
    196 return lvalue_data;
    \n+
    197 }
    \n+
    \n+
    198
    \n+
    200 template<typename T>
    \n+
    \n+
    201 T sum (const T& in) const
    \n+
    202 {
    \n+
    203 T out;
    \n+
    204 allreduce<std::plus<T> >(&in,&out,1);
    \n+
    205 return out;
    \n+
    206 }
    \n+
    \n+
    207
    \n+
    209 template<typename T>
    \n+
    \n+
    210 int sum (T* inout, int len) const
    \n+
    211 {
    \n+
    212 return allreduce<std::plus<T> >(inout,len);
    \n+
    213 }
    \n+
    \n+
    214
    \n+
    216 template<typename T>
    \n+
    \n+
    217 T prod (const T& in) const
    \n+
    218 {
    \n+
    219 T out;
    \n+
    220 allreduce<std::multiplies<T> >(&in,&out,1);
    \n+
    221 return out;
    \n+
    222 }
    \n+
    \n+
    223
    \n+
    225 template<typename T>
    \n+
    \n+
    226 int prod (T* inout, int len) const
    \n+
    227 {
    \n+
    228 return allreduce<std::multiplies<T> >(inout,len);
    \n+
    229 }
    \n+
    \n+
    230
    \n+
    232 template<typename T>
    \n+
    \n+
    233 T min (const T& in) const
    \n+
    234 {
    \n+
    235 T out;
    \n+
    236 allreduce<Min<T> >(&in,&out,1);
    \n+
    237 return out;
    \n+
    238 }
    \n+
    \n+
    239
    \n+
    241 template<typename T>
    \n+
    \n+
    242 int min (T* inout, int len) const
    \n+
    243 {
    \n+
    244 return allreduce<Min<T> >(inout,len);
    \n+
    245 }
    \n+
    \n+
    246
    \n+
    247
    \n+
    249 template<typename T>
    \n+
    \n+
    250 T max (const T& in) const
    \n+
    251 {
    \n+
    252 T out;
    \n+
    253 allreduce<Max<T> >(&in,&out,1);
    \n+
    254 return out;
    \n+
    255 }
    \n+
    \n+
    256
    \n+
    258 template<typename T>
    \n+
    \n+
    259 int max (T* inout, int len) const
    \n+
    260 {
    \n+
    261 return allreduce<Max<T> >(inout,len);
    \n+
    262 }
    \n+
    \n+
    263
    \n+
    \n+
    265 int barrier () const
    \n+
    266 {
    \n+
    267 return MPI_Barrier(communicator);
    \n+
    268 }
    \n+
    \n+
    269
    \n+
    \n+\n+
    272 {
    \n+
    273 MPIFuture<void> future(true); // make a valid MPIFuture<void>
    \n+
    274 MPI_Ibarrier(communicator, &future.req_);
    \n+
    275 return future;
    \n+
    276 }
    \n+
    \n+
    277
    \n+
    278
    \n+
    280 template<typename T>
    \n+
    \n+
    281 int broadcast (T* inout, int len, int root) const
    \n+
    282 {
    \n+
    283 return MPI_Bcast(inout,len,MPITraits<T>::getType(),root,communicator);
    \n+
    284 }
    \n+
    \n+
    285
    \n+
    287 template<class T>
    \n+
    \n+
    288 MPIFuture<T> ibroadcast(T&& data, int root) const{
    \n+
    289 MPIFuture<T> future(std::forward<T>(data));
    \n+
    290 auto mpidata = future.get_mpidata();
    \n+
    291 MPI_Ibcast(mpidata.ptr(),
    \n+
    292 mpidata.size(),
    \n+
    293 mpidata.type(),
    \n+
    294 root,
    \n+
    295 communicator,
    \n+
    296 &future.req_);
    \n+
    297 return future;
    \n+
    298 }
    \n+
    \n+
    299
    \n+
    302 template<typename T>
    \n+
    \n+
    303 int gather (const T* in, T* out, int len, int root) const
    \n+
    304 {
    \n+
    305 return MPI_Gather(const_cast<T*>(in),len,MPITraits<T>::getType(),
    \n+
    306 out,len,MPITraits<T>::getType(),
    \n+
    307 root,communicator);
    \n+
    308 }
    \n+
    \n+
    309
    \n+
    311 template<class TIN, class TOUT = std::vector<TIN>>
    \n+
    \n+
    312 MPIFuture<TOUT, TIN> igather(TIN&& data_in, TOUT&& data_out, int root) const{
    \n+
    313 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    314 auto mpidata_in = future.get_send_mpidata();
    \n+
    315 auto mpidata_out = future.get_mpidata();
    \n+
    316 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());
    \n+
    317 int outlen = (me==root) * mpidata_in.size();
    \n+
    318 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n+
    319 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n+
    320 root, communicator, &future.req_);
    \n+
    321 return future;
    \n+
    322 }
    \n+
    \n+
    323
    \n+
    325 template<typename T>
    \n+
    \n+
    326 int gatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ, int root) const
    \n+
    327 {
    \n+
    328 return MPI_Gatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n+
    329 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n+
    330 root,communicator);
    \n+
    331 }
    \n+
    \n+
    332
    \n+
    335 template<typename T>
    \n+
    \n+
    336 int scatter (const T* sendData, T* recvData, int len, int root) const
    \n+
    337 {
    \n+
    338 return MPI_Scatter(const_cast<T*>(sendData),len,MPITraits<T>::getType(),
    \n+
    339 recvData,len,MPITraits<T>::getType(),
    \n+
    340 root,communicator);
    \n+
    341 }
    \n+
    \n+
    342
    \n+
    344 template<class TIN, class TOUT = TIN>
    \n+
    \n+
    345 MPIFuture<TOUT, TIN> iscatter(TIN&& data_in, TOUT&& data_out, int root) const
    \n+
    346 {
    \n+
    347 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    348 auto mpidata_in = future.get_send_mpidata();
    \n+
    349 auto mpidata_out = future.get_mpidata();
    \n+
    350 int inlen = (me==root) * mpidata_in.size()/procs;
    \n+
    351 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),
    \n+
    352 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),
    \n+
    353 root, communicator, &future.req_);
    \n+
    354 return future;
    \n+
    355 }
    \n+
    \n+
    356
    \n+
    358 template<typename T>
    \n+
    \n+
    359 int scatterv (const T* sendData, int* sendDataLen, int* displ, T* recvData, int recvDataLen, int root) const
    \n+
    360 {
    \n+
    361 return MPI_Scatterv(const_cast<T*>(sendData),sendDataLen,displ,MPITraits<T>::getType(),
    \n+
    362 recvData,recvDataLen,MPITraits<T>::getType(),
    \n+
    363 root,communicator);
    \n+
    364 }
    \n+
    \n+
    365
    \n+
    366
    \n+
    \n+
    367 operator MPI_Comm () const
    \n+
    368 {
    \n+
    369 return communicator;
    \n+
    370 }
    \n+
    \n+
    371
    \n+
    373 template<typename T, typename T1>
    \n+
    \n+
    374 int allgather(const T* sbuf, int count, T1* rbuf) const
    \n+
    375 {
    \n+
    376 return MPI_Allgather(const_cast<T*>(sbuf), count, MPITraits<T>::getType(),
    \n+
    377 rbuf, count, MPITraits<T1>::getType(),
    \n+
    378 communicator);
    \n+
    379 }
    \n+
    \n+
    380
    \n+
    382 template<class TIN, class TOUT = TIN>
    \n+
    \n+
    383 MPIFuture<TOUT, TIN> iallgather(TIN&& data_in, TOUT&& data_out) const
    \n+
    384 {
    \n+
    385 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    386 auto mpidata_in = future.get_send_mpidata();
    \n+
    387 auto mpidata_out = future.get_mpidata();
    \n+
    388 assert(mpidata_in.size()*procs <= mpidata_out.size());
    \n+
    389 int outlen = mpidata_in.size();
    \n+
    390 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
    \n+
    391 mpidata_out.ptr(), outlen, mpidata_out.type(),
    \n+
    392 communicator, &future.req_);
    \n+
    393 return future;
    \n+
    394 }
    \n+
    \n+
    395
    \n+
    397 template<typename T>
    \n+
    \n+
    398 int allgatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ) const
    \n+
    399 {
    \n+
    400 return MPI_Allgatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
    \n+
    401 out,recvDataLen,displ,MPITraits<T>::getType(),
    \n+
    402 communicator);
    \n+
    403 }
    \n+
    \n+
    404
    \n+
    406 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    407 int allreduce(Type* inout, int len) const
    \n+
    408 {
    \n+
    409 Type* out = new Type[len];
    \n+
    410 int ret = allreduce<BinaryFunction>(inout,out,len);
    \n+
    411 std::copy(out, out+len, inout);
    \n+
    412 delete[] out;
    \n+
    413 return ret;
    \n+
    414 }
    \n+
    \n+
    415
    \n+
    416 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    417 Type allreduce(Type&& in) const{
    \n+
    418 Type lvalue_data = std::forward<Type>(in);
    \n+
    419 auto data = getMPIData(lvalue_data);
    \n+
    420 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),
    \n+\n+
    422 communicator);
    \n+
    423 return lvalue_data;
    \n+
    424 }
    \n+
    \n+
    425
    \n+
    427 template<class BinaryFunction, class TIN, class TOUT = TIN>
    \n+
    \n+
    428 MPIFuture<TOUT, TIN> iallreduce(TIN&& data_in, TOUT&& data_out) const {
    \n+
    429 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
    \n+
    430 auto mpidata_in = future.get_send_mpidata();
    \n+
    431 auto mpidata_out = future.get_mpidata();
    \n+
    432 assert(mpidata_out.size() == mpidata_in.size());
    \n+
    433 assert(mpidata_out.type() == mpidata_in.type());
    \n+
    434 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),
    \n+
    435 mpidata_out.size(), mpidata_out.type(),
    \n+\n+
    437 communicator, &future.req_);
    \n+
    438 return future;
    \n+
    439 }
    \n+
    \n+
    440
    \n+
    442 template<class BinaryFunction, class T>
    \n+
    \n+
    443 MPIFuture<T> iallreduce(T&& data) const{
    \n+
    444 MPIFuture<T> future(std::forward<T>(data));
    \n+
    445 auto mpidata = future.get_mpidata();
    \n+
    446 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),
    \n+
    447 mpidata.size(), mpidata.type(),
    \n+\n+
    449 communicator, &future.req_);
    \n+
    450 return future;
    \n+
    451 }
    \n+
    \n+
    452
    \n+
    454 template<typename BinaryFunction, typename Type>
    \n+
    \n+
    455 int allreduce(const Type* in, Type* out, int len) const
    \n+
    456 {
    \n+
    457 return MPI_Allreduce(const_cast<Type*>(in), out, len, MPITraits<Type>::getType(),
    \n+\n+
    459 }
    \n+
    \n+
    460
    \n+
    461 private:
    \n+
    462 MPI_Comm communicator;
    \n+
    463 int me;
    \n+
    464 int procs;
    \n+
    465 };
    \n+
    \n+
    466} // namespace dune
    \n+
    467
    \n+
    468#endif // HAVE_MPI
    \n+
    469
    \n+
    470#endif
    \n+
    helper classes to provide unique types for standard functions
    \n+
    #define ComposeMPIOp(func, op)
    Definition mpicommunication.hh:77
    \n+
    Traits classes for mapping types onto MPI_Datatype.
    \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+
    A few common exception classes.
    \n+
    #define DUNE_THROW(E, m)
    Definition exceptions.hh:218
    \n
    Dune namespace.
    Definition alignedallocator.hh:13
    \n+
    auto getMPIData(T &t)
    Definition mpidata.hh:43
    \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+
    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:259
    \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:398
    \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:250
    \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:288
    \n+
    MPIFuture< void > ibarrier() const
    Nonblocking barrier.
    Definition mpicommunication.hh:271
    \n+
    MPIFuture< const T > isend(const T &&data, int dest_rank, int tag) const
    Sends the data to the dest_rank nonblocking.
    Definition mpicommunication.hh:150
    \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:161
    \n+
    int barrier() const
    Wait until all processes have arrived at this point in the program.
    Definition mpicommunication.hh:265
    \n+
    int rank() const
    Return rank, is between 0 and size()-1.
    Definition mpicommunication.hh:128
    \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:359
    \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:383
    \n+
    Type allreduce(Type &&in) const
    Definition mpicommunication.hh:417
    \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:210
    \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:281
    \n+
    MPIFuture< T > iallreduce(T &&data) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:443
    \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:201
    \n+
    int allreduce(const Type *in, Type *out, int len) const
    Definition mpicommunication.hh:455
    \n+
    MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const
    Compute something over all processes nonblocking.
    Definition mpicommunication.hh:428
    \n+
    int size() const
    Number of processes in set, is greater than 0.
    Definition mpicommunication.hh:134
    \n+
    int gather(const T *in, T *out, int len, int root) const
    Gather arrays on root task.
    Definition mpicommunication.hh:303
    \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:407
    \n+
    T rrecv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
    Definition mpicommunication.hh:182
    \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:336
    \n+
    MPIFuture< T > irecv(T &&data, int source_rank, int tag) const
    Receives the data from the source_rank nonblocking.
    Definition mpicommunication.hh:172
    \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:226
    \n+
    MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const
    Gather arrays on root task nonblocking.
    Definition mpicommunication.hh:312
    \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:233
    \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:345
    \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:326
    \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:242
    \n+
    int allgather(const T *sbuf, int count, T1 *rbuf) const
    Gathers data from all tasks and distribute it to all.
    Definition mpicommunication.hh:374
    \n+
    int send(const T &data, int dest_rank, int tag) const
    Sends the data to the dest_rank.
    Definition mpicommunication.hh:141
    \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:217
    \n+
    Provides a future-like object for MPI communication. It contains the object that will be received and...
    Definition mpifuture.hh:85
    \n+
    auto get_send_mpidata()
    Definition mpifuture.hh:169
    \n+
    auto get_mpidata()
    Definition mpifuture.hh:165
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,139 +1,664 @@\n dune-common\u00a02.9.0\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bc_\bo_\bm_\bm_\bo_\bn\n-overloadset.hh\n+ * _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl\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 (C) 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_OVERLOADSET_HH\n-6#define DUNE_COMMON_OVERLOADSET_HH\n+5#ifndef DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH\n+6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH\n 7\n-8#include \n-9#include \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-12namespace _\bD_\bu_\bn_\be {\n-13\n-14namespace Impl {\n-15\n-16 template\n-17 class OverloadSet\n-18 : public F...\n-19 {\n-20\n-21 public:\n-22\n-23 template\n-24 OverloadSet(FF&&... ff)\n-25 : F(_\bs_\bt_\bd::forward(ff))...\n-26 {}\n-27\n-28 using F::operator()...;\n-29\n-30 };\n-31\n-32} // end namespace Impl\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\n-60template\n-_\b6_\b1auto _\bo_\bv_\be_\br_\bl_\bo_\ba_\bd(F&&... f)\n-62{\n-63 return Impl::OverloadSet...>(std::forward(f)...);\n-64}\n-65\n-66\n-67\n-68namespace Impl {\n-69\n-70 template\n-71 class OrderedOverloadSet: public OrderedOverloadSet, F0\n-72 {\n-73 using Base = OrderedOverloadSet;\n-74 public:\n-75\n-76 template\n-77 OrderedOverloadSet(FF0&& f0, FF&&... ff) :\n-78 Base(_\bs_\bt_\bd::forward(ff)...),\n-79 F0(_\bs_\bt_\bd::forward(f0))\n-80 {}\n-81\n-82 // Forward to operator() of F0 if it can be called with the given arguments.\n-83 template::value, int> = 0>\n-85 decltype(auto) operator()(Args&&... args)\n-86 {\n-87 return F0::operator()(std::forward(args)...);\n-88 }\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-90 // Forward to operator() of base class if F0 cannot be called with the given\n-91 // arguments. In this case the base class will successively try operator()\n-92 // of all F... .\n-93 template::value, int> = 0>\n-95 decltype(auto) operator()(Args&&... args)\n-96 {\n-97 return Base::operator()(std::forward(args)...);\n-98 }\n-99\n-100 };\n-101\n-102 template\n-103 class OrderedOverloadSet: public F0\n-104 {\n-105 public:\n-106\n-107 template\n-108 OrderedOverloadSet(FF0&& f0) :\n-109 F0(_\bs_\bt_\bd::forward(f0))\n-110 {}\n-111\n-112 // Forward to operator() of F0. If it cannot be called with\n-113 // the given arguments a static assertion will fail.\n-114 template\n-115 decltype(auto) operator()(Args&&... args)\n-116 {\n-117 static_assert(IsCallable::value,\n-118 \"No matching overload found in OrderedOverloadSet\");\n-119 return F0::operator()(std::forward(args)...);\n-120 }\n-121 };\n-122\n-123} // end namespace Impl\n-124\n-125\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-149template\n-_\b1_\b5_\b0auto _\bo_\br_\bd_\be_\br_\be_\bd_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd(F&&... f)\n-151{\n-152 return Impl::OrderedOverloadSet...>(std::forward(f)...);\n-153}\n-154\n-155\n-156\n-157} // end namespace Dune\n+_\b1_\b2_\b8 int _\br_\ba_\bn_\bk () const\n+129 {\n+130 return me;\n+131 }\n+132\n+_\b1_\b3_\b4 int _\bs_\bi_\bz_\be () const\n+135 {\n+136 return procs;\n+137 }\n+138\n+140 template\n+_\b1_\b4_\b1 int _\bs_\be_\bn_\bd(const T& data, int dest_rank, int tag) const\n+142 {\n+143 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(data);\n+144 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n+145 dest_rank, tag, communicator);\n+146 }\n+147\n+149 template\n+_\b1_\b5_\b0 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bT_\b> _\bi_\bs_\be_\bn_\bd(const T&& data, int dest_rank, int tag) const\n+151 {\n+152 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bT_\b> future(std::forward(data));\n+153 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+154 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),\n+155 dest_rank, tag, communicator, &future.req_);\n+156 return future;\n+157 }\n 158\n-159#endif // DUNE_COMMON_OVERLOADSET_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_\b:_\b:_\bo_\br_\bd_\be_\br_\be_\bd_\bO_\bv_\be_\br_\bl_\bo_\ba_\bd\n-auto orderedOverload(F &&... f)\n-Create an ordered overload set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overloadset.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bv_\be_\br_\bl_\bo_\ba_\bd\n-auto overload(F &&... f)\n-Create an overload set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overloadset.hh:61\n-_\bs_\bt_\bd\n-STL namespace.\n+160 template\n+_\b1_\b6_\b1 T _\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n+MPI_STATUS_IGNORE) const\n+162 {\n+163 T lvalue_data(std::forward(data));\n+164 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n+165 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),\n+166 source_rank, tag, communicator, status);\n+167 return lvalue_data;\n+168 }\n+169\n+171 template\n+_\b1_\b7_\b2 _\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+173 {\n+174 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n+175 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+176 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),\n+177 source_rank, tag, communicator, &future.req_);\n+178 return future;\n+179 }\n+180\n+181 template\n+_\b1_\b8_\b2 T _\br_\br_\be_\bc_\bv(T&& data, int source_rank, int tag, MPI_Status* status =\n+MPI_STATUS_IGNORE) const\n+183 {\n+184 MPI_Status _status;\n+185 MPI_Message _message;\n+186 T lvalue_data(std::forward(data));\n+187 auto mpi_data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n+188 static_assert(!mpi_data.static_size, \"rrecv work only for non-static-sized\n+types.\");\n+189 if(status == MPI_STATUS_IGNORE)\n+190 status = &_status;\n+191 MPI_Mprobe(source_rank, tag, communicator, &_message, status);\n+192 int _\bs_\bi_\bz_\be;\n+193 MPI_Get_count(status, mpi_data.type(), &_\bs_\bi_\bz_\be);\n+194 mpi_data.resize(_\bs_\bi_\bz_\be);\n+195 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message,\n+status);\n+196 return lvalue_data;\n+197 }\n+198\n+200 template\n+_\b2_\b0_\b1 T _\bs_\bu_\bm (const T& in) const\n+202 {\n+203 T out;\n+204 allreduce >(&in,&out,1);\n+205 return out;\n+206 }\n+207\n+209 template\n+_\b2_\b1_\b0 int _\bs_\bu_\bm (T* inout, int len) const\n+211 {\n+212 return allreduce >(inout,len);\n+213 }\n+214\n+216 template\n+_\b2_\b1_\b7 T _\bp_\br_\bo_\bd (const T& in) const\n+218 {\n+219 T out;\n+220 allreduce >(&in,&out,1);\n+221 return out;\n+222 }\n+223\n+225 template\n+_\b2_\b2_\b6 int _\bp_\br_\bo_\bd (T* inout, int len) const\n+227 {\n+228 return allreduce >(inout,len);\n+229 }\n+230\n+232 template\n+_\b2_\b3_\b3 T _\bm_\bi_\bn (const T& in) const\n+234 {\n+235 T out;\n+236 allreduce >(&in,&out,1);\n+237 return out;\n+238 }\n+239\n+241 template\n+_\b2_\b4_\b2 int _\bm_\bi_\bn (T* inout, int len) const\n+243 {\n+244 return allreduce >(inout,len);\n+245 }\n+246\n+247\n+249 template\n+_\b2_\b5_\b0 T _\bm_\ba_\bx (const T& in) const\n+251 {\n+252 T out;\n+253 allreduce >(&in,&out,1);\n+254 return out;\n+255 }\n+256\n+258 template\n+_\b2_\b5_\b9 int _\bm_\ba_\bx (T* inout, int len) const\n+260 {\n+261 return allreduce >(inout,len);\n+262 }\n+263\n+_\b2_\b6_\b5 int _\bb_\ba_\br_\br_\bi_\be_\br () const\n+266 {\n+267 return MPI_Barrier(communicator);\n+268 }\n+269\n+_\b2_\b7_\b1 _\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+272 {\n+273 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bv_\bo_\bi_\bd_\b> future(true); // make a valid MPIFuture\n+274 MPI_Ibarrier(communicator, &future.req_);\n+275 return future;\n+276 }\n+277\n+278\n+280 template\n+_\b2_\b8_\b1 int _\bb_\br_\bo_\ba_\bd_\bc_\ba_\bs_\bt (T* inout, int len, int root) const\n+282 {\n+283 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+284 }\n+285\n+287 template\n+_\b2_\b8_\b8 _\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+289 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n+290 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+291 MPI_Ibcast(mpidata.ptr(),\n+292 mpidata.size(),\n+293 mpidata.type(),\n+294 root,\n+295 communicator,\n+296 &future.req_);\n+297 return future;\n+298 }\n+299\n+302 template\n+_\b3_\b0_\b3 int _\bg_\ba_\bt_\bh_\be_\br (const T* in, T* out, int len, int root) const\n+304 {\n+305 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+306 out,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+307 root,communicator);\n+308 }\n+309\n+311 template>\n+_\b3_\b1_\b2 _\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+313 _\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+314 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+315 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+316 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());\n+317 int outlen = (me==root) * mpidata_in.size();\n+318 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n+319 mpidata_out.ptr(), outlen, mpidata_out.type(),\n+320 root, communicator, &future.req_);\n+321 return future;\n+322 }\n+323\n+325 template\n+_\b3_\b2_\b6 int _\bg_\ba_\bt_\bh_\be_\br_\bv (const T* in, int sendDataLen, T* out, int* recvDataLen, int*\n+displ, int root) const\n+327 {\n+328 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+329 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+330 root,communicator);\n+331 }\n+332\n+335 template\n+_\b3_\b3_\b6 int _\bs_\bc_\ba_\bt_\bt_\be_\br (const T* sendData, T* recvData, int len, int root) const\n+337 {\n+338 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+339 recvData,len,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+340 root,communicator);\n+341 }\n+342\n+344 template\n+_\b3_\b4_\b5 _\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+346 {\n+347 _\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+348 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+349 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+350 int inlen = (me==root) * mpidata_in.size()/procs;\n+351 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),\n+352 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),\n+353 root, communicator, &future.req_);\n+354 return future;\n+355 }\n+356\n+358 template\n+_\b3_\b5_\b9 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+360 {\n+361 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+362 recvData,recvDataLen,_\bM_\bP_\bI_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bg_\be_\bt_\bT_\by_\bp_\be(),\n+363 root,communicator);\n+364 }\n+365\n+366\n+_\b3_\b6_\b7 operator MPI_Comm () const\n+368 {\n+369 return communicator;\n+370 }\n+371\n+373 template\n+_\b3_\b7_\b4 int _\ba_\bl_\bl_\bg_\ba_\bt_\bh_\be_\br(const T* sbuf, int count, T1* rbuf) const\n+375 {\n+376 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+377 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+378 communicator);\n+379 }\n+380\n+382 template\n+_\b3_\b8_\b3 _\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+384 {\n+385 _\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+386 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+387 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+388 assert(mpidata_in.size()*procs <= mpidata_out.size());\n+389 int outlen = mpidata_in.size();\n+390 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),\n+391 mpidata_out.ptr(), outlen, mpidata_out.type(),\n+392 communicator, &future.req_);\n+393 return future;\n+394 }\n+395\n+397 template\n+_\b3_\b9_\b8 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+399 {\n+400 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+401 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+402 communicator);\n+403 }\n+404\n+406 template\n+_\b4_\b0_\b7 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type* inout, int len) const\n+408 {\n+409 Type* out = new Type[len];\n+410 int ret = allreduce(inout,out,len);\n+411 std::copy(out, out+len, inout);\n+412 delete[] out;\n+413 return ret;\n+414 }\n+415\n+416 template\n+_\b4_\b1_\b7 Type _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(Type&& in) const{\n+418 Type lvalue_data = std::forward(in);\n+419 auto data = _\bg_\be_\bt_\bM_\bP_\bI_\bD_\ba_\bt_\ba(lvalue_data);\n+420 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),\n+421 (_\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+422 communicator);\n+423 return lvalue_data;\n+424 }\n+425\n+427 template\n+_\b4_\b2_\b8 _\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+429 _\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+430 auto mpidata_in = future._\bg_\be_\bt_\b__\bs_\be_\bn_\bd_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+431 auto mpidata_out = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+432 assert(mpidata_out.size() == mpidata_in.size());\n+433 assert(mpidata_out.type() == mpidata_in.type());\n+434 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),\n+435 mpidata_out.size(), mpidata_out.type(),\n+436 (_\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+437 communicator, &future.req_);\n+438 return future;\n+439 }\n+440\n+442 template\n+_\b4_\b4_\b3 _\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+444 _\bM_\bP_\bI_\bF_\bu_\bt_\bu_\br_\be_\b<_\bT_\b> future(std::forward(data));\n+445 auto mpidata = future._\bg_\be_\bt_\b__\bm_\bp_\bi_\bd_\ba_\bt_\ba();\n+446 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),\n+447 mpidata.size(), mpidata.type(),\n+448 (_\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+449 communicator, &future.req_);\n+450 return future;\n+451 }\n+452\n+454 template\n+_\b4_\b5_\b5 int _\ba_\bl_\bl_\br_\be_\bd_\bu_\bc_\be(const Type* in, Type* out, int len) const\n+456 {\n+457 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+458 (_\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+459 }\n+460\n+461 private:\n+462 MPI_Comm communicator;\n+463 int me;\n+464 int procs;\n+465 };\n+466} // namespace dune\n+467\n+468#endif // HAVE_MPI\n+469\n+470#endif\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+_\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+_\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+_\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:_\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:43\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:_\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:259\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:398\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:250\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: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_\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:271\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< const T > isend(const 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:150\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:161\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:265\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: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:_\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:359\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:383\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:417\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:210\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:281\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:443\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:201\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:455\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:428\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:134\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:303\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:407\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:182\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:336\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:172\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:226\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:312\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: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:_\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:345\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:326\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:242\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:374\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:141\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:217\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:85\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:169\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:165\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/a00203.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00203.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: gmpfield.hh File Reference\n+dune-common: mpitraits.hh File Reference\n \n \n \n \n \n \n \n@@ -65,60 +65,51 @@\n
    \n
    \n
    \n
    \n \n \n
    \n
    \n \n-
    gmpfield.hh File Reference
    \n+
    mpitraits.hh File Reference
    \n
    \n
    \n \n-

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

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

    \n-
    #include <iostream>
    \n-#include <string>
    \n+
    #include <cstddef>
    \n+#include <cstdint>
    \n #include <type_traits>
    \n-#include <gmpxx.h>
    \n-#include <dune/common/promotiontraits.hh>
    \n-#include <dune/common/typetraits.hh>
    \n+#include <utility>
    \n+#include <complex>
    \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-\n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::GMPField< precision >
     Number class for high precision floating point number using the GMP library mpf_class implementation. More...
     
    struct  Dune::IsNumber< GMPField< precision > >
     
    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 > >
    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-

    Wrapper for the GNU multiprecision (GMP) library.

    \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 \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,40 +1,33 @@\n dune-common\u00a02.9.0\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-gmpfield.hh File Reference\n-Wrapper for the GNU multiprecision (GMP) library. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \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 <_\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+#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:_\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:_\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-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+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-Wrapper for the GNU multiprecision (GMP) library.\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/a00203_source.html", "source2": "./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-common: gmpfield.hh Source File\n+dune-common: mpitraits.hh Source File\n \n \n \n \n \n \n \n@@ -70,145 +70,218 @@\n
    \n
    \n
    \n
    \n \n \n